dgl.metapath_reachable_graph(g, metapath)[source]

Return a graph where the successors of any node u are nodes reachable from u by the given metapath.

If the beginning node type s and ending node type t are the same, it will return a homogeneous graph with node type s = t. Otherwise, a unidirectional bipartite graph with source node type s and destination node type t is returned.

In both cases, two nodes u and v will be connected with an edge (u, v) if there exists one path matching the metapath from u to v.

The result graph keeps the node set of type s and t in the original graph even if they might have no neighbor.

The features of the source/destination node type in the original graph would be copied to the new graph.

  • g (DGLGraph) – The input graph

  • metapath (list[str or tuple of str]) – Metapath in the form of a list of edge types


A homogeneous or unidirectional bipartite graph. It will be on CPU regardless of whether the input graph is on CPU or GPU.

Return type



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.


>>> g = dgl.heterograph({
...     ('A', 'AB', 'B'): ([0, 1, 2], [1, 2, 3]),
...     ('B', 'BA', 'A'): ([1, 2, 3], [0, 1, 2])})
>>> new_g = dgl.metapath_reachable_graph(g, ['AB', 'BA'])
>>> new_g.edges(order='eid')
(tensor([0, 1, 2]), tensor([0, 1, 2]))