dgl.bipartite_from_networkx

dgl.bipartite_from_networkx(nx_graph, utype, etype, vtype, u_attrs=None, e_attrs=None, v_attrs=None, edge_id_attr_name=None, idtype=None, device=None)[source]

从 NetworkX 图创建并返回一个单向二分图。

创建的图将包含两种节点类型 utypevtype,以及一种边类型 etype,其边由 utype 指向 vtype

注意

从 NetworkX 图创建 DGLGraph 的速度并不快,尤其对于大规模图。建议先将 NetworkX 图转换为节点 tensor 元组,然后使用 dgl.heterograph() 构建 DGLGraph。

参数:
  • nx_graph (networkx.DiGraph) – 包含图结构和节点/边属性的 NetworkX 图。如果节点的标签不是从零开始的连续整数,DGL 将重新标记节点。图必须遵循 NetworkX 的二分图约定,此外,边必须从具有属性 bipartite=0 的节点指向具有属性 bipartite=1 的节点。

  • utype (str, 可选) – 源节点类型的名称。

  • etype (str, 可选) – 边类型的名称。

  • vtype (str, 可选) – 目标节点类型的名称。

  • u_attrs (list[str], 可选) – 从 NetworkX 图中检索节点类型 utype 的节点属性名称列表。如果给定,DGL 将检索到的节点属性存储在返回图的 nodes[utype].data 中,使用其原始名称。属性数据必须可转换为 Tensor 类型(例如,标量、numpy.ndarray、列表等)。

  • e_attrs (list[str], 可选) – 从 NetworkX 图中检索的边属性名称列表。如果给定,DGL 将检索到的边属性存储在返回图的 edata 中,使用其原始名称。属性数据必须可转换为 Tensor 类型(例如,标量、numpy.ndarray、列表等)。

  • v_attrs (list[str], 可选) – 从 NetworkX 图中检索节点类型 vtype 的节点属性名称列表。如果给定,DGL 将检索到的节点属性存储在返回图的 nodes[vtype].data 中,使用其原始名称。属性数据必须可转换为 Tensor 类型(例如,标量、numpy.array、列表等)。

  • edge_id_attr_name (str, 可选) – 存储边 ID 的边属性名称。如果给定,DGL 将在创建图时相应地分配边 ID,因此该属性必须是有效的 ID,即从零开始的连续整数。默认情况下,返回图的边 ID 可以是任意的。

  • idtype (int32int64, 可选) – 用于存储结构相关图信息(例如节点和边 ID)的数据类型。它应该是特定框架的数据类型对象(例如,torch.int32)。默认情况下,DGL 使用 int64。

  • device (device context, 可选) – 结果图的设备。它应该是特定框架的设备对象(例如,torch.device)。默认情况下,DGL 将图存储在 CPU 上。

返回值:

创建的图。

返回类型:

DGLGraph

示例

以下示例使用 PyTorch 后端。

>>> import dgl
>>> import networkx as nx
>>> import numpy as np
>>> import torch

创建一个包含 2 条边的单向二分图。

>>> nx_g = nx.DiGraph()
>>> # Add nodes for the source type
>>> nx_g.add_nodes_from([1, 3], bipartite=0, feat1=np.zeros((2, 1)), feat2=np.ones((2, 1)))
>>> # Add nodes for the destination type
>>> nx_g.add_nodes_from([2, 4, 5], bipartite=1, feat3=np.zeros((3, 1)))
>>> nx_g.add_edge(1, 4, weight=np.ones((1, 1)), eid=np.array([1]))
>>> nx_g.add_edge(3, 5, weight=np.ones((1, 1)), eid=np.array([0]))

仅转换为包含结构的 DGLGraph。

>>> g = dgl.bipartite_from_networkx(nx_g, utype='_U', etype='_E', vtype='_V')

检索图的节点/边特征。

>>> g = dgl.bipartite_from_networkx(nx_g, utype='_U', etype='_E', vtype='_V',
...                                 u_attrs=['feat1', 'feat2'],
...                                 e_attrs=['weight'],
...                                 v_attrs=['feat3'])

使用预先指定的边顺序。

>>> g.edges()
(tensor([0, 1]), tensor([1, 2]))
>>> g = dgl.bipartite_from_networkx(nx_g,
...                                 utype='_U', etype='_E', vtype='_V',
...                                 edge_id_attr_name='eid')
(tensor([1, 0]), tensor([2, 1]))

在第一个 GPU 上创建一个数据类型为 int32 的图。

>>> g = dgl.bipartite_from_networkx(nx_g, utype='_U', etype='_E', vtype='_V',
...                                 idtype=torch.int32, device='cuda:0')