Neo4j可选关系匹配

时间:2015-04-14 17:20:34

标签: neo4j

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

所以...如果我的图表是:

      d
     /
a<--b
     \
      c

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

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

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)

有任何方法可以获得预期的结果吗?

1 个答案:

答案 0 :(得分:2)

当我运行以下查询时:

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]<-(b)不应出现在那里,只有(b)<-[:something*0..]<-(c)