dgl.to_heterogeneous

dgl.to_heterogeneous(G, ntypes, etypes, ntype_field='_TYPE', etype_field='_TYPE', metagraph=None)[source]

将同构图转换为异构图并返回。

输入的图应该只有一种类型的节点和边。每个节点和边存储一个整数特征作为其类型ID(由ntype_fieldetype_field指定)。DGL使用它来检索存储在给定ntypesetypes参数中的类型名称。

该函数将自动区分具有相同给定类型ID但具有不同源和目标类型ID的边缘类型。例如,它允许边缘A和B都具有相同的类型ID 0,但一个具有(0, 1),另一个具有(2, 3)作为(源, 目标)类型ID。在这种情况下,函数将“拆分”边缘类型0为两种类型:(0, ty_A, 1)和(2, ty_B, 3)。换句话说,这两条边缘共享相同的边缘类型名称,但可以通过边缘类型三元组来区分。

该函数使用dgl.NIDdgl.EID名称将输入图中的节点和边ID存储在结果图的ndataedata中。它还将G中的任何节点/边特征复制到返回的异构图,除了用于存储类型ID(dgl.NTYPEdgl.ETYPE)和节点/边ID(dgl.NIDdgl.EID)的保留字段。

Parameters:
  • G (DGLGraph) – 同构图。

  • ntypes (list[str]) – 节点类型的名称。

  • etypes (list[str]) – 边类型的名称。

  • ntype_field (str, optional) – 用于存储节点类型的特征字段。(默认值:dgl.NTYPE

  • etype_field (str, optional) – 用于存储边类型的特征字段。(默认值:dgl.ETYPE

  • metagraph (networkx MultiDiGraph, optional) – 返回的异构图元图。 如果提供,DGL 假设 G 确实可以用给定的元图描述。 如果为 None,DGL 将从给定的输入中推断元图,这对于大型图来说可能代价较高。

Returns:

一个异构图。

Return type:

DGLGraph

注释

示例

以下示例使用PyTorch后端。

>>> import dgl
>>> import torch
>>> hg = dgl.heterograph({
...     ('user', 'develops', 'activity'): (torch.tensor([0, 1]), torch.tensor([1, 2])),
...     ('developer', 'develops', 'game'): (torch.tensor([0, 1]), torch.tensor([0, 1]))
... })
>>> print(hg)
Graph(num_nodes={'activity': 3, 'developer': 2, 'game': 2, 'user': 2},
      num_edges={('developer', 'develops', 'game'): 2, ('user', 'develops', 'activity'): 2},
      metagraph=[('developer', 'game', 'develops'), ('user', 'activity', 'develops')])

我们首先将异构图转换为同构图。

>>> g = dgl.to_homogeneous(hg)
>>> print(g)
Graph(num_nodes=9, num_edges=4,
      ndata_schemes={'_TYPE': Scheme(shape=(), dtype=torch.int64),
                     '_ID': Scheme(shape=(), dtype=torch.int64)}
      edata_schemes={'_TYPE': Scheme(shape=(), dtype=torch.int64),
                     '_ID': Scheme(shape=(), dtype=torch.int64)})
>>> g.ndata
{'_TYPE': tensor([0, 0, 0, 1, 1, 2, 2, 3, 3]), '_ID': tensor([0, 1, 2, 0, 1, 0, 1, 0, 1])}
Nodes 0, 1, 2 for 'activity', 3, 4 for 'developer', 5, 6 for 'game', 7, 8 for 'user'
>>> g.edata
{'_TYPE': tensor([0, 0, 1, 1]), '_ID': tensor([0, 1, 0, 1])}
Edges 0, 1 for ('developer', 'develops', 'game'), 2, 3 for ('user', 'develops', 'activity')

现在将同构图转换回异构图。

>>> hg_2 = dgl.to_heterogeneous(g, hg.ntypes, hg.etypes)
>>> print(hg_2)
Graph(num_nodes={'activity': 3, 'developer': 2, 'game': 2, 'user': 2},
      num_edges={('developer', 'develops', 'game'): 2, ('user', 'develops', 'activity'): 2},
      metagraph=[('developer', 'game', 'develops'), ('user', 'activity', 'develops')])

检索原始节点/边的ID。

>>> hg_2.ndata[dgl.NID]
{'activity': tensor([0, 1, 2]),
 'developer': tensor([3, 4]),
 'game': tensor([5, 6]),
 'user': tensor([7, 8])}
>>> hg_2.edata[dgl.EID]
{('developer', 'develops', 'game'): tensor([0, 1]),
 ('user', 'develops', 'activity'): tensor([2, 3])}

另请参阅

to_homogeneous