如果存在结束节点,则创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 UNIQUE
和MERGE
,但是如果它不存在,它们似乎都会创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
。