在此similar question的基础上,我希望以最高效的方式处理这种情况。
MERGE (n1{id:<uuid>})
SET n1.topicID = <unique_name1>
IF (EXISTS((a:Topic{id:<unique_name1>})) | CREATE UNIQUE (n1)-[:HAS]->(a))
MERGE (n2{id:<uuid>})
SET n2.topicID = <unique_name2>
IF (EXISTS((a:Topic{id:<unique_name2>})) | CREATE UNIQUE (n2)-[:HAS]->(a))
不幸的是,IF不存在,并且EXISTS不能用于匹配或找到唯一的节点。
我现在拥有的最佳解决方案是
MERGE (a:TEST{id:1})
WITH a
OPTIONAL MATCH (b:TEST{id:2})
// collect b so that there are no nulls, and rows aren't lost when no match
WITH a, collect(b) AS c
FOREACH(n IN c | CREATE UNIQUE (a)-[:HAS]->(n))
RETURN a
然而,这似乎有点复杂,需要2 WITH
s才能实现CREATE UNIQUE RELATION if start and end node exist
(并且在计划中有一个渴望)。有可能做得更好吗? (使用Cypher 3.1)
答案 0 :(得分:1)
你可以简化一下:
MERGE (a:TEST{id:1})
WITH a
MATCH (b:TEST{id:2})
CREATE UNIQUE (a)-[:HAS]->(b)
RETURN a;
(单个)WITH
子句用于将查询拆分为2&#34;子查询&#34;。
因此,如果MATCH
子查询失败,它只会中止自己的子查询(以及任何后续子查询),但不会回滚先前成功的MERGE
子查询。
但请注意,只要最终的子查询失败,RETURN
子句就不会返回任何内容。您必须确定这是否可以接受。
因为上面的RETURN
子句只会在b
存在时返回一些内容,所以返回b
或路径可能更有意义。以下是后者的示例(即使路径已经存在,p
也将被赋值:
MERGE (a:TEST{id:1})
WITH a
MATCH (b:TEST{id:2})
CREATE UNIQUE p=(a)-[:HAS]->(b)
RETURN p;