2016-08-01 156 views
0

我有一个复杂的查询,我正在尝试使用OPTIONAL MATCH语句。它看起来像这样:Neo4j Cypher - 合并列并获得所有不同的值

MATCH (p:Person {name:'Victoria'}) 
OPTIONAL MATCH (p)-[:MANAGES]->(:Office)<-[MERGES_INTO*0..]-(:Office)<-[:WORKS_WITH]-(target1) 
OPTIONAL MATCH (p)-[:SUPPORTS]->(:Office)<-[MERGES_INTO*0..]-(:Office)<-[:WORKS_WITH]-(target2) 
OPTIONAL MATCH (p)-[:ASSISTS]->(:Person)-[*0..1]->(:Group)<--(target3) 
OPTIONAL MATCH (p)-->(:Group)<--(target4) 
RETURN DISTINCT target1,target2,target3,target4 

我想要做的就是结果,如果他们叫target而不是让target1target2target3target4回到作为单独列一列。

有没有办法收集/展开四个潜在的目标列,将它们作为单列结果集返回?

我知道我可以使用返回值为target的四个独立查询的UNION来获得期望的结果,但我想知道是否有更好的方法。

谢谢。

回答

0

是的,这是可能的,你在正确的轨道上。下面是使用收集和放松做一个这样的例子:

MATCH (p:Person {name:'Victoria'}) 
OPTIONAL MATCH (p)-[:MANAGES]->(:Office)<-[:MERGES_INTO*0..]-(:Office)<-[:WORKS_WITH]-(target1) 
WITH p, COLLECT(target1) as target1s 
OPTIONAL MATCH (p)-[:SUPPORTS]->(:Office)<-[:MERGES_INTO*0..]-(:Office)<-[:WORKS_WITH]-(target2) 
WITH p, target1s, COLLECT(target2) as target2s 
OPTIONAL MATCH (p)-[:ASSISTS]->(:Person)-[*0..1]->(:Group)<--(target3) 
WITH p, target1s, target2s, COLLECT(target3) as target3s 
OPTIONAL MATCH (p)-->(:Group)<--(target4) 
WITH target1s + target2s + target3s + COLLECT(target4) AS targets 
UNWIND targets AS target 
RETURN DISTINCT target 

请注意,您应该能够折叠:管理和:支持可选的匹配到一个单一的[:管理|技术支持]的关系,为的休息路径是一样的。

+0

这正是我需要处理'collect'和'with'所需的例子。非常感谢。 –