Neo4j Cypher 找到两个不相交的节点
Neo4j Cypher find two disjoint nodes
我正在使用 Neo4j 尝试查找未连接到特定节点的任何节点 "a"。到目前为止我的查询是:
MATCH p = shortestPath((a:Node {id:"123"})-[*]-(b:Node))
WHERE p IS NULL
RETURN b.id as b
所以它试图找到a和b之间的最短路径。如果它没有找到路径,那么它 returns 该节点的 id。但是,这会导致我的查询 运行 几分钟,然后在 运行 内存不足时崩溃。我想知道这种方法是否有效,是否有更有效的方法?任何帮助将不胜感激!
编辑:
MATCH (a:Node {id:"123"})-[*]-(b:Node),
(c:Node)
WITH collect(b) as col, a, b, c
WHERE a <> b AND NOT c IN col
RETURN c.id
所以 col (collect(b)) 包含连接到 a 的每个节点,因此如果 c 不在 col 中那么 c 就没有连接到 a?
首先,您给这个 MATCH 一个不可能实现的谓词,因此它永远找不到最短路径。
WHERE 子句与 MATCH、OPTIONAL MATCH 和 WITH 子句相关联,因此您的查询要求路径不存在的最短路径。那永远不会 return 任何东西。
此外,最短路径将从您不想连接的节点开始,因此无法找到未连接到它的节点。
可能最简单的方法是 MATCH 到连接到您的相关节点的所有节点,然后 MATCH 到所有 :Nodes 检查那些不在连接集中的节点。这意味着您不必从数据库中的每个节点执行最短路径,只需在集合中进行成员资格检查。
为此您需要 APOC Procedures,因为它可以最快地匹配子图中的节点。
MATCH (a:Node {id:"123"})
CALL apoc.path.subgraphNodes(a, {}) YIELD node
WITH collect(node) as subgraph
MATCH (b:Node)
WHERE NOT b in subgraph
RETURN b.id as b
编辑
您编辑的查询可能会失败,这将生成一个巨大的结果集(该查询将构建一个结果集,其中包含从您的起始节点可以通过笛卡尔积中的唯一路径到达的每个节点,每个 :Node ).
相反,一步一步地收集不同的节点(因为否则你会得到多个可以通过不同路径到达的相同节点),然后只有在你收集完之后才能开始你的比赛对于不在列表中的节点。
MATCH (:Node {id:"123"})-[*0..]-(b:Node)
WITH collect(DISTINCT b) as col
MATCH (a:Node)
WHERE NOT a IN col
RETURN a.id
我正在使用 Neo4j 尝试查找未连接到特定节点的任何节点 "a"。到目前为止我的查询是:
MATCH p = shortestPath((a:Node {id:"123"})-[*]-(b:Node))
WHERE p IS NULL
RETURN b.id as b
所以它试图找到a和b之间的最短路径。如果它没有找到路径,那么它 returns 该节点的 id。但是,这会导致我的查询 运行 几分钟,然后在 运行 内存不足时崩溃。我想知道这种方法是否有效,是否有更有效的方法?任何帮助将不胜感激!
编辑:
MATCH (a:Node {id:"123"})-[*]-(b:Node),
(c:Node)
WITH collect(b) as col, a, b, c
WHERE a <> b AND NOT c IN col
RETURN c.id
所以 col (collect(b)) 包含连接到 a 的每个节点,因此如果 c 不在 col 中那么 c 就没有连接到 a?
首先,您给这个 MATCH 一个不可能实现的谓词,因此它永远找不到最短路径。
WHERE 子句与 MATCH、OPTIONAL MATCH 和 WITH 子句相关联,因此您的查询要求路径不存在的最短路径。那永远不会 return 任何东西。
此外,最短路径将从您不想连接的节点开始,因此无法找到未连接到它的节点。
可能最简单的方法是 MATCH 到连接到您的相关节点的所有节点,然后 MATCH 到所有 :Nodes 检查那些不在连接集中的节点。这意味着您不必从数据库中的每个节点执行最短路径,只需在集合中进行成员资格检查。
为此您需要 APOC Procedures,因为它可以最快地匹配子图中的节点。
MATCH (a:Node {id:"123"})
CALL apoc.path.subgraphNodes(a, {}) YIELD node
WITH collect(node) as subgraph
MATCH (b:Node)
WHERE NOT b in subgraph
RETURN b.id as b
编辑
您编辑的查询可能会失败,这将生成一个巨大的结果集(该查询将构建一个结果集,其中包含从您的起始节点可以通过笛卡尔积中的唯一路径到达的每个节点,每个 :Node ).
相反,一步一步地收集不同的节点(因为否则你会得到多个可以通过不同路径到达的相同节点),然后只有在你收集完之后才能开始你的比赛对于不在列表中的节点。
MATCH (:Node {id:"123"})-[*0..]-(b:Node)
WITH collect(DISTINCT b) as col
MATCH (a:Node)
WHERE NOT a IN col
RETURN a.id