用 NetworkX + Gephi + Nebula Graph 分析<权力的游戏>人物关系

pczhy
发布于 2022-9-30 11:19
浏览
0收藏

上一篇[1]中,我们通过 NetworkX 和 Gephi 展示了<权力的游戏>中的人物关系。在本篇中,我们将展示如何通过 NetworkX 访问图数据库 Nebula Graph。


01 NetworkX 

NetworkX [2] 是一个用 Python 语言开发的图论与复杂网络建模工具,内置了大量常用的图与复杂网络分析算法,可以方便地进行复杂网络数据分析、仿真建模等工作,功能丰富,简单易用。

在 NetworkX 中,图是由顶点、边和可选的属性构成的数据结构。顶点表示数据,边是由两个顶点唯一确定的,表示两个顶点之间的关系。顶点和边也可以拥有更多的属性,以存储更多的信息。

NetworkX 支持 4 种类型的图:

  • Graph:无向图
  • DiGraph: 有向图
  • MultiGraph: 多重无向图
  • MultiDiGraph: 多重有向图

在 NetworkX 中创建一个无向图:

添加顶点:

添加边:

在上一篇文章(一)中,我们已经演示了 NetworkX 的 Girvan-Newman 社区发现算法。


02 图数据库 Nebula Graph 

NetworkX 通常使用本地文件作为数据源,这在静态网络研究的时候没什么问题,但如果图网络经常会发生变化——例如某些中心节点已经不存在(Fig.1)或者引入了重要的网络拓扑变化(Fig.2)——每次生成全新的静态文件再加载分析就有些麻烦,最好整个变化过程可以持久化在一个数据库中,并且可以实时地直接从数据库中加载子图或者全图做分析。本文选用 Nebula Graph [3]作为存储图数据的图数据库。

Fig. 1

Fig. 2

Nebula Graph 提供了两种方式来获取图结构:

  • 编写一个查询语句,拉取一个子图;
  • 全量扫描底层存储,获取一个完整的全图。

第一种方式适合在一个大规模的图网络中通过精细的过滤和剪枝条件来获取符合需求的若干个点和边。第二种方式更适合于全图的分析,这通常是在项目前期对全图进行一些启发式探索,当有进一步认知后再用第一种方式做精细的剪枝分析。

分析完 Nebula Graph 两种获取图结构方式后,下面来查看 Nebula Graph 的 Python 客户端代码,nebula-python/nebula/ngStorage/StorageClient.py 与 nebula-python/nebula/ngMeta/MetaClient.py 就是和底层存储交互的 API, 里面有扫描点、扫描边、读取一堆属性等等一系列丰富的接口。

下面两个接口可以用来读取所有的点、边数据:

第一步:初始化一个客户端,和一个 scan_edge_processor。scan_edge_processor 用来对读出来的边数据进行解码:

第二步:初始化 scan_edge 接口的各项参数:

第三步:调用 scan_part_edge 接口,该接口会返回一个 scan_edge_response 对象的迭代器:

第四步:不断读取该迭代器所指向的 scan_edge_response 对象中的数据,直到读取完所有数据:

其中,process_edge 是自定义的一个处理读出来边数据的函数,该函数可以先使用 scan_edge_processor 对 scan_edge_response 中的数据进行解码,解码后的数据可以直接打印出来,也可以做一些简单处理,另作他用,比如:将这些数据读入计算框架 NetworkX 里。

第五步:处理数据。在这里我们将读出来的所有边都添加到 NetworkX 中的图G 里:

读取顶点数据的方法和上面的流程类似。

此外,对于分布式的一些图计算框架[4]来说,Nebula Graph 还提供了根据分片 (partition) 并发地批量读取存储的功能,这会在之后的文章中演示。


03 在 NetworkX 中进行图分析 

当我们把所有点和边数据都按照上述流程读入 NetworkX 后,我们还可以做一些基本的图分析和图计算:

第一步:绘制图:

绘制出来的图:

第二步:打印出图中的所有点和边:

输出的结果:

第三步:常见的,可以计算两个点之间的最短路径:

输出的结果:

第四步:也计算图中每个点的 PageRank 值,来看各自的影响力:

输出的结果:


此外,也可以和上一篇中一样,接入Gephi [5]来得到更好的图可视化效果。

本文的代码可以参见[6].

Reference

[1] https://nebula-graph.com.cn/posts/game-of-thrones-relationship-networkx-gephi-nebula-graph/

[2] https://networkx.github.io/

[3] https://github.com/vesoft-inc/nebula

[4] https://spark.apache.org/graphx/

[5] https://gephi.org/

[6] https://github.com/vesoft-inc/nebula-python/pull/31

本文转载自公众号nebula graph community

分类
已于2022-9-30 11:19:57修改
收藏
回复
举报
回复
    相关推荐