【问题标题】:How to get all nodes in a disjointed sub-graph - neo4j / py2neo如何获取脱节子图中的所有节点 - neo4j / py2neo
【发布时间】:2015-11-05 16:29:18
【问题描述】:

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

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

【问题讨论】:

  • 您在寻找连接的组件吗?你的图形模型是什么样子的?

标签: python neo4j py2neo


【解决方案1】:

[更新]

原答案

如果“节点组”是指“不相交的子图”,您可以通过以下方式获取包含特定节点(例如,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 节点“相关”的节点,因此如果该节点没有关系,查询仍然能够返回结果。

两个(嵌套的)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;

【讨论】:

    【解决方案2】:

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

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

    您也可以使用Node labels 来定义节点组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-13
      • 1970-01-01
      • 2017-12-15
      相关资源
      最近更新 更多