dgl.khop_out_subgraph
- dgl.khop_out_subgraph(graph, nodes, k, *, relabel_nodes=True, store_ids=True, output_device=None)[source]
返回指定节点 k 跳出邻域诱导的子图。
我们可以通过包含其后继节点来扩展一组节点。从指定的节点集合开始,通过重复 k 次节点集扩展,然后创建一个节点诱导子图,从而获得 k 跳出子图。除了提取子图,DGL 还会将提取的节点和边的特征复制到结果图中。复制是惰性的,仅在需要时才会发生数据移动。
如果图是异构的,DGL 会按关系提取子图并将它们组合成结果图。因此,结果图与输入图具有相同的关系集。
- 参数:
graph (DGLGraph) – 输入图。
要扩展的起始节点,不能有重复的值。否则结果将是未定义的。允许的格式有
Int: 单个节点的 ID。
Int Tensor: 每个元素都是一个节点 ID。张量必须与图具有相同的设备类型和 ID 数据类型。
iterable[int]: 每个元素都是一个节点 ID。
如果图是同构的,可以直接传递上述格式。否则,该参数必须是一个字典,其键是节点类型,值是上述格式的节点 ID。
k (int) – 跳数。
relabel_nodes (bool, 可选) – 如果为 True,它将移除孤立节点并重新标记提取的子图中的其余节点。
store_ids (bool, 可选) – 如果为 True,它将在结果图的
edata
中以dgl.EID
为名称存储提取边的原始 ID;如果relabel_nodes
为True
,它还将在结果图的ndata
中以dgl.NID
为名称存储提取节点的原始 ID。output_device (框架特定的设备上下文对象, 可选) – 输出设备。默认与输入图相同。
- 返回值:
DGLGraph – 子图。
Tensor 或 dict[str, Tensor], 可选 – 节点重新标记后输入
nodes
的新 ID。仅当relabel_nodes
为 True 时返回。其形式与nodes
相同。
注意事项
当 k 为 1 时,结果子图与通过
dgl.out_subgraph()
获得的子图不同。1 跳出子图也包含邻域内部的边。示例
以下示例使用 PyTorch 后端。
>>> import dgl >>> import torch
从同构图中提取一个两跳子图。
>>> g = dgl.graph(([0, 2, 0, 4, 2], [1, 1, 2, 3, 4])) >>> g.edata['w'] = torch.arange(10).view(5, 2) >>> sg, inverse_indices = dgl.khop_out_subgraph(g, 0, k=2) >>> sg Graph(num_nodes=4, num_edges=4, ndata_schemes={'_ID': Scheme(shape=(), dtype=torch.int64)} edata_schemes={'w': Scheme(shape=(2,), dtype=torch.int64), '_ID': Scheme(shape=(), dtype=torch.int64)}) >>> sg.edges() (tensor([0, 0, 2, 2]), tensor([1, 2, 1, 3])) >>> sg.edata[dgl.EID] # original edge IDs tensor([0, 2, 1, 4]) >>> sg.edata['w'] # also extract the features tensor([[0, 1], [4, 5], [2, 3], [8, 9]]) >>> inverse_indices tensor([0])
从异构图中提取一个子图。
>>> g = dgl.heterograph({ ... ('user', 'plays', 'game'): ([0, 1, 1, 2], [0, 0, 2, 1]), ... ('user', 'follows', 'user'): ([0, 1], [1, 3])}) >>> sg, inverse_indices = dgl.khop_out_subgraph(g, {'user': 0}, k=2) >>> sg Graph(num_nodes={'game': 2, 'user': 3}, num_edges={('user', 'follows', 'user'): 2, ('user', 'plays', 'game'): 2}, metagraph=[('user', 'user', 'follows'), ('user', 'game', 'plays')]) >>> inverse_indices {'user': tensor([0])}
另请参阅