【问题标题】:Neo4j: Match multiple destination nodesNeo4j:匹配多个目标节点
【发布时间】:2014-09-19 17:40:07
【问题描述】:

如何高效地构造表单的查询:

匹配 (a)-[:Foo]->(b) WHERE (a)-[:Bar]->(c) AND (a)-[:Bar]->(d) 返回 a

这是一个查询

       [Foo]----(b)
(a)---|
       [Bar]----(c)
      |
       [Bar]----(d)

但是,我希望具有可变数量的具有关系 Bar 的目标节点(不仅仅是 c 和 d,而是任何节点列表)。

另一种说法:如果它与 [c,d,...] 节点列表具有 Bar 关系,则返回 'a'

目前我手动将 WHERE 子句连接到顶部,但我觉得有一种更性感的方式来做到这一点。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    是的,有一种更性感的方式。请参阅http://console.neo4j.org/r/8zx2l2 了解 Neo4j 控制台中的最小设置。我使用了以下密码查询:

    MATCH (a:A)-[:Foo]->(b)
    WITH a
    MATCH (a)-[:Bar]->(other)
    WITH a, count(other) AS count
    WHERE count=2
    RETURN a
    

    WHERE 条件检查路径数是否等于您的要求(此处假设为 2)。所以你只需要一个 where 检查。这够性感吗 ;-) ?

    附录

    如果您想确保other 节点位于给定的目标节点列表中:

    MATCH (a:A)-[:Foo]->(b)
    WITH a
    MATCH (a)-[:Bar]->(other)
    WITH a, count(other) AS count, collect(other) as others
    WHERE all(x in [c,d,....] WHERE x in others) 
    RETURN a
    

    这确保a 与数组[c,d,...] 中列出的所有节点具有Bar 关系。

    【讨论】:

    • 谢谢,但我需要特定的 c,d 节点来匹配,而不仅仅是任何具有 Bar 关系的节点。 IOW,如果它与 [c,d,...] 节点列表具有 Bar 关系,则返回 'a'。更多想法?
    • “WHERE all(... WHERE ... )” 语法正是我所需要的。谢谢!
    猜你喜欢
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    相关资源
    最近更新 更多