本文首发于 Nebula Graph Community 公众号

​在图论中,介数(Betweenness)反应节点在整个网络中的作用和影响力。而本文主要介绍如何基于 Nebula Graph 图数据库实现 Betweenness Centrality 介数中心性的计算。

1. 算法介绍

中心性是用来衡量一个节点在整个网络图中所在中心程度的概念,包括度中心性、接近中心性、中介中心性等。 其中度中心性通过节点的度数(即关联的边数)来刻画节点的受欢迎程度,接近中心性是通过计算每个节点到全图其他所有节点的路径和来刻画节点与其他所有节点的关系密切程度。

中介中心性则用于衡量一个顶点出现在其他任意两个顶点对之间最短路径上的次数,从而来刻画节点的重要性

节点介数中心性的定义是:在所有最短路径中经过该节点的路径数目占最短路径总数的占比。

计算图中节点的介数中心性分为两种情况:有权图上的介数中心性和无权图上的介数中心性。两者的区别在于求最短路径时使用的方法不同,对于无权图采用 BFS(宽度优先遍历)求最短路径,对于有权图采用 Dijkstra 算法求最短路径。

下面所介绍的算法都是针对无向图的。

2. 应用场景

介数反应节点在整个网络中的作用和影响力,主要用于衡量一个顶点在图或网络中承担“桥梁”角色的程度,图中节点 C 就是一个重要的桥梁节点。

中心性可用于金融风控领域中反欺诈场景里中介实体的识别。也可用于医药领域中特定疾病控制基因的识别,用以改进药品的靶点。

3. 介数中心性公式

节点介数中心性的计算公式如下:

(公式 1)

其中

:经过节点 v 的 s 到 t 的最短路径条数;

:节点s到节点t的所有最短路径条数;

s 和 t 是属于节点集合的任意一个节点对。

为方便计算,将每对顶点的介数计算定义为:

(公式 2)

所以上面的公式 1 可以用公式 2 代替,即

(公式 3)

4. 求解思路

求节点 v 的介数中心性,即计算,需要知道节点 v 是否在 s 到 t 的路径上。

(1)求节点 v 是否在 s 到 t 的最短路径上,采用下面公式判断表示两点之间的最短路径长度):

当 v 位于 s 到 t 的最短路径上时,有

(公式 4)

又因为 是互相独立的,根据数学组合知识得知 s 到 t 的最短路径总数是 s 到 v 的最短路径数与 v 到 t 的最短路径数的乘积。

所以有下面公式:

(公式 5)

(2)根据上面公式可得:

节点 s 到节点 t 的经过 w 的最短路径条数为 ,在图中节点 v 是 w 的前置节点,所以 st 之间经过节点 v 和 w 的最短路径条数计算公式为:

(公式 6)

下面分为两种情况:分别是

(一)

(公式 7)

(二)

(公式 8)

(3)所以将上面两种情况加起来,得到经过 v 的 s 到所有顶点的最短路径数占 s 到所有顶点的最短路径数的比值。

(公式 9)

其中 即 v 是 s 到 w 路径中 w 的前驱节点。

(4)根据上面的求 的公式,下面给出论文中求解无权图时的算法流程,如下所示。

对于无权图实现根据上面流程实现。

有权图的介数中心性计算需要将求解最短路径的方法改成采用 Dijkstra 方法,即改动第一个 while 循环内的代码。

基于 Nebula Graph 的 Betweenness Centrality 实现了针对有权图和无权图的计算,实现代码见 https://github.com/vesoft-inc/nebula-algorithm/blob/master/nebula-algorithm/src/main/scala/com/vesoft/nebula/algorithm/lib/BetweennessCentralityAlgo.scala

5. 计算示例

首先读取 Nebula Graph 中的图数据,可以指定其边数据进行数据读取。

其次针对 Nebula Graph 的边数据构造拓扑图,执行中心性计算。

读取的 Nebula Graph 图数据以该无权图为例:

计算节点 1 的 BC

经过1节点的最短路径节点对 节点对之间的最短路径总数 占通过 1 节点的最短路径数
2-4 3 (2-3-4,2-5-4,2-1-4) 1
节点 1 的 BC: 1/3

计算节点 2 的 BC

经过 2 节点的最短路径节点对 节点对之间的最短路径总数 占通过 1 节点的最短路径数
1-3 2 (1-2-3,1-4-3) 1
3-5 2(3-2-5,3-4-5) 1
节点 2 的 BC: 1

计算节点 3 的 BC

经过 3 节点的最短路径节点对 节点对之间的最短路径总数 占通过 1 节点的最短路径数
2-4 3 (2-3-4,2-5-4,2-1-4) 1
节点 3 的 BC: 1/3

计算节点 4 的 BC

经过 4 节点的最短路径节点对 节点对之间的最短路径总数 占通过 1 节点的最短路径数
1-3 2 (1-4-3,1-2-3) 1
3-5 2(3-4-5.3-2-5) 1
节点 4 的 BC: 1

计算节点 5 的 BC

经过 5 节点的最短路径节点对 节点对之间的最短路径总数 占通过 1 节点的最短路径数的百分比
2-4 3 (2-3-4,2-5-4,2-1-4) 1
节点 5 的 BC: 1/3

所以每个节点的 BC 值是:

1: 1/3

2: 1

3: 1/3

4: 1

5: 1/3

6. 算法结果示例

数据:读取 Nebula Graph test 中的边数据,以 srcId、dstId 和 rank 分别作为拓扑图中的边的三元组(起点、重点、权重)

(root@nebula) [test]> match (v:node) -[e:relation] -> ()  return e
+------------------------------------+
| e |
+------------------------------------+
| [:relation "3"->"4" @1 {col: "f"}] |
+------------------------------------+
| [:relation "2"->"3" @2 {col: "d"}] |
+------------------------------------+
| [:relation "2"->"5" @4 {col: "e"}] |
+------------------------------------+
| [:relation "4"->"5" @2 {col: "g"}] |
+------------------------------------+
| [:relation "1"->"5" @1 {col: "a"}] |
+------------------------------------+
| [:relation "1"->"2" @3 {col: "b"}] |
+------------------------------------+
| [:relation "1"->"4" @5 {col: "c"}] |
+------------------------------------+

读取 Nebula Graph 边数据,设置无权重并执行 BC 算法,输出结果如下:

vid: 4 BC: 1.0
vid: 1 BC: 0.3333333333333333
vid: 3 BC: 0.3333333333333333
vid: 5 BC: 0.3333333333333333
vid: 2 BC: 1.0

读取 Nebula Graph 边数据,设置有权重并执行 BC 算法,输出结果如下:

vid: 4 BC: 2.0
vid: 1 BC: 0.5
vid: 3 BC: 1.0
vid: 5 BC: 2.0
vid: 2 BC: 0.0

7. 参考资料

本文中如有任何错误或疏漏,欢迎去 GitHub:https://github.com/vesoft-inc/nebula issue 区向我们提 issue 或者前往官方论坛:https://discuss.nebula-graph.com.cn/建议反馈 分类下提建议 ;交流图数据库技术?加入 Nebula 交流群请先填写下你的 Nebula 名片,Nebula 小助手会拉你进群~~

图数据库|基于 Nebula Graph 的 BetweennessCentrality 算法的更多相关文章

  1. 对图数据库(Nebula)进行单元测试时的坑

    通过Nebula提供的Java Client完成代码开发后,使用JUnit对其进行单元测试,需要注意几点: 一.不确定性 1.Nebula创建图空间是异步实现的,Nebula将在下一个心跳周期内(默认 ...

  2. 图数据库 Nebula Graph 的数据模型和系统架构设计

    Nebula Graph:一个开源的分布式图数据库.作为唯一能够存储万亿个带属性的节点和边的在线图数据库,Nebula Graph 不仅能够在高并发场景下满足毫秒级的低时延查询要求,而且能够提供极高的 ...

  3. 分布式图数据库 Nebula Graph 的 Index 实践

    导读 索引是数据库系统中不可或缺的一个功能,数据库索引好比是书的目录,能加快数据库的查询速度,其实质是数据库管理系统中一个排序的数据结构.不同的数据库系统有不同的排序结构,目前常见的索引实现类型如 B ...

  4. 图数据库 Nebula Graph 是什么

    图数据库(英语:Graph Database)是一个使用图结构进行语义查询的数据库.该系统的关键概念是图,形式上是点 (Node 或者 Vertex) 和边 (Edge 或者 Relationship ...

  5. 图数据库对比:Neo4j vs Nebula Graph vs HugeGraph

    本文系腾讯云安全团队李航宇.邓昶博撰写 图数据库在挖掘黑灰团伙以及建立安全知识图谱等安全领域有着天然的优势.为了能更好的服务业务,选择一款高效并且贴合业务发展的图数据库就变得尤为关键.本文挑选了几款业 ...

  6. 图数据库 Nebula Graph 的安装部署

    Nebula Graph:一个开源的分布式图数据库.作为唯一能够存储万亿个带属性的节点和边的在线图数据库,Nebula Graph 不仅能够在高并发场景下满足毫秒级的低时延查询要求,还能够实现服务高可 ...

  7. COSCon'19 | 如何设计新一代的图数据库 Nebula

    11 月 2 号 - 11 月 3 号,以"大爱无疆,开源无界"为主题的 2019 中国开源年会(COSCon'19)正式启动,大会以开源治理.国际接轨.社区发展和开源项目为切入点 ...

  8. 图数据库-Neo4j-常用算法

    本次主要学习图数据库中常用到的一些算法,以及如何在Neo4j中调用,所以这一篇偏实战,每个算法的原理就简单的提一下. 1. 图数据库中常用的算法 PathFinding & Search 一般 ...

  9. Pick of the Week'19 | 图数据库 Nebula 第 47 周看点-- insert 的二三事

    每周五 Nebula 为你播报每周看点,每周看点由本周大事件.用户问答.Nebula 产品动态和推荐阅读构成. 今天是 2019 年第 47 个工作周的周五,来和 Nebula 看看本周有什么图数据库 ...

随机推荐

  1. 程序语言与编程实践4-> 蓝桥杯C/C++备赛记录2 | 第二周学习训练

    0323,又是一周星期三,按道理该总结了.这周前几天写题比较多,后面事情多了起来,就没怎么写了.主要方向是洛谷的基本语法熟悉,PTA平台数据结构的一些题目. 0323附上: 题目比较多,所以文章可能有 ...

  2. 【Java分享客栈】Java程序员为争一口气熬夜硬刚CSS实现掘金首页

    前言 如果我做不了最厉害的Java工程师,那我就做Java工程师中最厉害的前端工程师. 前段时间,我默默给自己又喂了这碗心灵鸡汤-- 我不是很厉害的Java工程师,哪怕我已经工作八年,我依然觉得自己和 ...

  3. CF1225E Rock Is Push (计数)

    观察性质计数题orz小贺 考场上跟榜才切 我们只能往下和往右走,那么只有连续的往下和往右可能会造成不合法的情况!如果当前这一步是向右,那么只有它前面连续的一段向右可能影响到它. 考虑把连续的向右/下一 ...

  4. GitHub还能这样玩,这次我真是开了眼了

    哈喽,大家好,我是指北君. 我会一直在"开源指北"公众号给大家分享各种有趣. 实用与最前沿的开源项目,还有各种互联网干货, 今天主要给大家分享一下GitHub的一些使用技巧,帮助你 ...

  5. NLP 自然语言处理实战

    前言 自然语言处理 ( Natural Language Processing, NLP) 是计算机科学领域与人工智能领域中的一个重要方向.它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和 ...

  6. java反射笔记(学习尚硅谷java基础教程)

    反射一.概述:Reflection Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性 ...

  7. C++ 并发编程1

    一个简单的并发编程的举例 #include <iostream> #include <thread> using namespace std; void hello(){ co ...

  8. XStream类对象把List<javaBean>()转成json数据

    [省市联动] Servlet端: XStream把list转成json数据 //JSONArray-->变成数组/集合[] //JSONObject-->变成简单的数据{name:ayee ...

  9. 二叉树,红黑树,B+树

    在实际使用时会根据链表和有序数组等数据结构的不同优势进行选择.有序数组的优势在于二分查找,链表的优势在于数据项的插入和数据项的删除.但是在有序数组中插入数据就会很慢,同样在链表中查找数据项效率就很低. ...

  10. Mysql之锁(二)

    1.查看锁 SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX; -- 记录当前运行的事务 SELECT * FROM INFORMATION_SCHEMA.INN ...