dgl.khop_in_subgraph

dgl.khop_in_subgraph(graph, nodes, k, *, relabel_nodes=True, store_ids=True, output_device=None)[source]

返回由指定节点的k跳入邻域诱导的子图。

我们可以通过包含一组节点的前驱节点来扩展这组节点。从指定的节点集开始,通过在子图中重复节点集扩展k次,然后创建一个节点诱导子图来获得k跳子图。除了提取子图外,DGL还将提取的节点和边的特征复制到结果图中。这种复制是惰性的,只有在需要时才会进行数据移动。

如果图是异质的,DGL会为每个关系提取一个子图并将它们组合成结果图。因此,结果图具有与输入图相同的关系集。

Parameters:
  • graph (DGLGraph) – The input graph.

  • nodes (nodes or dict[str, nodes]) –

    The starting node(s) to expand, which cannot have any duplicate value. The result will be undefined otherwise. The allowed formats are:

    • Int: ID of a single node.

    • Int Tensor: Each element is a node ID. The tensor must have the same device type and ID data type as the graph’s.

    • iterable[int]: Each element is a node ID.

    If the graph is homogeneous, one can directly pass the above formats. Otherwise, the argument must be a dictionary with keys being node types and values being the node IDs in the above formats.

  • k (int) – The number of hops.

  • relabel_nodes (bool, optional) – If True, it will remove the isolated nodes and relabel the rest nodes in the extracted subgraph.

  • store_ids (bool, optional) – If True, it will store the raw IDs of the extracted edges in the edata of the resulting graph under name dgl.EID; if relabel_nodes is True, it will also store the raw IDs of the extracted nodes in the ndata of the resulting graph under name dgl.NID.

  • output_device (Framework-specific device context object, optional) – The output device. Default is the same as the input graph.

Returns:

  • DGLGraph – The subgraph.

  • Tensor or dict[str, Tensor], optional – The new IDs of the input nodes after node relabeling. This is returned only when relabel_nodes is True. It is in the same form as nodes.

注释

当k为1时,结果子图与通过dgl.in_subgraph()获得的子图不同。1跳入子图还包括邻居之间的边。

示例

以下示例使用PyTorch后端。

>>> import dgl
>>> import torch

从同质图中提取一个两跳子图。

>>> g = dgl.graph(([1, 1, 2, 3, 4], [0, 2, 0, 4, 2]))
>>> g.edata['w'] = torch.arange(10).view(5, 2)
>>> sg, inverse_indices = dgl.khop_in_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([1, 1, 2, 3]), tensor([0, 2, 0, 2]))
>>> sg.edata[dgl.EID]  # original edge IDs
tensor([0, 1, 2, 4])
>>> sg.edata['w']  # also extract the features
tensor([[0, 1],
        [2, 3],
        [4, 5],
        [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], [1, 2, 2])})
>>> sg, inverse_indices = dgl.khop_in_subgraph(g, {'game': 0}, k=2)
>>> sg
Graph(num_nodes={'game': 1, 'user': 2},
      num_edges={('user', 'follows', 'user'): 1, ('user', 'plays', 'game'): 2},
      metagraph=[('user', 'user', 'follows'), ('user', 'game', 'plays')])
>>> inverse_indices
{'game': tensor([0])}

另请参阅

khop_out_subgraph