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,它以表格形式存储节点、边及其特征

nodes.csv

age, title

43, 1

23, 3

edges.csv

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()