Neo4j 可选关系匹配

Neo4j Optional Relationship Match

我想编写一个查询,其中 return 有一个节点 (a)、与其直接相邻的节点 (b),然后是连接到 (b) 的所有节点,但不包括那些连接到它的节点已经确定为(b).

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

      d
     /
a<--b
     \
      c

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