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

7.3 KiB

DataMate 知识图谱 - 实体关系图

Schema 版本:1.0.0 更新日期:2026-02-17

核心实体关系总览

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

分领域视图

数据血缘视图

展示数据集之间的派生关系和字段级血缘。

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

任务编排视图

展示工作流、作业和任务之间的编排关系。

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

组织归属视图

展示用户、数据集与组织的归属关系。

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

知识溯源视图

展示知识集与数据集的溯源关系。

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

综合示例:完整数据流

展示从原始数据到知识资产的完整处理链路。

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