【问题标题】:Neo4j query for getting multiple connected nodes用于获取多个连接节点的 Neo4j 查询
【发布时间】:2023-02-15 13:28:12
【问题描述】:

在我的图中,我想获得某个节点的一级、二级和三级邻居。如果我的图表是A -> B -> C -> D -> E,那么

  • C的一级邻居是B
  • C的二级邻居是A
  • C 的三级邻居为无

检查邻居时,我沿边缘的相反方向前进。为了获取这些节点,我编写了以下查询。

MATCH (changedNode: Function) WHERE changedNode.signature IN [...]
MATCH (neig1: Function)-[:CALLS]->(changedNode)
MATCH (neig2: Function)-[:CALLS]->(neig1)
MATCH (neig3: Function)-[:CALLS]->(neig2)
RETURN DISTINCT neig1.functionName, neig2.functionName,  neig3.functionName

我意识到这段代码不会将 B 作为 C 的一级邻居返回,因为 A 没有任何邻居(neig3 为空)。换句话说,这个查询需要一个节点有一个三度邻居。我明白这一点,但无法更新我的代码。我应该如何修改我的查询?

【问题讨论】:

    标签: neo4j cypher memgraphdb opencypher


    【解决方案1】:

    您可以使用可选匹配,因为 A 可能没有邻居。然后查询将为 neigh3 返回空值。

    MATCH (changedNode: Function) WHERE changedNode.signature IN [...]
    MATCH (neig1: Function)-[:CALLS]->(changedNode)
    OPTIONAL MATCH (neig2: Function)-[:CALLS]->(neig1)
    OPTIONAL MATCH (neig3: Function)-[:CALLS]->(neig2)
    RETURN DISTINCT neig1.functionName, neig2.functionName,  neig3.functionName
    

    【讨论】:

      【解决方案2】:

      用于可选匹配将模式与图形数据库进行匹配,就像 MATCH 一样。不同之处在于,如果未找到匹配项,则 OPTIONAL MATCH 将对模式的缺失部分使用 null。 OPTIONAL MATCH 可以被认为是 SQL 中外连接的 Cypher 等价物。

      MATCH (changedNode: Function) WHERE changedNode.signature IN [...]
      MATCH (neig1: Function)-[:CALLS]->(changedNode)
      OPTIONAL MATCH (neig2: Function)-[:CALLS]->(neig1)
      OPTIONAL MATCH (neig3: Function)-[:CALLS]->(neig2)
      RETURN DISTINCT neig1.functionName, neig2.functionName, neig3.functionName
      

      更多解释请访问:https://neo4j.com/developer/kb/a-note-on-optional-matches/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-04
        • 2015-08-21
        • 2017-07-03
        • 2017-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多