统计子图数
发布于 6 年前 作者 jonahyan 4934 次浏览 来自 问答

请问如何统计当前库中有多少个子图? 当前子图中有多少个节点, 有几类节点, 有几类关系?

10 回复

我尝试过使用 algo.unionFind算法来实现,我验证了一下, 发现不对

如果你的子图指的是连通子图,那么可以用下面的步骤:

  1. 取出一个节点n,把它的id赋予一个新节点属性,暂且称作component;
  2. 计算n的subgraph,即该节点可以到达的所有节点,将n的id赋予所有节点的component属性;
  3. 取出下一个没有component属性的节点,重复2,直到所有节点都有component属性。

下面是代码。运行前,需要: a. 加载并配置APOC扩展库; b. 定义component上的索引

// 计算图的连通分量,每1000个节点提交更新事务 // 使用apoc.periodic.commit迭代执行,直到没有节点a返回。 CALL apoc.periodic.commit(“MATCH (a:城市) WHERE a.component IS NULL WITH a LIMIT 1 CALL apoc.path.subgraphNodes(a, {maxLevel:-1}) YIELD node WITH node,a SET node.component = id(a) RETURN count(node)”,{limit:1000})

// 查询连通子图数量 MATCH (a:城市) WITH DISTINCT a.component AS component RETURN component

好的,谢谢, 我已经通过algo.unionFind写入到全库中了, 并在所有节点上建立了partition属性, 是我参数没有配置好

嗯,性能怎样?

@graphway 两亿多节点,九千多万关系 全库计算, 大概两个小时左右

@commissarster 谢谢, 那篇文章我也看到了, 不过我是用的algo的包, 没有使用apoc的包

嗯,感觉应该可以更快。多少子图算出来了?规模怎样?

@graphway 我试了一下您说的方法,可以添加属性,但是性能不高,5kw节点,500w个子图,跑了一下午没跑完。我用的4.1版,cpu只消耗100%。 请问有没有什么可以提升性能的地方吗

@5233zhangchao 这个听上去不对。你怎么写查询调用过程的?UnionFind应该非常快的

回到顶部