我在一个查询中创建多个关系。如果找不到第一个关系的匹配项,则不会创建第二个关系。如果两个匹配都存在,则两个关系都起作用。

例:

假设下面的“MATCH1ID”不存在,但“MATCH2ID”存在。为什么会这样?

不起作用

MERGE (NewRecord:OBJECTNAME { Id: 'ABZDEFG' })
SET NewRecord.name='NEWNAME'
WITH NewRecord
MATCH (a)
WHERE a.Id = 'MATCH1ID'
CREATE (a)-[ar:Relationship1]->(NewRecord)
WITH NewRecord MATCH (b)
WHERE b.Id = 'MATCH2ID'
CREATE (b)-[br:Relationship2]->(NewRecord)

(如果我将确实存在的节点的顺序按其工作顺序排在第一位)

作品
MERGE (NewRecord:OBJECTNAME { Id: 'ABZDEFG' })
SET NewRecord.name='NEWNAME'
WITH NewRecord
MATCH (b)
WHERE b.Id = 'MATCH2ID'
CREATE (b)-[br:Relationship2]->(NewRecord)
WITH NewRecord
MATCH (a)
WHERE a.Id = 'MATCH1ID'
CREATE (a)-[ar:Relationship1]->(NewRecord)

最佳答案

您可以尝试使用OPTIONAL MATCH而不是简单的MATCH:

MERGE (NewRecord:OBJECTNAME { Id: 'ABZDEFG' })
SET NewRecord.name='NEWNAME'
WITH NewRecord
OPTIONAL MATCH (a)
WHERE a.Id = 'MATCH1ID'

FOREACH(x IN (CASE WHEN a IS NULL THEN [] ELSE [1] END) |
    CREATE (a)-[ar:Relationship1]->(NewRecord)
)

WITH NewRecord
OPTIONAL MATCH (b)
WHERE b.Id = 'MATCH2ID'

FOREACH(x IN (CASE WHEN b IS NULL THEN [] ELSE [1] END) |
    CREATE (b)-[br:Relationship2]->(NewRecord)
)

另外,此查询使用带有FORACHCASE WHEN的技巧来处理条件。在这种情况下,仅当CREATEa变量不为null时才执行b语句。

参见Neo4j: LOAD CSV - Handling Conditionals

09-16 01:30