什么是 CodeGraph
CodeGraph 是一个将源代码转化为**属性图(Property Graph)**的工具,它通过解析代码的抽象语法树(AST),提取代码中的实体和关系,构建一个可查询的代码知识图谱。
这种架构使得 AI 工具可以基于图查询来理解代码结构、调用链和依赖关系。
整体架构
| |
核心数据模型
CodeGraph 使用三层数据结构来表示代码:
1. Nodes 表 — 代码节点(图的顶点)
| 字段 | 说明 |
|---|---|
id | 唯一标识,格式如 function:hash、file:path、class:hash |
kind | 节点类型:file、class、function、method、constant、variable、interface、type_alias、import |
name / qualified_name | 名称和全限定名 |
file_path | 所在文件路径 |
language | 编程语言 |
start_line/end_line | 源码位置 |
docstring/signature | 文档和函数签名 |
visibility/is_exported/is_async/is_static/is_abstract | 修饰符属性 |
decorators/type_parameters | JSON 数组,装饰器和泛型参数 |
2. Edges 表 — 代码关系(图的边)
| 字段 | 说明 |
|---|---|
source/target | 关联的两个节点 ID |
kind | 关系类型 |
metadata | JSON,含 confidence(置信度)和 resolvedBy(解析方式) |
line/col | 关系发生的源码位置 |
关系类型:
contains— 文件包含节点(层级结构)calls— 函数/方法调用references— 变量/类型引用imports— 模块导入instantiates— 类实例化
3. Files 表 — 文件追踪
记录每个文件的 content_hash(内容哈希)、node_count、modified_at 等,用于增量更新——只重新解析变化的文件。
解析流程
| |
增量更新与删除同步
CodeGraph 支持代码变更的自动同步,包括新增、修改和删除三种场景:
1. 新增代码
当添加新的源文件或代码实体时:
- 扫描阶段发现新文件 → 创建
file节点 - 解析 AST → 提取新的
function、class、variable等节点 - 建立关系 → 生成
contains、calls等边 - 未解析的跨文件引用存入
unresolved_refs表
2. 修改代码
基于内容哈希比对的增量更新:
| |
更新流程:
| |
3. 删除代码
利用 SQLite 的 ON DELETE CASCADE 约束自动清理:
| |
删除流程:
| |
4. 实际示例
假设项目中有以下代码:
| |
场景 A:删除 helper() 函数
| |
- 删除节点
function:abc123 - 自动删除边
function:def456 → function:abc123 main()函数保留,但缺少对helper的调用关系
场景 B:修改 main() 函数
| |
content_hash变化 → 触发重新索引- 重新解析生成节点和边
- 旧的调用关系被新的关系替换
关键技术选型
1. SQLite + FTS5 全文搜索
nodes_fts 虚拟表基于 FTS5,对 name、qualified_name、docstring、signature 建立全文索引,支持模糊搜索代码符号。
2. 基于内容哈希的增量更新
files.content_hash 避免重复解析未修改的文件,nodes.updated_at 时间戳追踪节点更新时间。
3. 置信度机制
| |
引用解析带置信度分数,exact-match 表示精确匹配,支持不同解析策略的优先级。
4. 节点 ID 生成策略
- 文件节点:
file:相对路径 - 其他节点:
类型:内容哈希(如function:fcddbf01897d11636307b7ab1f47aa5c) - 导入节点:
import:哈希
查询能力示例
基于这个图结构,可以支持丰富的代码查询:
| |
实际数据示例
以当前博客项目为例,CodeGraph 生成的数据统计:
| 指标 | 数值 |
|---|---|
| 文件数 | 74 |
| 代码节点 | 167 |
| 关系边 | 289 |
| 未解析引用 | 0 |
节点类型分布:
method(50)function(41)file(19)import(16)constant(12)variable(11)interface(9)class(6)type_alias(3)
总结
CodeGraph 的核心思路是:将源代码解析为属性图存储在 SQLite 中,结合 Tree-sitter 进行多语言 AST 解析,通过增量更新和全文索引实现高效的代码理解和检索。
这种架构为 AI 代码助手提供了强大的上下文理解能力,使其能够:
- 快速定位代码定义和引用
- 理解函数调用链和依赖关系
- 支持跨文件的代码导航
- 基于语义的代码搜索