跳转至

系统架构

GoGraph 是一个纯 Go 编写的单文件嵌入式图数据库,专为了满足极简、零依赖的高效运行场景。系统设计通过清晰的分层模型解耦,确保模块之间职责单一且高内聚。

1. 系统模块划分

GoGraph 的核心架构分为 5 层:

  1. API 层 (pkg/api):提供面向用户的友好接口,类似于 database/sqlOpen, Query, Exec 等。
  2. Cypher 解析与执行层 (pkg/cypher)
  3. Parser: 词法分析与语法解析,将 Cypher 语句解析为抽象语法树 (AST)。
  4. AST: 声明执行节点、结构、和数据块。
  5. Executor: 协调 Matcher、Creator 和 Modifier 执行特定的语句意图。
  6. 图模型层 (pkg/graph):包含点 (Node)、边 (Relationship)、属性类型 (PropertyValue) 的数据结构封装,并处理与之相关的核心逻辑(如邻接表管理 AdjacencyList 和索引 Index)。
  7. 事务层 (pkg/tx):封装 Pebble DB 提供事务机制,控制多版本并发(MVCC),处理安全读写。
  8. 存储层 (pkg/storage):基于 CockroachDB 的 Pebble,作为单文件存储引擎,并负责 encoding/gob 的序列化编解码工作。

2. 系统架构图

以下 Mermaid 图表展示了 GoGraph 的架构和数据流:

graph TD
    User([应用/用户]) --> API[API 层 
pkg/api] subgraph GoGraph Core Engine API --> |Cypher String| Parser[Cypher Parser
pkg/cypher/parser.go] Parser --> |AST| Executor[执行器
pkg/cypher/executor.go] subgraph Action Handlers Executor --> |CREATE| Creator[创建器
pkg/cypher/creators] Executor --> |MATCH| Matcher[匹配器
pkg/cypher/matchers] Executor --> |SET/DELETE| Modifier[修改器
pkg/cypher/modifiers] end Creator --> GraphModel[图模型/数据封装
pkg/graph] Matcher --> GraphModel Modifier --> GraphModel GraphModel --> |KV 映射| TxMgr[事务管理器
pkg/tx] end TxMgr --> |Batch / Iterator| Storage[存储层 Pebble KV
pkg/storage] Storage --> |WAL & SSTables| Disk[(本地单文件 DB)]

3. 数据流向说明 (以 CREATE 为例)

  1. 用户调用 api.Exec("CREATE (n:User {name: 'Alice'})")
  2. api.DB 调用 cypher.Parser 将语句解析为 AST(带有 CreateClause)。
  3. Executor 获取到一个事务对象 Tx,并将其交给 Creator 引擎。
  4. Creator 解析 AST 生成对应的 graph.Node 对象,赋予全局唯一的自增 ID
  5. graph 层使用 storage.Marshal 将其序列化成二进制 (gob)。
  6. Creator 委托领域层的 graph.Indexgraph.AdjacencyList(将事务 Tx 隐式转换为 graph.Mutator 传入),同步构建标签索引、属性索引和邻接表 KV 键。
  7. 最终,Storage 通过 Pebble 的 Commit 写出到磁盘,变更对其他查询可见。

4. 核心执行引擎优化 (Query Optimization)

重构后的 GoGraph 实现了更先进的底层查询执行路径: - Index Scan (索引扫描):当 MATCH 语句指定了节点的 Label 时(如 MATCH (n:User)),引擎不再执行 \(O(N)\) 的全表扫描,而是通过 Index 树直接以 \(O(K)\) 复杂度命中匹配的 Node ID。 - Graph Traversal (图遍历):对于包含关系的查询(如 MATCH (n)-[r]->(m)),系统充分利用邻接表 AdjacencyList,从起始节点 \(O(1)\) 获取所有关联边的 ID 并精准加载,彻底消灭了边关系的全表暴力遍历。 - 充血模型:所有底层的 KV 拼装逻辑收拢在 pkg/graph 层,Cypher 执行器仅负责调度,保证了事务修改的原子性与代码高内聚。

5. 核心技术栈说明

  • 基础语言:Go 1.18+(广泛兼容跨平台)
  • 持久化底层github.com/cockroachdb/pebble(替代 LevelDB,高性能 KV 库)
  • 对象序列化:Go 原生 encoding/gob(零外部依赖,极快且原生的编解码方案)
  • 可观测性:基于 Option 模式进行注入的 Logger/Tracer 设计(在 pkg/cypher/observability.go 中定义)。