开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第14天
本文首发于CSDN。
3. 可用方法
- 切片获取节点/边对象,返回字典形式,键是对象的属性(如
x),值是属性值
paper_node_data = data['paper']
cites_edge_data = data['paper', 'cites', 'paper']
- 如果边类型或节点对类型可以唯一确定一种边,那这样也可以:
cites_edge_data = data['paper', 'paper']
cites_edge_data = data['cites']
- 增删属性、节点类型、边类型:
data['paper'].year = ... # Setting a new paper attribute
del data['field_of_study'] # Deleting 'field_of_study' node type
del data['has_topic'] # Deleting 'has_topic' edge type
- metadata:一个有两个元素的元组,元素是列表。第一个列表的元素是节点类型,第二个列表的元素的边类型。
node_types, edge_types = data.metadata()
print(node_types)
['paper', 'author', 'institution']
print(edge_types)
[('paper', 'cites', 'paper'),
('author', 'writes', 'paper'),
('author', 'affiliated_with', 'institution')]
- 转换设备:
data = data.to('cuda:0')
data = data.cpu()
- 图中是否有孤立点、自环、图是否无向、转换为同质图(注意:1. 我测试了一下,如果部分节点没有特征,如在构建ogbn-mag图时没有使用
preprocess入参,则转换为同质图时所有节点仍然都具有x特征(虽然在异质图中只有paper节点有特征),但本来没有标签的异质图中节点对应的特征值是NaN或者-1(具体是哪个我没看出来应该怎么判断,反正两种情况都是可能发生的)2. 原图中对应的节点/边类型会变成node_type和edge_type对应的数字)
data.has_isolated_nodes()
data.has_self_loops()
data.is_undirected()
homogeneous_data = data.to_homogeneous()
- 使用
torch_geometric.transforms对异质图对象进行转换(很多类似同质图上的操作):
data = T.ToUndirected()(data)
data = T.AddSelfLoops()(data)
data = T.NormalizeFeatures()(data)
将异质图转换为无向图:增加反向边,使信息传播可以在各边上双向进行;如有必要还会增加反向边类型
示例:
import torch_geometric.transforms as T
T.ToUndirected()(data)
输出:
HeteroData(
paper={
x=[736389, 128],
year=[736389],
y=[736389],
train_mask=[736389],
val_mask=[736389],
test_mask=[736389]
},
author={ x=[1134649, 128] },
institution={ x=[8740, 128] },
field_of_study={ x=[59965, 128] },
(author, affiliated_with, institution)={ edge_index=[2, 1043998] },
(author, writes, paper)={ edge_index=[2, 7145660] },
(paper, cites, paper)={ edge_index=[2, 10792672] },
(paper, has_topic, field_of_study)={ edge_index=[2, 7505078] },
(institution, rev_affiliated_with, author)={ edge_index=[2, 1043998] },
(paper, rev_writes, author)={ edge_index=[2, 7145660] },
(field_of_study, rev_has_topic, paper)={ edge_index=[2, 7505078] }
)
增加自环:每种边都会加