AddMetaPaths

class dgl.transforms.AddMetaPaths(metapaths, keep_orig_edges=True)[source]

Bases: BaseTransform

Add new edges to an input graph based on given metapaths, as described in Heterogeneous Graph Attention Network.

Formally, a metapath is a path of the form

\[\mathcal{V}_1 \xrightarrow{R_1} \mathcal{V}_2 \xrightarrow{R_2} \ldots \xrightarrow{R_{\ell-1}} \mathcal{V}_{\ell}\]

in which \(\mathcal{V}_i\) represents a node type and \(\xrightarrow{R_j}\) represents a relation type connecting its two adjacent node types. The adjacency matrix corresponding to the metapath is obtained by sequential multiplication of adjacency matrices along the metapath.

Parameters:
  • metapaths (dict[str, list]) – The metapaths to add, mapping a metapath name to a metapath. For example, {'co-author': [('person', 'author', 'paper'), ('paper', 'authored by', 'person')]}

  • keep_orig_edges (bool, optional) – If True, it will keep the edges of the original graph. Otherwise, it will drop them.

Example

>>> import dgl
>>> from dgl import AddMetaPaths
>>> transform = AddMetaPaths({
...     'accepted': [('person', 'author', 'paper'), ('paper', 'accepted', 'venue')],
...     'rejected': [('person', 'author', 'paper'), ('paper', 'rejected', 'venue')]
... })
>>> g = dgl.heterograph({
...     ('person', 'author', 'paper'): ([0, 0, 1], [1, 2, 2]),
...     ('paper', 'accepted', 'venue'): ([1], [0]),
...     ('paper', 'rejected', 'venue'): ([2], [1])
... })
>>> new_g = transform(g)
>>> print(new_g.edges(etype=('person', 'accepted', 'venue')))
(tensor([0]), tensor([0]))
>>> print(new_g.edges(etype=('person', 'rejected', 'venue')))
(tensor([0, 1]), tensor([1, 1]))