2014-01-12 35 views
0

我想知道将新创建的节点连接到可能存在或不存在的其他节点的正确方法。基本上,CREATE A如果B存在,则将B连接到A并返回A.如果B不存在,则返回A.在Neo4j 2.0中将可选节点与Cypher查询连接起来

这是我的Cypher查询(额外的WITH子句是因为这是更大的查询的一部分我试图以确保此示例代码的工作方式相同):

CREATE (a:A { foo: "bar" }) 
WITH a 

OPTIONAL MATCH (b:B) 
WHERE a.foo = b.foo 
CREATE UNIQUE b-[:LINK]->a 
WITH a 

RETURN a 

这不会起作用,因为CREATE由于b是空的唯一失败。除了将其分解为多个查询之外,是否有办法实现这一点?

回答

2

我认为你需要用foreach破解它...

CREATE (a:A { foo: "bar" }) 
WITH a 

OPTIONAL MATCH (b:B) 
WHERE a.foo = b.foo 
WITH a, collect(b) as bs 
FOREACH(b in bs | CREATE UNIQUE b-[:LINK]->a) 
WITH a 

RETURN a 
+0

就像一个魅力。试图使用FOREACH,但它抱怨NULL不是正确的类型。对我来说没有发生收集(NULL)会做的伎俩。 – Bill

+0

如果在可选匹配中有很多匹配值可能不那么急切/更懒惰,那么也可以'b'作为bs'。 –

+0

因此,如果b是一个集合,我[b]它不会成为集合的集合? – Bill