dgl.to_heterogeneous
- dgl.to_heterogeneous(G, ntypes, etypes, ntype_field='_TYPE', etype_field='_TYPE', metagraph=None)[source]
将同构图转换为异构图并返回。
输入的图应该只有一种类型的节点和边。每个节点和边存储一个整数特征作为其类型ID(由
ntype_field
和etype_field
指定)。DGL使用它来检索存储在给定ntypes
和etypes
参数中的类型名称。该函数将自动区分具有相同给定类型ID但具有不同源和目标类型ID的边缘类型。例如,它允许边缘A和B都具有相同的类型ID 0,但一个具有(0, 1),另一个具有(2, 3)作为(源, 目标)类型ID。在这种情况下,函数将“拆分”边缘类型0为两种类型:(0, ty_A, 1)和(2, ty_B, 3)。换句话说,这两条边缘共享相同的边缘类型名称,但可以通过边缘类型三元组来区分。
该函数使用
dgl.NID
和dgl.EID
名称将输入图中的节点和边ID存储在结果图的ndata
和edata
中。它还将G
中的任何节点/边特征复制到返回的异构图,除了用于存储类型ID(dgl.NTYPE
和dgl.ETYPE
)和节点/边ID(dgl.NID
和dgl.EID
)的保留字段。- Parameters:
- Returns:
一个异构图。
- Return type:
注释
返回的节点和边类型可能不一定与
ntypes
和etypes
的顺序相同。Calling
to_homogeneous()
then callingto_heterogeneous()
again yields the same result.
示例
以下示例使用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])}
另请参阅