我想编写一个Cypher语句来测试路径是否存在,如果该部分不存在则添加它。
考虑路径(:A)-[:REL]->(:B{id:123})
,然后可以通过
OPTIONAL MATCH p = (:A)-[:REL]->(:B{id:123}) RETURN CASE COUNT(p) WHEN 0 THEN false ELSE true END
如果路径不存在,则返回false;如果存在,则返回true。
可以通过
创建路径 CREATE (b:B{id:123}), (b)<-[:REL]-(:A)
但是,如果将这些语句组合在一起,那么如果缺少路径然后创建它,则Cypher会生成语法错误
OPTIONAL MATCH p = (:A)-[:REL]->(:B{id:123}) RETURN CASE COUNT(p) WHEN 0 THEN CREATE (b:B{id:123}), (b)<-[:REL]-(:A) END
是否有正确的方法来执行路径的原子创建?
答案 0 :(得分:1)
您实际上可以使用MERGE
语句,而不是尝试询问节点是否在那里。
如果节点和关系尚不存在,则该语句将创建节点和关系,如果节点和关系已经存在,则不会创建它们。
MERGE (b:B {id:123} )<-[:REL]-(:A)
return *