【问题标题】:Retrieve relationships between child nodes using neo4j cypher使用 neo4j 密码检索子节点之间的关系
【发布时间】:2019-10-09 08:03:23
【问题描述】:

当我在 neo4j 浏览器中运行此查询时,我有以下网络结果:

MATCH (n1:Item {name: 'A'})-[r]-(n2:Item) Return n1,r,n2

图表底部显示:Displaying 6 nodes, 7 relationships。 但是当我在neo4j浏览器中查看表格时,我只有5条记录

n1,r,n2
A,A->B,B
A,A->C,C
A,A->D,D
A,A->E,E
A,A->F,F

所以在 java 代码中,当我使用下面的代码获取记录列表时:

List<Record> records = session.run(query).list();

我只得到 5 条记录,所以我只得到 5 条关系。 但我想获得所有 7 种关系,包括以下 2 种:

B->C
C->F

如何使用密码查询来实现这一点?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    这应该可行:

    MATCH (n:Item {name: 'A'})-[r1]-(n2:Item)
    WITH n, COLLECT(r1) AS rs, COLLECT(n2) as others
    UNWIND others AS n2
    OPTIONAL MATCH (n2)-[r2]-(x)
    WHERE x IN others
    RETURN n, others, rs + COLLECT(r2) AS rs
    

    与@FrantišekHartman 的第一种方法不同,此查询使用UNWINDn2(未在WITH 子句中指定,因此变为未绑定)绑定到MATCH 子句中的相同n2 节点.此查询还将所有关系合并到一个 rs 列表中。

    【讨论】:

      【解决方案2】:

      有很多方法可以实现这一点。一种方法是遍历到第二层并检查第二层节点是否也在第一层

      MATCH (n1:Item {name: 'A'})-[r]-(n2:Item)
      WITH n1,collect(r) AS firstRels,collect(n2) AS firstNodes
      OPTIONAL MATCH (n2)-[r2]-(n3:Item)
      WHERE n3 IN firstNodes
      RETURN n1,firstRels,firstNodes,collect(r2) as secondRels
      

      或者你可以在第一级节点之间做一个笛卡尔积并匹配:

      MATCH (n1:Item {name: 'A'})-[r]-(n2:Item)
      WITH n1,collect(r) AS firstRels,collect(n2) as firstNodes
      UNWIND firstNodes AS x
      UNWIND firstNodes AS y
      OPTIONAL MATCH (x)-[r2]-(y)
      RETURN n1,firstRels,firstNodes,collect(r2) as secondRels
      

      根据 firstNodes 和 secondRels 的基数以及其他现有关系,一个可能比另一个快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-19
        • 2015-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多