数据模型
所有数据存在 Memgraph 图数据库中。
节点类型
CodeEntity
代码实体,由 Joern CPG 分析生成。
| 属性 | 类型 | 说明 |
|---|---|---|
name | string | 实体名(函数名、文件路径等) |
type | enum | service、file、function、api_endpoint |
scope | string[] | 模块/服务标签,用于过滤 |
repo | string | 所属 repo |
DecisionContext
设计决策,从 AI 编程对话、代码分析或手动录入中提取。
| 属性 | 类型 | 说明 |
|---|---|---|
id | string | 唯一标识 |
content | string | 完整自然语言描述 |
summary | string | 摘要(渐进披露的第一层) |
keywords | string[] | 提取的概念词(槽位 2) |
scope | string[] | 模块标签 |
embedding | float[] | 语义向量(槽位 5) |
created_at | datetime | 创建时间 |
updated_at | datetime | 最后更新 |
owner | string | 产生者 |
session_id | string | 来源 AI 对话 session |
commit_hash | string | 对应代码版本 |
source | enum | ai_chat、meeting、manual |
confidence | enum | owner_confirmed、ai_inferred、auto_generated、refined |
staleness | enum | active、stale、archived |
AggregatedSummary
模块级聚合摘要,由精炼管线生成。
INFO
尚未实现,计划在精炼管线中加入。
边类型
代码结构边
由 Joern CPG 分析和 LLM 推断生成。
| 边 | 方向 | 含义 |
|---|---|---|
CONTAINS | CodeEntity → CodeEntity | 层级关系:服务 → 文件 → 函数 |
CALLS | CodeEntity → CodeEntity | 函数调用函数 |
DEPENDS_ON_API | CodeEntity → CodeEntity | 跨服务 API 依赖(LLM 推断) |
决策锚定边
把决策连接到它描述的代码。
| 边 | 方向 | 含义 |
|---|---|---|
ANCHORED_TO | DecisionContext → CodeEntity | 精确锚定(函数级) |
APPROXIMATE_TO | DecisionContext → CodeEntity | 模糊锚定(文件/目录级) |
决策关系边
决策之间的连接,形成决策图。
| 边 | 方向 | 含义 |
|---|---|---|
CAUSED_BY | Decision → Decision | A 是因为 B |
LEADS_TO | Decision → Decision | A 导致了 B |
CONFLICTS_WITH | Decision → Decision | A 和 B 有张力/trade-off |
SUPERSEDES | Decision → Decision | B 替代了 A |
DEPENDS_ON | Decision → Decision | A 的前提是 B |
CO_DECIDED | Decision → Decision | 同一 session 中一起做出 |
SUMMARIZES | AggregatedSummary → DecisionContext | 摘要覆盖这些决策 |
内部跟踪边
管线内部使用,不暴露给消费端。
| 边 | 方向 | 含义 |
|---|---|---|
PENDING_COMPARISON | Decision → Decision | 尚未比较是否有关系 |
TIP
PENDING_COMPARISON 边用的是反向跟踪模式:不记录"已比较、无关系"(会污染图),而是为还没比较的配对创建 PENDING 边。比较完成后,无论结果如何都删除 PENDING 边——图上只留有意义的关系边。
图谱可视化
打开 Memgraph Lab http://localhost:3000 浏览图谱。
常用 Cypher 查询:
cypher
// 查某个文件上锚定的所有决策
MATCH (d:DecisionContext)-[:ANCHORED_TO]->(c:CodeEntity {type: 'file', name: 'auth.ts'})
RETURN d, c
// 决策因果链
MATCH path = (d1:DecisionContext)-[:CAUSED_BY|LEADS_TO*1..3]-(d2:DecisionContext)
WHERE d1.id = 'some-decision-id'
RETURN path
// 没有决策覆盖的函数(覆盖空白)
MATCH (c:CodeEntity {type: 'function'})
WHERE NOT (c)<-[:ANCHORED_TO]-(:DecisionContext)
RETURN c.name, c.repo
ORDER BY c.repo