一、构图:
import dgl
import torch
# Source nodes for edges (2, 1), (3, 2), (4, 3)
src_ids = torch.tensor([2, 3, 4])
# Destination nodes for edges (2, 1), (3, 2), (4, 3)
dst_ids = torch.tensor([15, 16, 17])
g1 = dgl.graph((src_ids, dst_ids))
fig, ax = plt.subplots()
nx.draw(g1.to_networkx(), ax=ax)
二、in_subgraph探究
案例1
g1_sub1 = dgl.in_subgraph(g1, [17, 16])
g1_sub1.edges()
output:
(tensor([4, 3]), tensor([17, 16]))
可视化:
fig, ax = plt.subplots()
nx.draw(g1_sub1.to_networkx(), ax=ax)
案例2
g1_sub2 = dgl.in_subgraph(g1, [3, 4])
g1_sub2.edges()
output:
(tensor([], dtype=torch.int64), tensor([], dtype=torch.int64))
可视化:
fig, ax = plt.subplots()
nx.draw(g1_sub2.to_networkx(), ax=ax)
案例3
g1_sub3 = dgl.in_subgraph(g1, [16])
fig, ax = plt.subplots()
nx.draw(g1_sub3.to_networkx(), ax=ax)
三、结论假设:
in_subgraph函数:通过输入节点ID返回连接它的边,方向一定是指向它的;
四、假设验证:
案例1
g4 = dgl.heterograph({ ('user', 'plays', 'game'): ([0, 1, 1, 2, 10], [0, 0, 2, 1, 10]), ('user', 'follows', 'user'): ([0, 1, 2], [1, 0, 0])})
sub_g = g4.in_subgraph({'user': [2], 'game': [2]})
sub_g
output:
Graph(num_nodes={'game': 11, 'user': 11},
num_edges={('user', 'follows', 'user'): 0, ('user', 'plays', 'game'): 1},
metagraph=[('user', 'user', 'follows'), ('user', 'game', 'plays')])
案例2
g4 = dgl.heterograph({ ('user', 'plays', 'game'): ([0, 1, 1, 2, 10], [0, 0, 2, 1, 10]), ('user', 'follows', 'user'): ([0, 1, 2], [1, 2, 0])})
sub_g = g4.in_subgraph({'user': [2], 'game': [2]})
sub_g
output:
Graph(num_nodes={'game': 11, 'user': 11},
num_edges={('user', 'follows', 'user'): 1, ('user', 'plays', 'game'): 1},
metagraph=[('user', 'user', 'follows'), ('user', 'game', 'plays')])
结论:假设是正确的