首页 文章

如何在一个脱节的子图中获取所有节点 - neo4j / py2neo

提问于
浏览
1

如果我有一个neo4j数据库,我想查询以获取一个特定的脱节子图中的所有节点 . (在py2neo或cypher中)

如果我有节点组,则每个组中的节点按该组内的关系连接,但不在组之间连接 . 我可以查询一个节点并获取该节点组中的所有节点吗?

2 回答

  • 1

    如果您添加了图表或一些示例数据,它可能会有所帮助 . 但是,如果我正确理解您的数据模型,那么您将节点的“组”定义为通过某种关系连接的所有节点?因此,要获取“group1”节点的所有成员(让我们将其定义为通过group1关系连接的所有节点)而不是任何连接到group2的节点,您可以使用如下查询:

    MATCH (a:Person)-[:GROUP1]-(b:Person)
    WHERE NOT exists((a)-[:GROUP2]-())
    RETURN a
    

    您还可以使用Node labels来定义节点组 .

  • 1

    [更新]

    原始答案

    如果通过"group of nodes"表示"disjoint subgraph",则以下是如何获取包含特定节点(例如, Neo 节点)的不相交子图(具有任何类型的关系)中的所有节点:

    MATCH (n { name: "Neo" })
    OPTIONAL MATCH p=(n)-[*]-(m)
    RETURN REDUCE(s = [n], x IN COLLECT(NODES(p)) |
      REDUCE(t = s, y IN x | CASE WHEN y IN t THEN t ELSE t + y END )) AS nodes;
    

    此查询使用 OPTIONAL MATCH 查找 Neo 节点的节点"related",这样如果该节点没有关系,查询仍然可以返回结果 .

    这两个(嵌套的) REDUCE 子句确保返回的集合只有不同的节点 .

    外部 REDUCE 子句使用 n 节点初始化结果集合,因为它必须始终位于不相交的子图中,即使没有其他节点也是如此 .

    更好的答案

    MATCH p=(n { name: "Neo" })-[r*0..]-(m)
    WITH NODES(p) AS nodes
    UNWIND nodes AS node
    RETURN DISTINCT node
    

    这个更简单的查询(返回节点行)使用 [r*0..] 来允许0长度路径(即, n 不需要任何关系 - 并且 m 可以与 n 相同) . 它使用 UNWINDnodes 节点集合转换为行,然后使用 DISTINCT 消除重复项 .

    替代解决方案(由于错误,尚未使用)

    下面的这个替代解决方案(返回节点行)也应该有效,除了当前存在一个错误(that I just reported)导致查询解除 NULL 之后忘记所有标识符(例如,如果 OPTIONAL MATCH 失败,可能会发生这种错误)找到一个匹配) . 由于此错误,如果 Neo 节点没有关系,则下面的查询当前不返回任何结果 . 因此,您必须使用上面的查询,直到修复错误 .

    MATCH (n { name: "Neo" })
    OPTIONAL MATCH p=(n)-[*]-(m)
    WITH n, NODES(p) AS nodes
    UNWIND nodes AS node
    RETURN DISTINCT (
      CASE
      WHEN node IS NULL THEN n
      ELSE node END ) AS res;
    

相关问题