利用重叠的节点进行子图合并
发布于 4 年前 作者 dalianmao 1812 次浏览 来自 问答

例如,有A,B,C,D,E,F,G,H,I,J,K,L,M,N14个节点。假设A,B,C,D,F,L为x社区。C,D,E,G,L为y社区。F,H,I,M为z社区。H,I,J,K,M,N为w社区。在这个场景中,我希望将重叠的节点个数作为社区划分与合并的标准。如果将“重叠的个数为3个”作为社区划分与合并的标准,则A,B,C,D,E,F,G,L为一个社区,F,H,I,J,K,M,N为一个社区。请问如何解决?谢谢!

8 回复

有人知道这个问题怎么解决吗?

  1. 将每个社区的节点id保存在一个list中:MATCH (n:Node) WITH c.community, collect© AS list
  2. 使用apoc.coll.intersection(first, second) 两两计算list的交集,如果交集的元素个数>3,则合并:apoc.coll.union(first, second)
  3. 使用Cypher的话需要迭代执行,可以使用apoc.periodic.commit(),直到交集的元素数量<3。

颇需要些Cypher的技巧。

非常感谢!大概的思路我理解了,还有一些细节我再好好想一想

我看了apoc.periodic.commit()的介绍,其中有个limit参数,我理解这个参数就是类似每次处理的节点或其他的数量限制。如果这样,我这里的场景就可能不太适应。我们不知道每个list到底有多长,无法给出limit的值,如果要尽可能的大,也失去了这个函数调用的意义。随着合并的不断进行,如果每次只是取出limit的数量的节点进行比较,那么失误会越来越多。这只是我的粗浅理解,不知是否正确。请指教!

还有一个问题,迭代执行的时候,first、second因为合并会发生变化,apoc.periodic.commit()还可以做到吗?

commit()通过limit参数限制每次处理的节点数、也就是事务的大小,重复执行一直到没有更多的节点可以处理。这个正好是你需要的:你知道结束条件,但是不知道执行次数。

是的,的确如此。但是coll.intersection(first, second) 与coll.union(first, second)中的first、second会随着迭代执行而发生变化。您的意思是否是这一步需要用cypher实现?谢谢!

我对commit()的limit参数在此场景中的理解是:该参数限制了每次处理的list的个数,而不是节点的个数。这样的理解是否正确?谢谢!

回到顶部