dgl.DGLGraph.add_edges

DGLGraph.add_edges(u, v, data=None, etype=None)[source]

为指定的边类型添加多条新边

第 i 条新边将从 u[i]v[i]

参数:
  • u (int, tensor, numpy.ndarray, list) – 源节点 ID,u[i] 表示第 i 条新边的源节点。

  • v (int, tensor, numpy.ndarray, list) – 目标节点 ID,v[i] 表示第 i 条新边的目标节点。

  • data (dict, 可选) – 添加的边的特征数据。特征数据的第 i 行对应于第 i 条新边。

  • etype (strtuple of str, 可选) – 新边的类型。如果图中只有一种边类型,则可以省略。

注意

  • 对当前图应用原地更新。

  • 如果要添加边的端点节点不存在,则会调用 add_nodes 添加新节点。新节点的节点特征将由使用 set_n_initializer() 定义的初始化器创建(默认初始化器填充零)。在某些情况下,建议先添加节点,然后再添加边。

  • 如果 data 的键不包含某些现有的特征字段,这些新边的特征将由使用 set_n_initializer() 定义的初始化器创建(默认初始化器填充零)。

  • 如果 data 的键包含新的特征字段,这些旧边的特征将由使用 set_n_initializer() 定义的初始化器创建(默认初始化器填充零)。

  • 此函数会丢弃批处理信息。请在转换后的图上使用 dgl.DGLGraph.set_batch_num_nodes()dgl.DGLGraph.set_batch_num_edges() 来保留信息。

示例

以下示例使用 PyTorch 后端。

>>> import dgl
>>> import torch

同质图或具有单一边类型的异质图

>>> g = dgl.graph((torch.tensor([0, 1]), torch.tensor([1, 2])))
>>> g.num_edges()
2
>>> g.add_edges(torch.tensor([1, 3]), torch.tensor([0, 1]))
>>> g.num_edges()
4

由于 uv 包含不存在的节点 ID,因此会隐式添加节点。 >>> g.num_nodes() 4

如果图具有一些边特征,并且添加新边时没有提供特征,则这些特征将由使用 set_n_initializer() 定义的初始化器创建。

>>> g.edata['h'] = torch.ones(4, 1)
>>> g.add_edges(torch.tensor([1]), torch.tensor([1]))
>>> g.edata['h']
tensor([[1.], [1.], [1.], [1.], [0.]])

我们也可以在添加新边时为其指定特征。

>>> g.add_edges(torch.tensor([0, 0]), torch.tensor([2, 2]),
...             {'h': torch.tensor([[1.], [2.]]), 'w': torch.ones(2, 1)})
>>> g.edata['h']
tensor([[1.], [1.], [1.], [1.], [0.], [1.], [2.]])

由于 data 包含新的特征字段,因此旧边的特征将由使用 set_n_initializer() 定义的初始化器创建。

>>> g.edata['w']
tensor([[0.], [0.], [0.], [0.], [0.], [1.], [1.]])

具有多种边类型的异质图

>>> g = dgl.heterograph({
...     ('user', 'plays', 'game'): (torch.tensor([0, 1, 1, 2]),
...                                 torch.tensor([0, 0, 1, 1])),
...     ('developer', 'develops', 'game'): (torch.tensor([0, 1]),
...                                         torch.tensor([0, 1]))
...     })
>>> g.add_edges(torch.tensor([3]), torch.tensor([3]))
DGLError: Edge type name must be specified
if there are more than one edge types.
>>> g.num_edges('plays')
4
>>> g.add_edges(torch.tensor([3]), torch.tensor([3]), etype='plays')
>>> g.num_edges('plays')
5