密码可选匹配
Cypher Optional Match
我有一个图表,其中包含两种类型的节点(对象和片段)和两种类型的链接(similarTo 和包含)。有些作品是由作品组成的。
我想从一组对象中提取每个片段的路径。
MATCH (o:Object)
WITH o
OPTIONAL MATCH path = (p:Piece) <-[:contains*]- (o) -[:similarTo]- (:Object)
RETURN path
以上查询只是returns的部分片段。在 returned 图中,一些对象不直接连接到任何部分,后者不是 returned,尽管它们实际上连接!
我可以将查询更改为:
MATCH (o:Object) -[:contains*]-> (p:Piece)
OPTIONAL MATCH (o) –[:similarTo]- (:Object)
但是,我没有设法 return 该查询的整个路径,我需要 return 节点和链接的集合:
WITH rels(path) as relations , nodes(path) as nodes
UNWIND relations as r unwind nodes as n
RETURN {nodes: collect(distinct n), links: collect(distinct {source: id(startNode(r)), target: id(endNode(r))})}
如果有任何建议,我将不胜感激。
这样的事情会成功吗?
我在这里创建了一个代表对象和片段的小图:http://console.neo4j.org/r/abztz4
使用 UNION ALL
执行不同的查询
在这里,您将在一组路径中组合这两个用例:
MATCH (o:Object)
WITH o
OPTIONAL MATCH p=(o)-[:CONTAINS]->(piece)
RETURN p
UNION ALL
MATCH (o:Object)
WITH o
OPTIONAL MATCH p=(o)-[:SIMILAR_TO]-()-[:CONTAINS]->(piece)
RETURN p
我有一个图表,其中包含两种类型的节点(对象和片段)和两种类型的链接(similarTo 和包含)。有些作品是由作品组成的。
我想从一组对象中提取每个片段的路径。
MATCH (o:Object)
WITH o
OPTIONAL MATCH path = (p:Piece) <-[:contains*]- (o) -[:similarTo]- (:Object)
RETURN path
以上查询只是returns的部分片段。在 returned 图中,一些对象不直接连接到任何部分,后者不是 returned,尽管它们实际上连接!
我可以将查询更改为:
MATCH (o:Object) -[:contains*]-> (p:Piece)
OPTIONAL MATCH (o) –[:similarTo]- (:Object)
但是,我没有设法 return 该查询的整个路径,我需要 return 节点和链接的集合:
WITH rels(path) as relations , nodes(path) as nodes
UNWIND relations as r unwind nodes as n
RETURN {nodes: collect(distinct n), links: collect(distinct {source: id(startNode(r)), target: id(endNode(r))})}
如果有任何建议,我将不胜感激。
这样的事情会成功吗?
我在这里创建了一个代表对象和片段的小图:http://console.neo4j.org/r/abztz4
使用 UNION ALL
在这里,您将在一组路径中组合这两个用例:
MATCH (o:Object)
WITH o
OPTIONAL MATCH p=(o)-[:CONTAINS]->(piece)
RETURN p
UNION ALL
MATCH (o:Object)
WITH o
OPTIONAL MATCH p=(o)-[:SIMILAR_TO]-()-[:CONTAINS]->(piece)
RETURN p