2017-09-05 28 views
3

我正在一个查询中创建多个关系。如果找不到第一个关系的匹配,则不创建第二个关系。如果两个匹配都存在,那么这两个关系都有效Neo4j:创建多个关系不起作用

实施例:

假定 '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) 

(如果我切换确实存在是先在它工作的顺序节点的顺序)

WORKS

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) 

回答

1

您可以尝试使用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处理条件。在这种情况下,CREATE语句仅在ab变量不为空时执行。

请参阅Neo4j: LOAD CSV - Handling Conditionals