Cypher可选配对

时间:2015-01-25 18:34:15

标签: neo4j cypher

我有一个图表,其中包含两种类型的节点(对象和片段)和两种类型的链接(similarTo和contains)。有些作品是由碎片制成的。

我想从一组对象开始提取每个部分的路径。

MATCH (o:Object)
WITH o
OPTIONAL MATCH path = (p:Piece) <-[:contains*]- (o) -[:similarTo]- (:Object)
RETURN path

以上查询仅返回部分内容。在返回的图表中,有些对象不会直接连接到任何部分,后者不会返回,尽管它们实际上都是这样!

我可以将查询更改为:

MATCH (o:Object) -[:contains*]-> (p:Piece) 
OPTIONAL MATCH (o) –[:similarTo]- (:Object) 

但是,我没有设法返回该查询的整个路径,我需要返回节点和链接的集合:

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))})}

我很感激任何建议。

1 个答案:

答案 0 :(得分:4)

这样的事情能做到吗?

我在这里创建了一个表示对象和碎片的小图: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