Neo4j 密码 - 搜索节点之间没有路径
Neo4j cypher - search for nodes with no path between them
我正在尝试寻找一种通用方法来搜索没有 link 到另一个节点或节点集的节点或节点集。
例如,我能够找到特定类型的所有节点(例如 :Style
),这些节点 以某种方式连接到一组特定的节点(例如 :MetadataRoot
),具有以下内容:
match (root:MetadataRoot),
(n:Style),
p=shortestPath((root)-[*]-(n))
return p
使用这个,我能够从上述查询返回的节点中减去 all :Style
节点的集合,但这看起来不像解决这个问题的最佳方法。
如果您知道起始节点的标签,您可以使用 EXISTS 函数:
MATCH (n:Style)
WHERE NOT EXISTS((n)-[]-())
RETURN n
如果你知道结束节点:
MATCH (n:Style)
WHERE NOT EXISTS ((n)-[*]-(:MetadataRoot))
RETURN n
编辑:
不确定,但关于您评论中的性能问题,解决方法可能是这样的:
MATCH p=allShortestPaths((n:Style)-[*]-(:MetadataRoot))
WITH nodes(p) as nodesRelated
MATCH (s:Style) WHERE NOT s IN nodesRelated
我正在尝试寻找一种通用方法来搜索没有 link 到另一个节点或节点集的节点或节点集。
例如,我能够找到特定类型的所有节点(例如 :Style
),这些节点 以某种方式连接到一组特定的节点(例如 :MetadataRoot
),具有以下内容:
match (root:MetadataRoot),
(n:Style),
p=shortestPath((root)-[*]-(n))
return p
使用这个,我能够从上述查询返回的节点中减去 all :Style
节点的集合,但这看起来不像解决这个问题的最佳方法。
如果您知道起始节点的标签,您可以使用 EXISTS 函数:
MATCH (n:Style)
WHERE NOT EXISTS((n)-[]-())
RETURN n
如果你知道结束节点:
MATCH (n:Style)
WHERE NOT EXISTS ((n)-[*]-(:MetadataRoot))
RETURN n
编辑:
不确定,但关于您评论中的性能问题,解决方法可能是这样的:
MATCH p=allShortestPaths((n:Style)-[*]-(:MetadataRoot))
WITH nodes(p) as nodesRelated
MATCH (s:Style) WHERE NOT s IN nodesRelated