之前做过一点知识图谱相关的工作,了解过一些图相关的知识,可惜之前没有做好记录,只是做了相关内容,具体细节已经忘掉了。

正好毕业设计也是这方面相关的,涉及图神经网络和数据处理方面的,不过嘛,毕业设计的水分还是很足的,大部分是工程相关的,因此也是主要来写怎么处理工程问题,而不是相关算法问题,算法主要是通过复现老师的代码。

神经网络相关

数据集

一共有两类数据集,分别是基础数据集和 reddit 数据集。下面分别介绍这两种数据集。

基础数据集

所谓基础数据集指的是 torch_geometric 中自带的数据集,本次只使用了两种类别,其他内置数据集就没有认真调查了,这两类分别是 Planetoid 和 Amazon。

Planetoid 的名称是来自论文 Revisiting Semi-Supervised Learning with Graph Embeddings. Zhilin Yang, William W. Cohen, Ruslan Salakhutdinov. ICML 2016.

Amazon Amazon Co-purchase Dataset(亚马逊共购数据集)是一组基于Amazon网站“Customers Who Bought This Item Also Bought”功能的开放图数据集,用于研究产品间的共购关系和消费者行为模式。

torch_geometric 中返回的数据格式为,以 cora 为例子,Planetoid 和 Amazon 返回格式基本相同。

1
Data(x=[2708, 1433], edge_index=[2, 10556], y=[2708], train_mask=[2708], val_mask=[2708], test_mask=[2708])

这里面的相关含义:

  • x=[2708, 1433]:(节点特征矩阵)节点数;每个节点的维度特征
  • edge_index=[2, 10556]:(边索引矩阵,邻接矩阵)起点;终点;(方向,无向图就没有)
  • y=[2708]:(节点标签):节点数
  • train_mask=[2708]:(训练集掩码)
  • val_mask=[2708]:(验证集掩码)
  • test_mask=[2708]:(测试集掩码)

Reddit

reddit 数据集主要的格式为

1
{"directed": false, "graph": {}, "nodes": [{"test": false, "id": "2hgylt", "val": false}], "links":[]}

数据处理

  • 处理为 COO 格式,然后直接手动计算两层多阶邻域特征,加速运算(本质是一阶切比雪夫近似),我自己也没看的特别懂,具体可以参考知乎文章
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
def get_adj_feats(target_data):
"""
从图数据中提取邻接矩阵和特征

处理流程:
1. 构建邻接矩阵(从edge_index)
2. 添加自环
3. 归一化邻接矩阵
4. 计算两跳邻接矩阵(norm_adj^2)
5. 使用两跳邻接矩阵进行特征传播(相当于2层GCN)

Args:
target_data: torch_geometric数据对象,包含edge_index和x

Returns:
feat: 传播后的节点特征 [num_nodes, feat_dim]
norm_adj2: 两跳归一化邻接矩阵
"""
# 从edge_index构建邻接矩阵(COO格式)
adj0 = sp.coo_matrix((np.ones(target_data.edge_index.shape[1]),
(target_data.edge_index[0, :], target_data.edge_index[1, :])),
shape=(target_data.num_nodes, target_data.num_nodes), dtype=np.float32)

# 添加自环(每个节点连接到自身)
adj = adj0 + sp.eye(adj0.shape[0])

# 归一化邻接矩阵
norm_adj = normalize_adj(adj)
# 计算两跳邻接矩阵(相当于2层GCN的传播),在计算新的节点特征时,不仅要考虑邻居节点的信息,也可以将自身节点的信息考虑进去。
norm_adj2 = norm_adj @ norm_adj

# 获取原始特征
feat0 = target_data.x

# 使用两跳邻接矩阵进行特征传播
# 这相当于执行了2层GCN的前向传播:H^(2) = A^2 * X
feat2 = norm_adj2 @ feat0

# 可选:也可以拼接不同层的特征 [feat0, feat1, feat2]
# feat = np.concatenate((feat0, feat1, feat2), axis=1)
feat = feat2

return feat, norm_adj2

COO 格式主要是通过 (row,col,data)的形式来保存,但是是通过三个数据分别来进行保存的
alt text

工程设计相关

Neo4j

安装

至于 jdk21 的安装,可以直接使用 open jdk,ubuntu 直接安装就行

1
sudo apt install openjdk-21-jre

关于多版本 jdk 怎么处理,和其他 neo4j 安装的相关内容可以参考这部分安装指南