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)
我想编写一个查询,其中 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)