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]))