利用重叠的节点进行子图合并
例如,有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 回复
- 将每个社区的节点id保存在一个list中:MATCH (n:Node) WITH c.community, collect© AS list
- 使用apoc.coll.intersection(first, second) 两两计算list的交集,如果交集的元素个数>3,则合并:apoc.coll.union(first, second)
- 使用Cypher的话需要迭代执行,可以使用apoc.periodic.commit(),直到交集的元素数量<3。
颇需要些Cypher的技巧。
我看了apoc.periodic.commit()的介绍,其中有个limit参数,我理解这个参数就是类似每次处理的节点或其他的数量限制。如果这样,我这里的场景就可能不太适应。我们不知道每个list到底有多长,无法给出limit的值,如果要尽可能的大,也失去了这个函数调用的意义。随着合并的不断进行,如果每次只是取出limit的数量的节点进行比较,那么失误会越来越多。这只是我的粗浅理解,不知是否正确。请指教!