Files
DataMate/docs/knowledge-graph/schema/er-diagram.md
Jerry Yan afcb8783aa feat(kg): 实现 Phase 3.1 前端图谱浏览器
核心功能:
- G6 v5 力导向图,支持交互式缩放、平移、拖拽
- 5 种布局模式:force, circular, grid, radial, concentric
- 双击展开节点邻居到图中(增量探索)
- 全文搜索,类型过滤,结果高亮(变暗/高亮状态)
- 节点详情抽屉:实体属性、别名、置信度、关系列表(可导航)
- 关系详情抽屉:类型、源/目标、权重、置信度、属性
- 查询构建器:最短路径/全路径查询,可配置 maxDepth/maxPaths
- 基于 UUID 的图加载(输入或 URL 参数 ?graphId=...)
- 大图性能优化(200 节点阈值,超过时禁用动画)

新增文件(13 个):
- knowledge-graph.model.ts - TypeScript 接口,匹配 Java DTOs
- knowledge-graph.api.ts - API 服务,包含所有 KG REST 端点
- knowledge-graph.const.ts - 实体类型颜色、关系类型标签、中文显示名称
- graphTransform.ts - 后端数据 → G6 节点/边格式转换 + 合并工具
- graphConfig.ts - G6 v5 图配置(节点/边样式、行为、布局)
- hooks/useGraphData.ts - 数据钩子:加载子图、展开节点、搜索、合并
- hooks/useGraphLayout.ts - 布局钩子:5 种布局类型
- components/GraphCanvas.tsx - G6 v5 画布,力导向布局,缩放/平移/拖拽
- components/SearchPanel.tsx - 全文实体搜索,类型过滤
- components/NodeDetail.tsx - 实体详情抽屉
- components/RelationDetail.tsx - 关系详情抽屉
- components/QueryBuilder.tsx - 路径查询构建器
- Home/KnowledgeGraphPage.tsx - 主页面,整合所有组件

修改文件(5 个):
- package.json - 添加 @antv/g6 v5 依赖
- vite.config.ts - 添加 /knowledge-graph 代理规则
- auth/permissions.ts - 添加 knowledgeGraphRead/knowledgeGraphWrite
- pages/Layout/menu.tsx - 添加知识图谱菜单项(Network 图标)
- routes/routes.ts - 添加 /data/knowledge-graph 路由

新增文档(10 个):
- docs/knowledge-graph/ - 完整的知识图谱设计文档

Bug 修复(Codex 审查后修复):
- P1: 详情抽屉状态与选中状态不一致(显示旧数据)
- P1: 查询构建器未实现(最短路径/多路径查询)
- P2: 实体类型映射 Organization → Org(匹配后端)
- P2: getSubgraph depth 参数无效(改用正确端点)
- P2: AllPathsVO 字段名不一致(totalPaths → pathCount)
- P2: 搜索取消逻辑无效(传递 AbortController.signal)
- P2: 大图性能优化(动画降级)
- P3: 移除未使用的类型导入

构建验证:
- tsc --noEmit  clean
- eslint  0 errors/warnings
- vite build  successful
2026-02-20 19:13:46 +08:00

299 lines
7.3 KiB
Markdown

# DataMate 知识图谱 - 实体关系图
> Schema 版本:1.0.0
> 更新日期:2026-02-17
## 核心实体关系总览
```mermaid
graph LR
%% 实体定义
Dataset["<b>Dataset</b><br/>数据集"]
Field["<b>Field</b><br/>字段"]
LabelTask["<b>LabelTask</b><br/>标注任务"]
Workflow["<b>Workflow</b><br/>工作流"]
Job["<b>Job</b><br/>作业"]
User["<b>User</b><br/>用户"]
Org["<b>Org</b><br/>组织"]
KnowledgeSet["<b>KnowledgeSet</b><br/>知识集"]
%% 关系连接
Dataset -->|HAS_FIELD| Field
Dataset -->|DERIVED_FROM| Dataset
Dataset -->|BELONGS_TO| Org
Job -->|USES_DATASET| Dataset
Job -->|PRODUCES| Dataset
Job -->|DEPENDS_ON| Job
Workflow -->|TRIGGERS| Job
Workflow -->|USES_DATASET| Dataset
LabelTask -->|USES_DATASET| Dataset
LabelTask -->|ASSIGNED_TO| User
User -->|BELONGS_TO| Org
Field -->|IMPACTS| Field
KnowledgeSet -->|SOURCED_FROM| Dataset
%% 样式
classDef dataAsset fill:#4A90D9,stroke:#2C5F8A,color:#fff,stroke-width:2px
classDef task fill:#7B68EE,stroke:#5A4CB5,color:#fff,stroke-width:2px
classDef actor fill:#50C878,stroke:#3A9B5B,color:#fff,stroke-width:2px
classDef knowledge fill:#FFB347,stroke:#CC8F39,color:#fff,stroke-width:2px
class Dataset,Field dataAsset
class LabelTask,Workflow,Job task
class User,Org actor
class KnowledgeSet knowledge
```
## 分领域视图
### 数据血缘视图
展示数据集之间的派生关系和字段级血缘。
```mermaid
graph TB
subgraph 源数据层
DS_RAW["Dataset<br/>原始数据集"]
F1["Field: user_id"]
F2["Field: event_type"]
F3["Field: timestamp"]
end
subgraph 处理层
JOB_CLEAN["Job<br/>清洗作业"]
JOB_SYNTH["Job<br/>合成作业"]
end
subgraph 产出数据层
DS_CLEAN["Dataset<br/>清洗后数据集"]
DS_SYNTH["Dataset<br/>合成数据集"]
F1_CLEAN["Field: user_id"]
F4["Field: user_segment"]
end
DS_RAW -->|HAS_FIELD| F1
DS_RAW -->|HAS_FIELD| F2
DS_RAW -->|HAS_FIELD| F3
JOB_CLEAN -->|USES_DATASET| DS_RAW
JOB_CLEAN -->|PRODUCES| DS_CLEAN
JOB_SYNTH -->|USES_DATASET| DS_CLEAN
JOB_SYNTH -->|PRODUCES| DS_SYNTH
DS_CLEAN -->|DERIVED_FROM| DS_RAW
DS_SYNTH -->|DERIVED_FROM| DS_CLEAN
DS_CLEAN -->|HAS_FIELD| F1_CLEAN
DS_SYNTH -->|HAS_FIELD| F4
F1 -->|IMPACTS| F1_CLEAN
F1_CLEAN -->|IMPACTS| F4
classDef source fill:#E8F4FD,stroke:#4A90D9,color:#333
classDef process fill:#F3E8FF,stroke:#7B68EE,color:#333
classDef output fill:#E8FFF0,stroke:#50C878,color:#333
class DS_RAW,F1,F2,F3 source
class JOB_CLEAN,JOB_SYNTH process
class DS_CLEAN,DS_SYNTH,F1_CLEAN,F4 output
```
### 任务编排视图
展示工作流、作业和任务之间的编排关系。
```mermaid
graph LR
subgraph 工作流定义
WF_CLEAN["Workflow<br/>清洗管道"]
WF_EVAL["Workflow<br/>评估管道"]
end
subgraph 作业执行
JOB1["Job<br/>清洗作业 #1"]
JOB2["Job<br/>清洗作业 #2"]
JOB3["Job<br/>评估作业"]
end
subgraph 标注任务
LT1["LabelTask<br/>人工标注"]
LT2["LabelTask<br/>自动标注"]
end
subgraph 人员
U1["User<br/>张三"]
U2["User<br/>李四"]
end
WF_CLEAN -->|TRIGGERS| JOB1
WF_CLEAN -->|TRIGGERS| JOB2
WF_EVAL -->|TRIGGERS| JOB3
JOB2 -->|DEPENDS_ON| JOB1
JOB3 -->|DEPENDS_ON| JOB2
LT1 -->|ASSIGNED_TO| U1
LT2 -->|ASSIGNED_TO| U2
classDef wf fill:#7B68EE,stroke:#5A4CB5,color:#fff
classDef job fill:#9B8FFF,stroke:#7B68EE,color:#fff
classDef task fill:#B8A9FF,stroke:#9B8FFF,color:#fff
classDef user fill:#50C878,stroke:#3A9B5B,color:#fff
class WF_CLEAN,WF_EVAL wf
class JOB1,JOB2,JOB3 job
class LT1,LT2 task
class U1,U2 user
```
### 组织归属视图
展示用户、数据集与组织的归属关系。
```mermaid
graph TB
subgraph 组织
ORG1["Org<br/>数据工程部"]
ORG2["Org<br/>AI研发部"]
end
subgraph 人员
U1["User: 张三"]
U2["User: 李四"]
U3["User: 王五"]
end
subgraph 数据资产
DS1["Dataset: 用户行为日志"]
DS2["Dataset: 医学影像集"]
DS3["Dataset: 训练数据集"]
end
U1 -->|BELONGS_TO| ORG1
U2 -->|BELONGS_TO| ORG1
U3 -->|BELONGS_TO| ORG2
DS1 -->|BELONGS_TO| ORG1
DS2 -->|BELONGS_TO| ORG2
DS3 -->|BELONGS_TO| ORG2
classDef org fill:#FFB347,stroke:#CC8F39,color:#fff
classDef user fill:#50C878,stroke:#3A9B5B,color:#fff
classDef data fill:#4A90D9,stroke:#2C5F8A,color:#fff
class ORG1,ORG2 org
class U1,U2,U3 user
class DS1,DS2,DS3 data
```
### 知识溯源视图
展示知识集与数据集的溯源关系。
```mermaid
graph LR
subgraph 数据源
DS1["Dataset<br/>用户行为日志"]
DS2["Dataset<br/>产品文档"]
end
subgraph 知识资产
KS1["KnowledgeSet<br/>用户行为知识库"]
end
subgraph 标注
LT["LabelTask<br/>知识标注"]
end
KS1 -->|SOURCED_FROM| DS1
KS1 -->|SOURCED_FROM| DS2
LT -->|USES_DATASET| DS1
classDef data fill:#4A90D9,stroke:#2C5F8A,color:#fff
classDef knowledge fill:#FFB347,stroke:#CC8F39,color:#fff
classDef task fill:#7B68EE,stroke:#5A4CB5,color:#fff
class DS1,DS2 data
class KS1 knowledge
class LT task
```
## 综合示例:完整数据流
展示从原始数据到知识资产的完整处理链路。
```mermaid
graph TB
%% 组织和人员
ORG["Org: 数据工程部"]
USER["User: 张三"]
%% 数据资产
DS_RAW["Dataset: 原始日志"]
DS_CLEAN["Dataset: 清洗数据"]
F_UID_RAW["Field: user_id (原始)"]
F_UID_CLEAN["Field: user_id (清洗)"]
%% 处理流程
WF["Workflow: 清洗管道"]
JOB["Job: 清洗作业"]
LT["LabelTask: 情感标注"]
%% 知识
KS["KnowledgeSet: 行为知识库"]
%% 组织归属
USER -->|BELONGS_TO| ORG
DS_RAW -->|BELONGS_TO| ORG
%% 数据结构
DS_RAW -->|HAS_FIELD| F_UID_RAW
DS_CLEAN -->|HAS_FIELD| F_UID_CLEAN
%% 处理链路
WF -->|TRIGGERS| JOB
JOB -->|USES_DATASET| DS_RAW
JOB -->|PRODUCES| DS_CLEAN
DS_CLEAN -->|DERIVED_FROM| DS_RAW
%% 字段血缘
F_UID_RAW -->|IMPACTS| F_UID_CLEAN
%% 任务分配
LT -->|USES_DATASET| DS_CLEAN
LT -->|ASSIGNED_TO| USER
%% 知识溯源
KS -->|SOURCED_FROM| DS_CLEAN
%% 样式
classDef org fill:#FFB347,stroke:#CC8F39,color:#fff,stroke-width:2px
classDef user fill:#50C878,stroke:#3A9B5B,color:#fff,stroke-width:2px
classDef data fill:#4A90D9,stroke:#2C5F8A,color:#fff,stroke-width:2px
classDef field fill:#87CEEB,stroke:#4A90D9,color:#333,stroke-width:1px
classDef process fill:#7B68EE,stroke:#5A4CB5,color:#fff,stroke-width:2px
classDef knowledge fill:#FF6B6B,stroke:#CC5555,color:#fff,stroke-width:2px
class ORG org
class USER user
class DS_RAW,DS_CLEAN data
class F_UID_RAW,F_UID_CLEAN field
class WF,JOB,LT process
class KS knowledge
```
## 图例
| 颜色 | 分类 | 包含实体 |
|------|------|---------|
| 蓝色 | 数据资产 | Dataset, Field |
| 紫色 | 任务/流程 | Workflow, Job, LabelTask |
| 绿色 | 人员 | User, Org |
| 橙色/红色 | 知识 | KnowledgeSet |