dgl.khop_graph¶

dgl.khop_graph(g, k, copy_ndata=True)[source]

Return the graph whose edges connect the k-hop neighbors of the original graph.

More specifically, an edge from node u and node v exists in the new graph if and only if a path with length k exists from node u to node v in the original graph.

The adjacency matrix of the returned graph is $$A^k$$ (where $$A$$ is the adjacency matrix of $$g$$).

Parameters
• g (DGLGraph) – The input graph.

• k (int) – The $$k$$ in k-hop graph.

• copy_ndata (bool, optional) –

If True, the node features of the new graph are copied from the original graph.

If False, the new graph will not have any node features.

(Default: True)

Returns

The returned graph.

Return type

DGLGraph

Notes

If copy_ndata is True, the resulting graph will share the node feature tensors with the input graph. Hence, users should try to avoid in-place operations which will be visible to both graphs.

This function discards the batch information. Please use dgl.DGLGraph.set_batch_num_nodes() and dgl.DGLGraph.set_batch_num_edges() on the transformed graph to maintain the information.

Examples

Below gives an easy example:

>>> import dgl
>>> g = dgl.graph(([0, 1], [1, 2]))
>>> g_2 = dgl.transforms.khop_graph(g, 2)
>>> print(g_2.edges())
(tensor([0]), tensor([2]))


A more complicated example:

>>> import dgl
>>> g = dgl.graph(([0,1,2,3,4,0,1,2,3,4], [0,1,2,3,4,1,2,3,4,0]))
>>> dgl.khop_graph(g, 1)
DGLGraph(num_nodes=5, num_edges=10,
ndata_schemes={}
edata_schemes={})
>>> dgl.khop_graph(g, 3)
DGLGraph(num_nodes=5, num_edges=40,
ndata_schemes={}
edata_schemes={})