dgl.add_edges

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

向图中添加边并返回一个新图。

第 i 条新边将从 u[i]v[i]。新边的 ID 将从 g.num_edges(etype) 开始。

参数:
  • u (int, Tensor or iterable[int]) – 源节点 ID,u[i] 表示第 i 条新边的源节点。

  • v (int, Tensor or iterable[int]) – 目标节点 ID,v[i] 表示第 i 条新边的目标节点。

  • data (dict[str, Tensor], optional) – 添加的边的特征数据。键是特征名称,值是特征数据。

  • etype (str or (str, str, str), optional) –

    边的类型名称。允许的类型名称格式为

    • (str, str, str) 表示源节点类型、边类型和目标节点类型。

    • 如果名称可以在图中唯一标识一个三元组格式,则可以是单个 str 边类型名称。

    如果图只有一种边类型,则可以省略。

返回值:

添加了新边的图。

返回类型:

DGLGraph

注意事项

  • 如果给定边的端点在 g 中不存在,则调用 dgl.add_nodes() 来添加这些节点。新节点的节点特征将用零填充。

  • 对于 g 中存在但不在 data 中的特征,DGL 会为新添加的节点分配零特征。

  • 对于在 data 中存在但不在 g 中的特征,DGL 会为图中现有节点分配零特征。

  • 此函数会丢弃批处理信息。请在变换后的图上使用 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 = dgl.add_edges(g, torch.tensor([1, 3]), torch.tensor([0, 1]))
>>> g.num_edges()
4

由于 uv 包含不存在的节点 ID,这些节点会被隐式添加。

>>> g.num_nodes()
4

如果图已经有一些边特征,并且添加的新边没有特征,则它们的特征将被填充为零。

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

在添加新边时,你也可以为新边分配特征。

>>> g = dgl.add_edges(g, 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 包含新的特征字段,旧边的特征将被填充为零。

>>> 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.num_edges('plays')
4
>>> g = dgl.add_edges(g, torch.tensor([3]), torch.tensor([3]), etype='plays')
>>> g.num_edges('plays')
5