MATCH (n)
WITH COLLECT(n) as nodes
RETURN REDUCE(graphs = [], n in nodes |
case when
ANY (g in graphs WHERE shortestPath((n)-[*]-(head(g)))
then graphs
else graphs + [[p in (n)-[*0..]-() | nodes(p)[length(p)-1]]]
end ))
MATCH (n)
WITH COLLECT(n) as nodes
RETURN REDUCE(graphs = [], n in nodes |
case when
ANY (g in graphs WHERE shortestPath( (n)-[*]-(g) ) )
then graphs
else graphs + [n]
end )
2 回答
虽然它不会很快 .
Java中的专用算法将更快地收集数据 .
Cypher的想法(可能有非常糟糕的复杂性,但尚未奏效):
获取所有节点
每个节点
如果它连接到连接图的任何第一个节点(shortestPath),则跳过它,否则收集所有路径的所有端节点
.
@michael,我已经修改了一下你的查询 . 现在它适用于我的数据 . 我发布的变体每个连接组件只保留一个元素 . 如果一个人对组件的实际成员不感兴趣但仍希望能够检索每个组件的成员,这很方便 .
@manish,我知道它已经晚了但是,也许你可以将组件代表存储在新数据库中,而不是所有成员中 .