1.4 从外部源创建图
从外部源构造 DGLGraph
的选项包括
从外部 Python 图和稀疏矩阵库(NetworkX 和 SciPy)转换。
从磁盘加载图。
本节不涵盖通过转换其他图来生成图的函数。有关它们的概述,请参阅 API 参考手册。
从外部库创建图
以下代码片段是从 SciPy 稀疏矩阵和 NetworkX 图创建图的示例。
>>> import dgl
>>> import torch as th
>>> import scipy.sparse as sp
>>> spmat = sp.rand(100, 100, density=0.05) # 5% nonzero entries
>>> dgl.from_scipy(spmat) # from SciPy
Graph(num_nodes=100, num_edges=500,
ndata_schemes={}
edata_schemes={})
>>> import networkx as nx
>>> nx_g = nx.path_graph(5) # a chain 0-1-2-3-4
>>> dgl.from_networkx(nx_g) # from networkx
Graph(num_nodes=5, num_edges=8,
ndata_schemes={}
edata_schemes={})
请注意,从 nx.path_graph(5) 构造时,生成的 DGLGraph
有 8 条边而不是 4 条。这是因为 nx.path_graph(5) 构造的是一个无向 NetworkX 图 networkx.Graph
,而 DGLGraph
总是带方向的。在将无向 NetworkX 图转换为 DGLGraph
时,DGL 会在内部将无向边转换为两条有向边。使用有向 NetworkX 图 networkx.DiGraph
可以避免这种行为。
>>> nxg = nx.DiGraph([(2, 1), (1, 2), (2, 3), (0, 0)])
>>> dgl.from_networkx(nxg)
Graph(num_nodes=4, num_edges=4,
ndata_schemes={}
edata_schemes={})
注意
DGL 在内部将 SciPy 矩阵和 NetworkX 图转换为张量来构建图。因此,这些构建方法不适用于对性能要求极高的部分。
参见 API:dgl.from_scipy()
,dgl.from_networkx()
。
从磁盘加载图
存储图有许多数据格式,不可能一一列举所有选项。因此,本节仅提供一些关于某些常见格式的一般性指导。
逗号分隔值 (CSV)
一种非常常见的格式是 CSV,它以表格形式存储节点、边及其特征
age, title |
---|
43, 1 |
23, 3 |
… |
src, dst, weight |
---|
0, 1, 0.4 |
0, 3, 0.9 |
… |
有一些已知的 Python 库(例如 pandas)用于将此类数据加载到 Python 对象(例如 numpy.ndarray
)中,然后这些对象可用于构造 DGLGraph。如果后端框架也提供了从磁盘保存/加载张量的工具(例如 torch.save()
,torch.load()
),则可以遵循相同的原则构建图。
另请参见:从边对 CSV 加载空手道俱乐部网络的教程。
JSON/GML 格式
虽然速度不是特别快,但 NetworkX 提供了许多解析各种数据格式的工具,这间接允许 DGL 从这些源创建图。
DGL 二进制格式
DGL 提供了 API 用于从以二进制格式存储的磁盘中保存和加载图。除了图结构之外,这些 API 还处理特征数据和图级别标签数据。DGL 还支持将图直接检查点到 S3 或 HDFS。参考手册提供了更多关于用法的详细信息。
参见 API:dgl.save_graphs()
,dgl.load_graphs()
。