关于数据库:用-GraphScope-像-NetworkX-一样做图分析

31次阅读

共计 4679 个字符,预计需要花费 12 分钟才能阅读完成。

NetworkX 是 Python 上最罕用的图剖析包,GraphScope 兼容 NetworkX 接口。本文中咱们将分享如何用 GraphScope 像 NetworkX 一样在(大)图上进行剖析。

背景

NetworkX 是一个用 Python 语言开发的图论与简单网络建模工具,它内置了罕用的图与简单网络分析算法,提供了一套简略易用的图剖析接口,能够不便地进行简单网络数据分析、仿真建模等工作。NetworkX 的接口设计非常简洁,对于作为刚进入图算法畛域的小白来说,NetworkX 的接口能够帮忙使用者疾速建设起对图数据的感知,并且对于中小型数据集,NetworkX 的接口也是十分好上手的。
但因为 NetworkX 是基于 Python 语言开发,算法的性能并不是它的强项,而且也无奈无效地解决工业级别的大规模图数据。基于这一背景,GraphScope 提供了一套兼容 NetworkX 的图剖析接口,在能应用像 NetworkX 这样简略易用的接口的同时,也能提供高性能的图剖析算法以反对超大规模图数据的解决。

NetworkX 是如何进行图剖析的

咱们通过一个小例子来简略介绍一下 NetworkX 的图剖析过程。

# NetworkX 的图剖析过程从图的构建开始 import networkx# 初始化一个空的无向图 G = networkx.Graph()# 通过 add_edges_from 接口增加边列表# 此处增加了两条边 (1, 2) 和(1,3)G.add_edges_from([(1, 2), (1, 3)])# 通过 add_node 增加点 4G.add_node(4)# 接着查看一些图的信息# 应用 G.number_of_nodes 查问图 G 目前点的数目 G.number_of_nodes()# 4# 相似地,G.number_of_edges 能够查问图 G 中# 边的数量 G.number_of_edges()# 2# 通过 G.degree 来查看图 G 中每个点的度数 sorted(d for n, d in G.degree())# [0, 1, 1, 2]# 最初调用 NetworkX 内置的算法对对图进行剖析# 调用 connected_components 算法剖析图 G 的# 联通重量 list(networkx.connected_components(G))# [{1, 2, 3}, {4},]# 调用 clustering 算法剖析图 G 的聚类状况 networkx.clustering(G)# {1: 0, 2: 0, 3: 0, 4: 0}

上述例子只是对 NetworkX 做图剖析的一个简略的介绍,更多 NetworkX 的接口介绍以及具体的应用阐明,内置的算法等能够参考 NetworkX 官网文档。

用 GraphScope 像 NetworkX 一样做图剖析

NetworkX 官网的 NetworkX tutorial 是一个 NetworkX 接口应用以及图的入门教程。为了演示 GraphScope 对 NetworkX 的兼容性以及如何应用 GraphScope 的 NetworkX 接口进行图剖析,上面咱们应用 GraphScope 来执行教程中的例子。
应用 GraphScope 的 NetworkX 兼容接口,咱们只须要简略地将教程中的 import netwokx as nx 替换为 import graphscope.nx as nx 即可, 当然这里只是按照 NetworkX 的常规应用 nx 作为别名, 你也能够其余自定义的别名,例如 import graphscope.nx as gs_nx。

图的构建

GraphScope 反对与 NetworkX 完全相同的载图语法,示例里咱们应用 nx.Graph()来建设一个空的无向图。

import graphscope.nx as nx# 咱们能够建设一个空的无向图 G = nx.Graph()

减少节点和边

GraphScope 的图操作接口也放弃了与 NetworkX 的兼容,用户能够通过 add_node 和 add_nodes_from 来增加节点,通过 add_edge 和 add_edges_from 来增加边。

查问图的元素

GraphScope 反对兼容 NetworkX 的图查问接口。用户能够通过 number_of_nodes 和 number_of_edges 来获取图点和边的数量,通过 nodes, edges,adj 和 degree 等接口来获取图以后的点和边,以及点的街坊和度数等信息。

# 查问目前图中点和边的数目 G.number_of_nodes()# 5G.number_of_edges()# 3# 列出目前图中的点和边 list(G.nodes)# [1, 2, 3, 4, 5]list(G.edges)# [(1, 2), (1, 3), (2, 3)]# 查问某个点的街坊 list(G.adj[1])# [2, 3]# 查问某个点的度 G.degree(1)# 2

从图中删除元素

像 NetworkX 一样, GraphScope 也能够应用与增加元素相相似的形式从图中删除点和边,对图进行批改。例如能够通过 remove_node 和 remove_nodes_from 来删除图中的节点,通过 remove_edge 和 remove_edges_from 来删除图中的边。

# 通过 remove_node 删除一个点 G.remove_node(5)# 查看图 G 现有的点,发现点 5 曾经被删除了 list(G.nodes)# [1, 2, 3, 4]# 通过 remove_nodes_from 删除多个点 G.remove_nodes_from([4, 5])# 再查看图 G 现有的点,点 4 也曾经被删除了 list(G.nodes)# [1, 2, 3]# 通过 remove_edge 删除一条边 G.remove_edge(1, 2)# 查看图 G 现有的边,(1, 2) 这条边在 G 中# 曾经被删除 list(G.edges)# [(1, 3), (2, 3)]# 通过 remove_edges_from 删除多条边 G.remove_edges_from([(1, 3), (2, 3)])# 查看图 G 现有的边,(1, 3), (2, 3) 这两条边# 在 G 中曾经不存在了 list(G.edges)# []# 咱们再来看一下当初的点和边的数目 G.number_of_nodes()# 3G.number_of_edges()# 0

图剖析

GraphScope 能够通过兼容 NetworkX 的接口来对图进行各种算法的剖析,示例里咱们构建了一个简略图,而后别离应用 connected_components 剖析图的联通重量,应用 clustering 来失去图中每个点的聚类系数,以及应用 all_pairs_shortest_path 来获取节点两两之间的最短门路。

# 首先构建图 G = nx.Graph()G.add_edges_from([(1, 2), (1, 3)])G.add_node(4)# 通过 connected_components 算法找出# 图中的联通重量 list(nx.connected_components(G))# [{4},{1, 2, 3},]# 通过 clustering 算法计算每个点的聚类系数 nx.clustering(G)# {4: 0.0, 1: 0.0, 2: 0.0, 3: 0.0}# 计算图中节点两两之间的最短门路 sp = dict(nx.all_pairs_shortest_path(G))# 查看节点 3 与其余节点的最短门路 sp[3]# {3: [3], 1: [3, 1], 2: [3, 1, 2]}

图的简略绘制

同 NetworkX 一样,GraphScope 反对通过 draw 将图进行简略地绘制进去,底层依赖的是 matplotlib 的绘图性能。
如果零碎未装置 matplotlib,咱们首先须要装置一下 matplotlib 包:
pip3 install matplotlib
应用 GraphScope 来进行简略地绘制图

import graphscope.nx as nx# 创立一个 5 个点的 star graphG = nx.star_graph(5)# 应用 nx.draw 绘制图 nx.draw(G, with_labels=True)

GraphScope 绝对 NetworkX 算法性能上有着数量级的晋升

GraphScope 反对了局部 NetworkX 内置的图算法,咱们能够通过 NetworkX 的调用算法的形式来调用这些算法。上面咱们通过一个简略的试验来看一下 GraphScope 比照 NetworkX 在算法性能上到底晋升多少。
这个试验应用来自 snap 的 twitter 图数据, 测试算法是 NetworkX 内置的 Clustering 算法。试验所用的机器配置为 8 核 CPU, 16G 内存。
咱们首先筹备下数据,应用 wget 将数据集下载到本地

wget https://raw.githubusercontent.com/GraphScope/gstest/master/twitter.e ${HOME}/twitter.e

接着咱们别离应用 GraphScope 和 NetworkX 载入 snap-twitter 数据

import osimport graphscope.nx as gs_nximport networkx as nx# 应用 NetworkX 载入 snap-twitter 图数据 g1 = nx.read_edgelist(os.path.expandvars('$HOME/twitter.e'),     nodetype=int,     data=False,     create_using=nx.Graph ) type(g1) # networkx.classes.graph.Graph  # 应用 GraphScope 载入 snap-twitter 图数据 g2 = gs_nx.read_edgelist(os.path.expandvars('$HOME/twitter.e'),     nodetype=int,     data=False,     create_using=gs_nx.Graph ) type(g2) # graphscope.nx.classes.graph.Graph

最初咱们应用 Clustering 算法来对图进行聚类分析,来看一下 GraphScope 比照 NetworkX 在算法性能上有多少晋升

%%time# 应用 GraphScope 计算图中每个点的聚类系数 ret_gs = gs_nx.clustering(g2)# CPU times: user 213 ms, sys: 163 ms, total: 376 ms# Wall time: 2.9 s%%time# 应用 NetworkX 计算图中每个点的聚类系数 ret_nx = nx.clustering(g1)# CPU times: user 54.8 s, sys: 0 ns, total: 54.8 s# Wall time: 54.8 s# 比照下两者的后果是否统一 ret_gs == ret_nx# True

从试验后果咱们能够看到,GraphScope 在兼容 NetworkX 接口的同时,内置的算法比照 NetworkX 能够达到几个数量级的性能晋升。GraphScope 在提供兼容 NetworkX 简略易用的接口的同时,也能提供十分高效的算法剖析。

结语

本文介绍了如何让 GraphScope 应用 NetworkX 格调的形式对图数据进行操作和剖析,同时,本文也通过在 snap-twitter 图数据上聚类算法剖析的比照来展现了 GraphScope 在兼容 NetworkX 接口的同时,提供了高效的算法剖析能力。
在后续的文章中,咱们将会通过 benchmark 的形式更粗疏地比照 GraphScope 与 NetworkX 在图操作,图查问和图剖析上的一些性能比拟,以及应用 GraphScope 来执行一些 github 社区中基于 NetworkX 的乏味的数据分析我的项目。

正文完
 0