【问题标题】:Specifying constraint on all nodes of a variable length relationship using Cypher使用 Cypher 在可变长度关系的所有节点上指定约束
【发布时间】:2014-01-19 08:43:31
【问题描述】:

我在 Neo4j 数据库中有 java 类和模块作为节点。它们之间有两种关系:类可以依赖于其他类,模块可以包含类。我想创建一个查询来检索其模块中类的所有传递依赖项。

我正在尝试这个查询:

MATCH (startNode:Class {name:"x.y.Foo"})-[*:DEPENDS_ON]->
      (c:Class)<-[:CONTAINS]-(:Module { name :"container"}) return c;

问题在于它检索container 中的类,这些类可以通过container 之外的类从x.y.Foo 开始访问。这不仅不正确,而且非常缓慢。是否可以在 Cypher 中表达我想要的内容?

节点数为 11575,关系数为 65215,我使用的是 Neo4j 2.0.0。

【问题讨论】:

    标签: neo4j


    【解决方案1】:

    你可以这样做:

    MATCH p=(startNode:Class {name:"x.y.Foo"})-[*:DEPENDS_ON]->
          (c:Class)<-[:CONTAINS]-(m:Module { name :"container"}) 
    WHERE ALL( n IN nodes(p)[1..-2] WHERE (n)<-[:CONTAINS]-(m))
    RETURN c;
    

    另一种选择是用模块标记它们作为标签,这样检查会更有效率。

    MATCH p=(startNode:Class {name:"x.y.Foo"})-[*:DEPENDS_ON]->
          (c:Class:`module:container`)<-[:CONTAINS]-(m:Module { name :"container"}) 
    WHERE ALL( n IN nodes(p)[1..-2] WHERE (n:`module:container`))
    RETURN c;
    

    如果您对解决此问题的更多工作感兴趣,请查看此blog post。

    【讨论】:

    • 查询不想完成...我认为我的数据库有些“错误”,因为没有查询在合理的时间内完成,其中包含无限的可变长度关系,即使起始节点也是如此是一个不存在的类。
    猜你喜欢
    • 2023-01-22
    • 2020-09-14
    • 2022-12-12
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    相关资源
    最近更新 更多