Neo4j Cypher找到两个不相交的节点

Neo4j Cypher找到两个不相交的节点,neo4j,cypher,anormcypher,Neo4j,Cypher,Anormcypher,我使用Neo4j来尝试查找未连接到特定节点“a”的任何节点。到目前为止,我的问题是: MATCH p = shortestPath((a:Node {id:"123"})-[*]-(b:Node)) WHERE p IS NULL RETURN b.id as b 所以它试图找到a和b之间的最短路径。如果找不到路径,则返回该节点的id。但是,这会导致我的查询运行几分钟,然后在内存不足时崩溃。我想知道这种方法是否有效,是否有更有效的方法?任何帮助都将不胜感激 编辑: MATCH (a:Node

我使用Neo4j来尝试查找未连接到特定节点“a”的任何节点。到目前为止,我的问题是:

MATCH p = shortestPath((a:Node {id:"123"})-[*]-(b:Node))
WHERE p IS NULL
RETURN b.id as b
所以它试图找到a和b之间的最短路径。如果找不到路径,则返回该节点的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 
MATCH(a:Node{id:123})-[*]-(b:Node),
(c:节点)
以collect(b)作为列a、b、c
在col中,a是b,而不是c
返回c.id

所以col(collect(b))包含连接到a的每个节点,所以如果c不在col中,那么c不连接到a

首先,你给了这个匹配一个不可能完成的谓词,所以它永远不会找到最短路径

WHERE子句与MATCH、OPTIONAL MATCH和with子句相关联,因此您的查询要求的是路径不存在的最短路径。那永远不会归还任何东西

此外,最短路径将从您不希望连接的节点开始,因此无法找到未连接到它的节点

可能最简单的方法是匹配连接到相关节点的所有节点,然后匹配到所有:节点检查那些不在连接集中的节点。这意味着您不必从数据库中的每个节点执行最短路径,只需检查集合中的成员身份即可

您需要这样做,因为它有最快的方法来匹配子图中的节点

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
编辑

您编辑的查询可能会爆炸,这将生成一个巨大的结果集(该查询将为每个节点构建一个结果集,每个节点都可以通过笛卡尔乘积中的唯一路径从起始节点到达:节点)

取而代之的是,一步一步地收集不同的节点(因为如果不这样,您将获得可以通过不同路径到达的多个相同节点),然后只有在收集了这些节点之后,才应该开始匹配列表中没有的节点

MATCH (:Node {id:"123"})-[*0..]-(b:Node)
WITH collect(DISTINCT b) as col
MATCH (a:Node)
WHERE NOT a IN col
RETURN a.id 

感谢我不能使用APOC程序。作为替代方案,这看起来正确吗?(请参见编辑)我用一个查询编辑了我的答案,该查询应该可以修复您的备选查询。请记住,Cypher可变长度匹配不会像APOC的subgraphNodes()过程那样有效,因为Cypher对唯一路径感兴趣,所以在大型图上此查询仍然可能超时。