【问题标题】:Neo4j Cypher - merge columns and get distinct values from allNeo4j Cypher - 合并列并从所有列中获取不同的值
【发布时间】:2016-08-02 03:42:06
【问题描述】:

我有一个复杂的查询,我正在尝试使用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 的列而不是将target1target2target3target4 作为单独的列返回。

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

我知道我可以使用四个单独查询的UNION 来获得所需的结果,这些查询返回一个名为 target 的值,但我想知道是否有更好的方法。

谢谢。

【问题讨论】:

    标签: neo4j cypher graph-databases


    【解决方案1】:

    是的,这是可能的,而且您走在正确的轨道上。这是一个使用 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] 关系,因为路径的其余部分是相同的。

    【讨论】:

    • 这正是我需要处理collectwith 的示例。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    相关资源
    最近更新 更多