关于apoc.path.subgraphNodes,这个包背后算法是怎么样的啊?
发布于 2 年前 作者 realyin 391 次浏览 来自 问答

我根据某地流行病学的调查情况,建了一个库,用来分析病例的传播情况。

在分析有几个传播链的时候,用的时以下的语句: MATCH (a:person)-[r]->() WITH a
CALL apoc.path.subgraphNodes(a, {maxLevel:-1}) YIELD node WITH node,a where ‘person’ in labels(node) SET node.component = id(a) with node.component as com,collect(distinct node.name) as nodlist return com,size(nodlist),nodlist order by size(nodlist) desc image.png

上面的语句是我从网上找的例子中改造的,貌似正好能满足我的需求。同时,也查了一下apoc.path.subgraphNodes资料。在官方的案例中,一般会指定起始点,所以在后面的路径搜索时,理解起来也比较清楚。可是针对这个语句,我有几个疑问: MATCH (a:person)-[r]->() WITH a ——应该是获取了所有label为person的node,如果是这样的话,后面的路径搜索是怎么做的呢?是把所有label为person的node都做为起始点,都来搜索一遍吗? 还是用某种方式,比如随机选了一个node,然后再做的搜索?从执行的结果后,感觉有点像选了一个node后,再搜索的,因为后面执行了SET node.component = id(a) ,同一个子图的的node的component是相同的值。

但是,如果我做如下修改,发现结果会大不一样。如果CALL apoc.path.subgraphNodes是随机选了一个node,那这个结果应该是有几个subgraph,就返回几个node。 然而执行结果却是返回所有node,并且每个node都是独立返回的: MATCH (a:person)-[r]->() WITH a
CALL apoc.path.subgraphNodes(a, {maxLevel:-1}) YIELD node WITH node,a where ‘person’ in labels(node) return distinct a.name,id(a) image.png

由于没有在网上查到太多apoc.path.subgraphNodes的资料(也许是我查资料的方法没找对。。。),所以还想请各位指导一下,多谢!!!

1 回复

可以看下源码

回到顶部