无索引邻接 · Cypher 执行 · Raft 集群
目 录
一、导读
二、原生图存储引擎
2.1 存储文件结构
2.2 无索引邻接(Index-free Adjacency)
2.3 固定大小记录与页缓存
三、Cypher 执行与事务引擎
3.1 查询生命周期
3.2 索引机制
3.3 ACID 事务
四、因果集群架构
4.1 Core Servers 与 Raft 共识
4.2 只读副本与读扩展
4.3 因果一致性与书签
4.4 Fabric 分析集群
五、架构要点对比
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 模式匹配与图算法。