图数据库系列 · 第 02 篇——架构拆解:原生图存储到因果集群

无索引邻接 · Cypher 执行 · Raft 集群

目 录

一、导读

二、原生图存储引擎

[2.1 存储文件结构](#2.1 存储文件结构)

[2.2 无索引邻接(Index-free Adjacency)](#2.2 无索引邻接(Index-free Adjacency))

[2.3 固定大小记录与页缓存](#2.3 固定大小记录与页缓存)

[三、Cypher 执行与事务引擎](#三、Cypher 执行与事务引擎)

[3.1 查询生命周期](#3.1 查询生命周期)

[3.2 索引机制](#3.2 索引机制)

[3.3 ACID 事务](#3.3 ACID 事务)

四、因果集群架构

[4.1 Core Servers 与 Raft 共识](#4.1 Core Servers 与 Raft 共识)

[4.2 只读副本与读扩展](#4.2 只读副本与读扩展)

[4.3 因果一致性与书签](#4.3 因果一致性与书签)

[4.4 Fabric 分析集群](#4.4 Fabric 分析集群)

五、架构要点对比

[5.1 本篇小结](#5.1 本篇小结)

一、导读

第 01 篇认识了图数据库的定位与属性图模型。本讲以 Neo4j 为对象,逐层拆解其架构:底层是「原生图存储引擎」,把节点、关系、属性直接落盘并实现无索引邻接;中层是「Cypher 执行与事务引擎」,将声明式查询编译为执行计划并保证 ACID;上层是「因果集群」,用 Raft 协议构建高可用与水平扩展。三层递进,正是 Neo4j 性能与可靠性的来源。

二、原生图存储引擎

2.1 存储文件结构

Neo4j 的存储层由三类固定大小的记录文件构成,节点、关系、属性各司其职:

|-------------------------------|-------------------------------|------------|
| 存储文件 | 记录内容 | 作用 |
| neostore.nodestore.db | 节点 ID + 标签指针 + 属性指针 + 关系指针 | 定位节点及其关联 |
| neostore.relationshipstore.db | 关系 ID + 类型 + 起始/终止节点 + 双向链表指针 | 维护关系拓扑 |
| neostore.propertystore.db | 属性键 + 值 + 下一个属性指针 | 存储键值属性 |

2.2 无索引邻接(Index-free Adjacency)

每个节点记录直接包含指向其第一条关系的指针,关系记录又通过 prev/next 指针构成双向链表,串起同一节点的所有关系。这意味着遍历一条关系仅需一次 O(1) 指针跳转,无需查询任何索引;而关系库执行多跳 JOIN 要反复扫描 B+ 树索引,开销随跳数指数增长。官方数据表明,多跳查询比关系库快约 1000 倍。

2.3 固定大小记录与页缓存

所有记录采用固定字节长度,带来两个关键收益:给定 ID 可直接按偏移算出磁盘位置(O(1) 寻址),无需查找页表;同时提升页缓存命中率,避免变长字段导致的缓存行污染。生产环境建议将页缓存(dbms.memory.pagecache.size)设为数据集的 70%--80%,并把数据文件与事务日志分置独立磁盘,规避 I/O 竞争。

三、Cypher 执行与事务引擎

3.1 查询生命周期

Cypher 是声明式查询语言,执行经历四步:解析 → 查询优化器(规划器)生成逻辑计划 → 转换为物理执行计划 → 由 Cypher Runtime 执行。规划器依赖统计信息(各标签节点数、各类型关系数、索引选择性)选择最有效执行方式,执行计划会被缓存复用。示例:

|---------------------------------|
| // 声明式描述模式,由规划器选择最优执行路径 |
| MATCH (a:Person {name:"Alice"}) |
| RETURN a |

3.2 索引机制

Neo4j 5 提供多种索引:RANGE(范围)、POINT(空间)、TEXT(全文)、向量索引(加载于操作系统内存而非页缓存),以及基于属性的 B 树索引。索引选择性的统计会随数据变化在后台采样(db.resampleIndex() 可手动触发),供规划器生成高效计划。

3.3 ACID 事务

与其他 NoSQL 不同,Neo4j 是一个完全符合 ACID 的事务型数据库:写事务具备原子性、一致性、隔离性、持久性,事务中间状态与结果存于内存并在提交时落盘。运维可用 SHOW TRANSACTIONS 查看、TERMINATE TRANSACTIONS 终止运行中的事务,保障数据可靠性。

四、因果集群架构

4.1 Core Servers 与 Raft 共识

Neo4j 集群采用因果集群(Causal Clustering,自 3.1 起取代旧 HA 架构),核心服务器(Core Servers)是集群「大脑」,负责管理集群状态、领导者选举与事务处理。核心服务器间用 Raft 共识算法实现强一致:所有写入事务必须提交到当前领导者,领导者复制到多数派核心服务器后才认为提交成功,从而保证持久性。生产建议最小 3 个核心服务器。

4.2 只读副本与读扩展

只读副本(Read Replica Servers)异步从核心服务器拉取事务日志并重放,用于水平扩展读吞吐、隔离分析负载。写入仍走核心服务器,读可分流到只读副本,实现读写分离。

4.3 因果一致性与书签

集群的核心一致性保证是「因果一致性」:若客户端在事务 B 中看到了事务 A 的结果,则 B 之后的任何操作也一定能看到 A 的结果。这一保证通过传递事务书签(bookmark)实现,客户端用 neo4j:// URI 连接时可利用书签确保读到已确认写入的数据。

4.4 Fabric 分析集群

面向超大规模读扩展或隔离分析负载,Neo4j 提供 Fabric 复合图数据库:通过 Cypher 整合多个数据孤岛 / 分片进行联合查询,实现即时多集群查询与横向扩展,无需额外代理。

五、架构要点对比

|------------|-------------------|------------------|
| 维度 | 机制 | 作用 |
| 存储 | 原生图存储 + 无索引邻接 | O(1) 关系遍历,多跳高效 |
| 缓存 | Page Cache(堆外) | 缓存热数据,降低磁盘 I/O |
| 查询 | Cypher 声明式 + 执行计划 | 规划器选最优路径 |
| 事务 | ACID 事务 | 数据可靠,区别于其他 NoSQL |
| 高可用 | 因果集群 + Raft | 领导者选举、多数派提交 |
| 扩展 | 只读副本 + Fabric | 读扩展、跨集群联合查询 |

5.1 本篇小结

本讲从存储、执行、集群三层拆解 Neo4j 架构:原生图存储以指针跳转实现无索引邻接;Cypher 经规划器编译为执行计划并以 ACID 事务保证可靠;因果集群用 Raft 共识支撑高可用与读写分离。理解这三层,是后续核心原理、部署与选型的基础。

下一篇进入核心原理,深入无索引邻接的物理实现、Cypher 模式匹配与图算法。

相关推荐
EatFan2 小时前
从“框架混战“到“运行时收敛“:2026 年 AI Agent 开发框架的三条路线之争
java·数据库·人工智能·多智能体·ai agent·mcp·agent 框架
mftang2 小时前
CANopen协议:基于CAN的高层协议架构、通信模型与工业应用深度解析
架构·canopen·对象字典·canopen fd
小蒜学长2 小时前
基于SpringBoot的佳新超市管理系统设计与实现系统(代码+数据库+LW)
java·数据库·spring boot·后端·佳新超市管理系统
jinyishu_2 小时前
向量数据库入门:记录结构、索引、检索与选型
数据库
Learn_PLC5 小时前
自动化工程师Demand与工业机器人技术发展的未来趋势分析
架构
Learn_PLC6 小时前
PLC编程就业前景与自动化人才短缺解析及技能提升补贴政策
架构
写后端的胖头鱼6 小时前
【高频面试题】FullText 全文索引(MySQL)
数据库·mysql·索引·全文索引
晚安code6 小时前
微服务架构和单体架构的区别:拆之前你得先想清楚这件事
微服务·架构
路远的数据库笔记6 小时前
SQL Server迁移国产数据库怎么做?九套口岸库零停机割接实战
数据库·经验分享·sqlserver·dba