做完社区划分后,计算社区内部,社区外部的重要节点。

nebula graph版本:3.3.0
nebula studio版本:3.5.0
部署方式:分布式
是否为线上版本:N

之前提过问题,在图上进行社区划分后,找出某个社区内部的重要节点,链接为:做完Louvain社区划分后,如何找到每个社区中的重要节点?

现在我想不仅计算社区内部的重要节点,还需要:

  1. 分析识别群体内部与外部通联密切的个体。(找社团内部的重要人物,它与社团外部联系密切的。)
  2. 分析识别与群体通联密切的外部个体。(找社团外部的重要人物,它与指定社团联系密切的。)
  3. 分析识别与两个或多个群体发生通联的个体。(找社团外部的重要人物,它与多个指定社团联系密切的。)

我初步想法是,比如对于2,用pyspark或python,统计所有节点的点度中心性,然后过滤出和某个社区有联系(出边或者入边与该社区内部节点联系)的节点,请问各位还有更好的想法吗? :tea:

  1. 怎么定义联通密切,比如内部点与外部的连边权重和? 那就基于边进行分析,统计所有 源点与目标点的社区id不同的数据,然后根据源点/目标点进行groupByKey,得到每个点与外部点的连边集合,再统计集合内点的个数count 进行排序,这样得到的结果就是 每个节点与 社区外节点的关联数。
  2. 和1的思路类似,你的方式可能会将社区外部的点也统计进去。
  3. 这个转换成模型就是找不同社区之间的重要桥梁吧,是BetweennessCentrality算法的场景。
1 个赞

明白!
对于1,我用nGQL语句是实现,先利用下面这个语句:

LOOKUP ON partition WHERE partition.louvain==94 YIELD id(vertex) AS id 
| GO 1 STEPS FROM $-.id OVER * YIELD $-.id AS src, id($$) AS dst

查出94号社区中每个节点所连接的边,后面如何过滤出dst中,louvain != 94的节点呢?并计数。
我不知道后面应该怎么接where语句

后面的逻辑:
where src 的社区id != dst的社区id | groupby src yield(dst)

我刚又编辑了下,下面这个对于2(找社团外部的重要人物,它与指定社团联系密切的)的语句,应该是没问题吧?

LOOKUP ON partition WHERE partition .louvain == 94 YIELD id(vertex) AS id \
| GO 1 STEPS FROM $-.id OVER * BIDIRECT where properties($$).louvain != 94 yield id($$) as src,$-.id as dst
| GROUP BY $-.src YIELD $-.src as src,count(*) AS degree1

此话题已在 188 天后被自动关闭。不再允许新回复。