Neo4j Cypher - 合并列并从所有列中获取不同的值
Neo4j Cypher - merge columns and get distinct values from all
我有一个复杂的查询,我正在尝试使用 OPTIONAL MATCH
语句。它看起来像这样:
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
的列,而不是获取 target1
、target2
、target3
和 target4
返回作为单独的列。
有没有办法 collect/unwind 四个潜在目标列 return 它们作为单个列结果集?
我知道我可以使用 UNION
四个单独的查询来获得所需的结果,return 一个名为 target 的值,但我想知道是否有更好的方法。
谢谢。
是的,这是可能的,而且您的方向是正确的。下面是一个使用 collect 和 unwind 来执行此操作的示例:
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
请注意,您应该能够将 :MANAGES 和 :SUPPORTS 可选匹配折叠成单个 [:MANAGES|SUPPORTS] 关系,因为路径的其余部分是相同的。
我有一个复杂的查询,我正在尝试使用 OPTIONAL MATCH
语句。它看起来像这样:
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
的列,而不是获取 target1
、target2
、target3
和 target4
返回作为单独的列。
有没有办法 collect/unwind 四个潜在目标列 return 它们作为单个列结果集?
我知道我可以使用 UNION
四个单独的查询来获得所需的结果,return 一个名为 target 的值,但我想知道是否有更好的方法。
谢谢。
是的,这是可能的,而且您的方向是正确的。下面是一个使用 collect 和 unwind 来执行此操作的示例:
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
请注意,您应该能够将 :MANAGES 和 :SUPPORTS 可选匹配折叠成单个 [:MANAGES|SUPPORTS] 关系,因为路径的其余部分是相同的。