Neo4j可选关系匹配

我想写一个返回节点(a)的查询,与它直接相邻的节点(b),然后是连接到(b)的所有节点,但不是那些已经被标识为(b)的节点.

所以…如果我的图表是:

      d
     /
a<--b
     \
      c

我想返回{a,[b],[c,d]}.

到目前为止,我有以下查询(‘prop’属性区分每个节点):

MATCH (a)<-[:something]-(b)<-[:something*0..]<-(c)
WHERE NOT (c.prop IN b.prop)
RETURN a.prop, collect(b.prop), collect (c.prop)

如果我的图表如下:

a<--b

我希望结果是{a,[b],[]}但是我没有得到任何回报,很可能是因为c.prop在b.prop中.我尝试使用OPTIONAL MATCH,但这也不起作用:

MATCH (a)<-[:something]-(b)
OPTIONAL MATCH (a)<-[:something]<-(b)<-[:something*0..]<-(c)
WHERE NOT (c.prop IN b.prop)
RETURN a.prop, collect(b.prop), collect (c.prop)

有没有办法得到预期的结果?

最佳答案 当我运行以下查询时:

MATCH (n:Crew)-[r:LOVES*]->m
OPTIONAL MATCH (m:Crew)-[r2:KNOWS*]->o
WHERE n.name='Neo' AND NOT (o.name IN m.name)
RETURN n,m,o

http://console.neo4j.org/,在样本图上,我得到了Neo和Trinity,尽管Trinity知道没有人(o是空的).我认为OPTIONAL MATCH只需要包含遍历的实际可选部分,而在代码中你拥有一切. (a)< – [:something]&lt ;-(b)不应该出现在那里,只有(b)< – [:something * 0 ..]&lt ;-(c)

点赞