2015-04-27 30 views
0

我想编写一个测试存在路径的单个Cypher语句,如果该部分不存在,则添加它。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测试,如果路径不存在,或真如果这样做。

的路径可以通过

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

有没有正确的方法来执行此路径的原子创建?

回答

1

您实际上可以使用MERGE语句,而不是试图询问节点是否在第一位。

此语句将创建节点和关系(如果它尚不存在,并且不会在已经存在的情况下创建它)。

MERGE (b:B {id:123})<-[:REL]-(:A) 
return * 
+0

谢谢 - 阅读说明书! [merge](http://neo4j.com/docs/stable/query-merge.html) – Geoff

+0

一旦有人知道要搜索的魔语,RTM很容易... –

相关问题