如何获得脱节子图中的所有节点 - neo4j / py2neo
How to get all nodes in a disjointed sub-graph - neo4j / py2neo
如果我有一个 neo4j 数据库并且我想查询以获取一个特定的不连续子图中的所有节点。 (在 py2neo 或 cypher 中)
如果我有节点组,每个组中的节点通过该组内的关系连接,但组之间不连接。我可以查询一个节点并获取该节点组中的所有节点吗?
如果您添加图表或一些示例数据,可能会有所帮助。但是,如果我正确理解您的数据模型,您是在将 "groups" 节点定义为通过某种关系连接的所有节点吗?因此,要获取 "group1" 节点的所有成员(让我们将其定义为通过 group1 关系连接的所有节点)而不是任何连接到 group2 的节点,您可以使用这样的查询:
MATCH (a:Person)-[:GROUP1]-(b:Person)
WHERE NOT exists((a)-[:GROUP2]-())
RETURN a
您还可以使用 Node labels 来定义节点组。
[更新]
原答案
如果“节点组”是指“不相交的子图”,这里是如何获取不相交子图中的所有节点(具有任何类型的关系),其中包含特定节点(例如,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
节点“相关”的节点,因此如果该节点没有关系,查询仍然能够 return一个结果。
两个(嵌套的)REDUCE
子句确保 returned 集合只有不同的节点。
外部 REDUCE
子句使用 n
节点初始化结果集合,因为它必须始终位于不相交的子图中,即使没有其他节点。
更好的答案
MATCH p=(n { name: "Neo" })-[r*0..]-(m)
WITH NODES(p) AS nodes
UNWIND nodes AS node
RETURN DISTINCT node
这个更简单的查询(returns 节点行)使用 [r*0..]
允许长度为 0 的路径(即,n
不需要有任何关系——并且 m
可以与 n
相同)。它使用 UNWIND
将 nodes
个节点集合转换为行,然后使用 DISTINCT
消除重复项。
备用解决方案(由于错误,目前还不能使用)
下面的替代解决方案(returns 节点行)也应该有效,除了当前存在一个错误 (that I just reported) 会导致在查询展开后忘记所有标识符a NULL
(这可能发生,例如,如果 OPTIONAL MATCH
找不到匹配项)。由于这个错误,如果 Neo
节点没有关系,下面的查询目前 return 没有结果。因此,在错误修复之前,您必须使用上面的查询。
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;
如果我有一个 neo4j 数据库并且我想查询以获取一个特定的不连续子图中的所有节点。 (在 py2neo 或 cypher 中)
如果我有节点组,每个组中的节点通过该组内的关系连接,但组之间不连接。我可以查询一个节点并获取该节点组中的所有节点吗?
如果您添加图表或一些示例数据,可能会有所帮助。但是,如果我正确理解您的数据模型,您是在将 "groups" 节点定义为通过某种关系连接的所有节点吗?因此,要获取 "group1" 节点的所有成员(让我们将其定义为通过 group1 关系连接的所有节点)而不是任何连接到 group2 的节点,您可以使用这样的查询:
MATCH (a:Person)-[:GROUP1]-(b:Person)
WHERE NOT exists((a)-[:GROUP2]-())
RETURN a
您还可以使用 Node labels 来定义节点组。
[更新]
原答案
如果“节点组”是指“不相交的子图”,这里是如何获取不相交子图中的所有节点(具有任何类型的关系),其中包含特定节点(例如,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
节点“相关”的节点,因此如果该节点没有关系,查询仍然能够 return一个结果。
两个(嵌套的)REDUCE
子句确保 returned 集合只有不同的节点。
外部 REDUCE
子句使用 n
节点初始化结果集合,因为它必须始终位于不相交的子图中,即使没有其他节点。
更好的答案
MATCH p=(n { name: "Neo" })-[r*0..]-(m)
WITH NODES(p) AS nodes
UNWIND nodes AS node
RETURN DISTINCT node
这个更简单的查询(returns 节点行)使用 [r*0..]
允许长度为 0 的路径(即,n
不需要有任何关系——并且 m
可以与 n
相同)。它使用 UNWIND
将 nodes
个节点集合转换为行,然后使用 DISTINCT
消除重复项。
备用解决方案(由于错误,目前还不能使用)
下面的替代解决方案(returns 节点行)也应该有效,除了当前存在一个错误 (that I just reported) 会导致在查询展开后忘记所有标识符a NULL
(这可能发生,例如,如果 OPTIONAL MATCH
找不到匹配项)。由于这个错误,如果 Neo
节点没有关系,下面的查询目前 return 没有结果。因此,在错误修复之前,您必须使用上面的查询。
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;