基于PMA的邻接数组
- 目标: 高效支持更新,避免全局重建。
- 方法:
- 用 Packed Memory Array (PMA) 存储快照,元素间预留空隙。
- 插入/删除操作可通过局部移动元素完成,大幅降低更新开销。
- 提出新的空隙分配与再平衡策略,适应时序图的动态特性。

变化感知的快照创建
- 目标: 智能选择何时创建关键快照 (Key Snapshot)。
- 方法:
- 定义差异度
TD (Temporal Discrepancy) 衡量连续快照间变化度。
- 当
TD > β (阈值,经验值 0.03) 时,才创建新的关键快照。
- 克服了基于固定时间或固定日志大小方法的缺陷,实现动态优化。
日志合并方法
- 目标: 减少查询时需要处理的日志量。
- 方法:
- 在合并前对日志进行预处理,消除对同一元素的冗余操作。
- 例如:多次插入视为最后一次插入;插入后删除则视为无操作。
系统设计
- 数据结构: 将数据划分为多个 Shard,每个 Shard 包含一个PMA快照和一段日志。
- 查询引擎: 查询时,找到最近的关键快照,应用合并后的日志,快速重构目标时间点的图状态。
实验效果
- 对比对象: Chronos (Copy-Based), GraphPool (Log-Based), Pensieve (Hybrid)。
- 结果:
- vs. GraphPool: 查询效率 平均提升86%,内存开销降低 9%~57%。
- vs. Chronos: 查询效率 平均提升53%,内存开销 大幅降低。
- vs. Pensieve: 查询时间 最多减少12.5倍 (因避免远程重建),内存开销约为其3.2倍但是可接受的权衡。
- 自身组件的有效性: PMA模型更新效率远高于CSR/AdjList;波动感知策略在存储和查询时间上均优于基于周期或随机的方法。
从一阶游走到二阶随机游走
- 图表示学习把节点映射为低维向量
- 学习样本从哪里来?随机游走是生成训练语料的核心手段
- 历史沿革:
- 一阶(DeepWalk) → 二阶定义(node2vec) → 系统挑战 → 系统方案(SOWalker) → 有偏一阶优化(HuGE) → 分布式(DistGER-Pipe)
- 核心问题:为什么要"二阶",二阶体现在哪?为什么比一阶更难?
图表示学习:为什么需要它
- 图数据持续增大 → 空间开销(状态向量,邻接矩阵)算力需求(矩阵运算)开销巨大
- 图表示学习 → 对于 有 ,映射为低维稠密的实值向量

随机游走是一类图抽样方法
| 类别 |
代表方法 |
特点 |
| 基于矩阵分解 |
LLE(Science'00), Laplacian Eigenmaps(NIPS'01), HOPE(SIGKDD'16), STRAP(KDD’19), ProNE(IJCAI'19) |
时间和空间开销大、依赖相似矩阵的选择 |
| 基于随机游走 |
DeepWalk(KDD'14), LINE(KDD'15), Node2Vec(KDD'16), Struct2Vec(KDD’17), DiaRW(FGCS’19) |
扩展性更好(时间和空间)、适应性更强 |

DeepWalk:一阶随机游走 + Skip-gram (KDD'14)
- 做法:在图上做随机游走生成节点序列 → 当作"句子"用 Skip-gram 训练嵌入
- 一阶转移:下一步只依赖当前节点
node2vec:把"二阶"形式化 (KDD'16)
- 一阶游走丢失结构信息:无法同时刻画同质性(homophily)与结构等价性(structural equivalence)
- node2vec 用 p, q 参数控制游走偏置,转移概率由"前驱 + 当前"联合状态决定

node2vec:二阶转移概率
- 这就是"二阶":状态是 而非仅 ,状态空间膨胀到 O(|E|)
node2vec:二阶转移概率
这一页讲的是 node2vec 随机游走最核心的设计:二阶游走,区别于普通的一阶随机游走。
普通图随机游走:走到当前节点 ,下一步只看 的邻居,按边权重挑下一个点。
状态只由当前节点决定,不记得上一步从哪来。
缺点:没法灵活控制游走是偏向“深度优先DFS”还是“广度优先BFS”。
游走做选择时,不仅看现在在哪,还记得刚才从哪个点过来,所以叫二阶转移。
公式解析
- :节点 和邻居 之间原始边权重
- :矫正系数,由 (来路节点)和候选邻居 的最短距离 决定
三种距离
是上一站, 是当前站, 是候选下一站:
- : 就是来路节点 ,也就是走回头路。权重乘 。
- : 和来路节点 直接相连。相当于就在附近小范围逛,系数=1,正常概率。
- : 和来路节点 不直接相连,只能通过当前点 连通,相当于向外探索更远节点。权重乘 。
- :压低向外探索概率 → 偏向BFS,聚焦局部邻居;
- :鼓励走远一点 → 偏向DFS,往图深处探索。
代价:状态空间变大
一阶游走状态数 = 节点数量 ;
二阶游走状态是 节点对,最多 ,和图的边数相当。
好处:只用两个超参,就能同时兼顾BFS(捕捉局部结构)和DFS(捕捉全局社区结构);
代价:需要维护更多状态,计算开销比简单随机游走更大。
价值:蕴含微观结构
通过这种带记忆的二阶随机游走,生成节点序列,再丢给word2vec训练,得到节点向量 embedding。向量同时保留图的局部近邻关系 + 社区结构。
二阶游走的系统挑战

研究问题:外存上的二阶转移
- 一阶:顺序扫描邻接表,I/O 友好
- 二阶:每一步都要查"从 出发的候选",外存上产生大量小随机读
- 核心问题:如何在外存(out-of-core)上高效执行二阶转移,把随机 I/O 压下去?
现场演示:分块 I/O 上的一阶 / 二阶游走
(karate 34 点 / 4 块 / 内存仅 M=2 块,逐轮换入换出,左上角实时累计块 I/O 次数)
KnightKing 与 GraSorw
- KnightKing (SOSP'19):分布式内存式通用游走引擎,支持一阶/二阶语义,但状态全在内存,难扩展到超大图
- GraSorw (VLDB'22):首个 out-of-core 二阶游走系统,把状态溢出到外存,但 I/O 调度仍非最优
- 二者铺垫出本组工作的切入点:面向二阶的 I/O 优化
SOWalker:I/O 优化的外存二阶游走 (ATC'23)
- 背景:现有系统在二阶转移上产生大量随机 I/O,成为性能瓶颈

SOWalker:动机
- 关键观察:二阶游走中大量状态更新是"不可更新/冗余"的,直接加载造成 I/O 浪费

SOWalker:三大贡献
- Walk Matrix(游走矩阵):记录游走、避免加载不可更新的游走,消除无用游走 I/O
- Benefit-Aware I/O Model(效益感知 I/O 模型):优先加载累积可更新游走最多的数据块
- Block Set-Oriented Walk Updating(块集导向更新):每个游走在已加载块内尽可能多走步

SOWalker:评测
- vs GraphWalker:最高 10.2× 加速
- vs GraSorw:5.7× 加速,I/O 量减少 80%+

SOWalker:评测(扩展性)

另一条路:熵驱动的有偏一阶游走 (HuGE / HuGE+)
- 注意:HuGE 系列是信息熵驱动的有偏一阶游走,定位为"游走质量优化",并非二阶系统
- 样本规模数十倍于图数据,无法在一周内完成千万节点表示学习
- 动态调节采样,减少冗余 [FGCS 2019]:顶点度与游走冗余的关系
- 用信息熵理论估计游走冗余 [ICDE 2021]
- 多核并行增强系统扩展 [IEEE ToBD 2023]
HuGE 的启发式随机游走 (HRW)
- 节省游走:启发式随机游走(HRW) / 自适应游走长度 / 自适应游走次数
- 实现:内存占用优化 / 细粒度多线程并行
HuGE/HuGE+ 评测
- 内存占用平均降低 68.9%,运行时间与图大小呈线性关系

HuGE/HuGE+ 评测(链接预测与分类)

HuGE/HuGE+ 评测(效率与内存)

定位小结:有偏一阶 vs 二阶
- HuGE 系(有偏一阶):优化游走质量、降冗余、省内存 —— 与二阶互补不替代
- SOWalker(二阶):攻克外存二阶的随机 I/O 挑战
- 二者分别回答"游走得更好"与"游走得动更大图"
走向分布式:DistGER-Pipe (TKDE'25)
- 单图外存之上,进一步用多机流水线执行二阶游走
- 图划分 → 二阶采样 → I/O 优化层 → 嵌入训练,各分区并行、I/O 与计算重叠

异构加速与应用衔接
- GOWalker(CPU-GPU 异构):V100 平台上较 CPU 实现加速 2.2–4.1×
- KOWalker(KG 增强问答):把二阶游走嵌入用于知识图谱问答,H@1 / F1 提升 8.2 / 5.5 个百分点
- → 下一节进入知识图谱,看表示学习如何支撑 KG 与 LLM
异构图与知识图谱基础
- 异构图:图中包含多种节点类型和边类型。
- **知识图谱(KG)**是一种典型的异构图:
- 节点表示实体(如人、药物、论文等)。
- 边表示实体之间的关系(如“作者”、“治疗”、“引用”等)。
- 知识图谱的特点:
- 大规模(数百万节点和边)。
- 不完整(很多真实关系缺失)。
- 无法枚举所有可能的事实,因此需要预测缺失的链接。
知识图谱嵌入(KG Embedding)
目标:将实体和关系嵌入到低维向量空间中,使得存在的关系在嵌入空间中“接近”。
基本思想
- 每个实体和关系都用一个向量表示。
- 定义一个评分函数 来衡量三元组 的合理性。
- 通过训练使得真实三元组的得分高,虚假三元组的得分低。
常见的KG嵌入模型
| 模型 |
嵌入空间 |
评分函数 |
对称性 |
反对称性 |
逆关系 |
组合性 |
一对多 |
| TransE |
ℝ^d |
−‖h + r − t‖ |
✗ |
✓ |
✓ |
✓ |
✗ |
| TransR |
ℝ^d → ℝ^k |
−‖M_r h + r − M_r t‖ |
✓ |
✓ |
✓ |
✓ |
✓ |
| DistMult |
ℝ^d |
⟨h, r, t⟩ |
✓ |
✗ |
✗ |
✗ |
✓ |
| ComplEx |
ℂ^d |
Re(⟨h, r, t⟩) |
✓ |
✓ |
✓ |
✗ |
✓ |
| RotatE |
ℂ^d |
−‖h ∘ r − t‖ |
✓ |
✓ |
✓ |
✓ |
✗(弱支持) |
模型特点与适用场景
- TransE:简单高效,适合快速实验,但不能处理对称关系和一对多关系。
- TransR:通过引入关系特定的投影矩阵,增强了表达能力,能建模更复杂的关系。
- DistMult:使用点积,能处理对称关系,但无法区分头尾实体,无法建模反对称关系。
- ComplEx:引入复数空间,能建模反对称和逆关系,是目前常用的强模型之一。
- RotatE:在复数空间中进行旋转操作,能建模多种关系类型,性能较好。
实际建议
- 不同知识图谱的关系模式差异大,没有通用最优模型。
- 快速尝试:先用 TransE。
- 进一步提升:使用 ComplEx 或 RotatE 等更具表达力的模型。
| 技术路径 |
核心机制 |
对LLM的要求 |
优点 |
缺点/挑战 |
代表性工作 |
| 基于数据集微调 |
利用包含推理路径的特定领域数据集对LLM进行微调,将知识内化到模型参数中。 |
需要访问模型参数并进行训练。 |
推理速度快(无需实时检索);能深度整合领域知识。 |
知识更新困难,需要重新训练;训练成本高;可能过拟合特定数据集。 |
MedReason, JKEM |
| 基于提示工程与检索增强 |
在推理时,从KG中检索相关知识,并将其作为上下文(Prompt)的一部分输入给LLM。 |
无需修改模型参数,可应用于任何LLM。 |
灵活、高效,知识可实时更新;实现相对简单。 |
受限于上下文窗口长度;检索质量直接影响性能;可能引入无关噪声。 |
DR.KNOWS |
| 基于推理路径探索与验证 |
将LLM作为智能体,在KG上动态探索、生成并评估多条推理路径,选择最优路径作为答案依据。 |
需要LLM具备强大的零样本或少样本推理和评估能力。 |
可解释性强,能提供完整的推理链条;无需训练,通用性好。 |
推理过程复杂,计算开销大;路径探索的效率和准确性是关键。 |
RwT, REKG-MCTS |
知识图谱帮助思维链
- 大语言模型 (LLMs) 在诸多NLP任务上表现出色,但在复杂推理(算数、常识、符号)任务上仍存在显著局限。
- 思维链推理 (Chain-of-Thought Reasoning) 通过让LLM生成中间推理步骤,有效提升了多步推理任务的性能。
关键问题
-
通用思维链难专精
- 推理链生成基于LLM自身生成,无法利用知识图谱形成严谨逻辑
- 在医疗、法律、金融等高风险领域,此问题带来不可估量的风险
- 例: 在AQuA数据集上,多种CoT方法的准确率均低于55%。
-
自然语言提示词表述模糊
- 自然语言思维链易理解,但推理准确性不如代码式提示
- 代码提示复杂性高、领域局限性大、语言风格单一
实验设置
- 模型: ERNIE-Speed, GPT-4o mini, GLM-4-flash, GPT-4o等
- 数据集 (9个):
- 通用领域: AQuA, GSM8K, MultiArith, SingleEq, HotpotQA, CSQA, SIQA, Last Letter, Coin Flip.
- 垂直领域: LawBench, LegalBench, CFBenchmark, AGIEval.
主要结果
提升通用任务
| Method |
AQuA |
GSM8K |
... |
Average |
| Zero-shot-CoT |
43.4 |
78.3 |
... |
72.4 |
| Manual-CoT |
54.3 |
85.8 |
... |
77.3 |
| PS |
50.1 |
82.8 |
... |
75.2 |
| CoT-RAG |
65.7 |
94.7 |
... |
89.1 |
适配垂直领域
- 准确率远超其他基于图谱的RAG方法(如KG-CoT, GraphRAG, ToG等)。
- 专家构建的DT至关重要:零专家参与(LLM自建DT)的变体性能下降 7.8%。
二阶随机游走采样器实验
实验背景
- 回顾本节:二阶随机游走的瓶颈是外存上的随机 I/O——状态空间从 O(|V|) 膨胀到 O(|E|),每一步都要按 跳查下一跳。
- 本实验要求你亲手实现一个 out-of-core 的二阶游走采样器,在范例图上体会数据布局与 I/O 优化的权衡。
实验内容
- 必做:实现二阶转移——按 联合状态查下一跳,支持 node2vec 的 p/q 偏置;
- I/O 优化(至少选一):分块加载邻接表 / Walk Matrix 避免冗余游走 / 效益感知预取(呼应 SOWalker 三贡献);
- 参考:分块 I/O 动态演示(调度策略:round-robin / state-aware / AUW,对照你自己实现的 I/O 计数)
二阶随机游走采样器实验:评测与提交
评测指标(双指标)
- 采样吞吐(samples/s):在给定图上达到的每秒游走步数;
- 访存开销:分块加载次数。
- 评分构成:方法报告与可复现性 ≥ 70%,排行榜排名占比 ≤ 30%。
提交要求
- 提交 Python Notebook / 源码 + 实验报告(在 Notebook 中逐栏说明模型、I/O 优化、结果与结论);
- 向头歌平台提交。
时间安排
- 开始日期 / 提交日期:本学期暂不要求提交此项实验作业。
首先当然要了解一下这类系统服务的对象,请大家想一想身旁的图数据相关应用都有哪些?不拘泥于几年前课堂上所学的最短路径算法
GMV(Gross Merchandise Volume,商品交易总额)指在一定时间段内,平台上所有已付款订单的金额总和,不含优惠券、退款及任何形式的手续费。在电商大促场景中,它是衡量平台成交规模和业务增长的核心指标。
以面向对象的物模型(Device-Model)描述数据中心内所有可被监控的实体(供配电、暖通、安防、服务器、虚拟机、容器、告警事件等),并将实体之间的拓扑依赖自动转化为图模型;利用实时图计算引擎对流式告警进行秒级收敛、根因定位与影响面分析。换言之,“物模型” 就是 IDC 运维场景下的设备数字化模型,把每个物理或逻辑对象抽象为带属性、带关系的节点;图计算引擎在这些节点/边上运行连通性、最短路径、子图匹配等算法,实现秒级故障定位。
密接(Close Contact) 的判定基于时空重叠度,具体定义如下:
如果两个人在 同一场所(同一小区、同一超市、同一交通工具等) 且 时间差 ≤ 30 分钟,则在该有向图上建立一条 “可能接触” 边,并标记 接触时长 与 空间距离 两个属性。
当接触时长 ≥ 10 分钟 且 距离 ≤ 1 米 时,该边被进一步升级为 “密切接触” 边,视为需要隔离的高风险关系。
文章随后利用图数据库的 3 跳查询,一次性把满足上述条件的 所有密切接触者和场所 全部拉出,用于后续精准隔离与流调。
正如知名的Hadoop系统,其实是MapReduce框架的开源实现,其上构建的Spark GraphX也是Pregel的重视复现
系统内以属性图的形式,通过规范化的编程框架来实现复杂的图应用
比方说这个用来找寻维基百科热门社区的应用,里面就包含了两路并行的图分析过程
作为高校的科研成果,GraphLab则更强调处理的范式,结合Pregel的顶点中心计算框架,提出了GAS模型
专攻图数据处理的系统,还专门分支出了一个门类,如今被归类为一种NoSQL的图数据库,曾经风光一时,但是其中最具标志意义的创业公司Neo4j的发展却颇为坎坷,最近倒是又有新的契机闪过,即KG与LLM的合作
这里指代的就是前面提到的 Pregel 系统以及 GraphChi。
为了深入认识这些图处理系统背后的设计方法,有必要回顾一下我们以往学习的计算机系统相关知识
这就是一个典型的并行处理结构,试问其并行任务工作在什么级别呢?
这里则是一个典型的层次存储结构,试问其出现的动机又是什么呢?
趁着刚刚重温了相关概念,这里审视一下目标应用的特点,首先点个题,图应用最突出的存储器访问特点在于这两者:偏斜性和随机性,两者分别是分布式处理和分层存储架构的大敌
上次我们谈到图这种特点鲜明,价值深远的应用,其构造具有偏斜性,行为具有随机性,而支撑其运转的系统,则仰赖各个层级的并行性,以及塑造层次存储的局部性,然而这里面涌现出天然的矛盾,构成了我们面前的第一重挑战
从这个问题开始,我们演示一下作为一名研究生,大致的学习过程应该是怎样的
首先,之前学习的记忆里,告诉我们局部性这样一个概念,我们很自然的希望从如今的实验环境中找出来
当时课本上是一个什么样的表述呢?我们少许回顾一下
三种布局各 128 点的 BFS,CacheLab trace 按 CSR 边数组 / 索引数组 / visited / frontier 着色分区,可播放、缩放、悬停看命中哪个数组元素
不过,不同阶段,重点可不一样,前面更关注活跃数据的主流,后面则更关注不活跃数据的淘汰
一句话理解 p 和 q
- $p$:**返回参数**,控制有多大概率原路折返;
- $q$:**进出参数**,控制是原地打转(BFS)还是往深处走(DFS)。
演示要点:① 一阶只需 curr 块在内存,二阶需 prev+curr 两块共驻,I/O 涨得更快;② 策略切到「二阶 · naive」可见第 65 轮起 0 推进 —— 这就是 SOWalker 说的 non-updatable walks;③ 「并排对比」模式左右同步推进看 I/O 斜率差
**三阶段设计 (Three-Stage Design)**
**Stage 1: 知识图谱驱动的CoT生成 (Knowledge Graph-driven CoT Generation)**
* **专家介入:** 领域专家构建一次性的、粗粒度的**决策树 (DT)**,封装领域推理逻辑。
* **LLM转化:** LLM将DT分解并转化为结构清晰、高度透明的**知识图谱 (KG)**。
* **KG节点:** 每个实体包含 `Sub-question`, `Sub-case`, `Sub-description`, `Answer` 属性。
* **优势:** 增强可控性、可靠性与领域适应性。
**Stage 2: 可学习的知识案例感知RAG (Learnable Knowledge Case-aware RAG)**
* **LLM驱动的检索:** (非传统向量检索)利用LLM从用户长查询描述中,为KG中的每个实体精准提取对应的 `Sub-description`。
* **动态更新:** 新的用户查询可以反过来动态更新DT中的 `Knowledge case`,使知识图谱持续进化。
**Stage 3: 伪程序提示执行 (Pseudo-Program Prompting Execution)**
* **执行方式:** LLM将KG表示为**伪程序知识图谱 (PKG)** 并逐步执行。
* **优势:**
* **兼具NL与Code优点:** 像代码一样逻辑严谨,又如自然语言一般易于理解和通用。
* **无需外部解释器:** 摆脱对Python解释器等环境的依赖。
* **可扩展性强:** 可适配C++, Java等语言风格(见附录)。