如果存在结束节点,则创build节点和关系(否则仅创build第一个节点)

我有一个应用程序通过消息队列发送数据库写入命令给工作人员(量很大),所以不能保证它们将被接收的顺序。

我有两个节点,例如,“帐户”和“媒体”。 在这个假设的应用程序中,用户可以匿名上传媒体,这会自动为他们创build一个帐户,然后他们可以随后将其关联。

两个信息,一个用于帐户,另一个用于媒体(几乎可以肯定地由不同的工作人员)。 他们两个都不知道对方是否写下来。 我需要写一个将在每个工人上运行的查询,其中:

  • 创build新的帐户/媒体
  • 如果其他节点存在, POSTED_BY两者之间创buildPOSTED_BY关系
  • 如果其他节点不存在,则只创build当前节点
  • 返回新创build的节点

因此,无论接收到每条消息的顺序如何,第一个查询都将创build节点A,而第二个查询将创build节点B +关系。

如果我在同一个查询中创build它们,那将很简单:

 CREATE (m:Media { url: 'xyz.jpg' })-[:POSTED_BY]->(u:Account { username: 'johndoe' }) RETURN m,u 

我已经看了CREATE UNIQUEMERGE ,但是如果它不存在,它们似乎都会创build节点,而不是只是无所事事。

我想你想用MERGE这个操作。 实际上,不是一次创build一个节点,而是创build节点和关系,然后使用其他属性更新特定节点。

考虑消息一是媒体消息

 MERGE (m:Media { url: 'xyz.jpg' }) SET m =+ {media_props} MERGE (u:Account { username: 'johndoe' }) MERGE (m)-[:POSTED_BY]->(u) RETURN m 

考虑消息二是新的用户帐户消息

 MERGE (u:Account { username: 'johndoe' }) SET u =+ {user_props} MERGE (m:Media { url: 'xyz.jpg' }) MERGE (m)-[:POSTED_BY]->(u) RETURN u 

你可以想象,通过MERGE分别创build每个节点,并有关系的第三个消息。 该模式将是相同的,但不会在任何节点上设置任何其他属性。

例如…

 // message 1 // create the media node MERGE (m:Media { url: 'xyz.jpg' }) SET m =+ {media_props} RETURN m // message 2 // create the user/account node MERGE (u:Account { username: 'johndoe' }) SET u =+ {user_props} // message 3 // create the relationship MERGE (u:Account { username: 'johndoe' }) MERGE (m:Media { url: 'xyz.jpg' }) MERGE (m)-[r:POSTED_BY]->(u) RETURN m,r,u 

请注意,所有解决scheme都假定在合并语句中标识媒体和帐户的密钥是唯一的。

我知道答案已经被接受,但并不觉得它实际上回答了这个问题,

如果其他节点不存在,则只创build当前节点

这可以通过以下来实现:

 CREATE (m:Media { url: 'xyz.jpg' }) WITH m MATCH(u:Account { username: 'johndoe' }) CREATE(m)-[r:POSTED_BY]->(u)" RETURN m 

不幸的是,如果比赛成功,这只会返回m