1. 页面概览

图谱映射页(GraphMappingPage.vue)是 LightGotham V5 Stage 4 图谱域(B4-1)的「行级图谱化导入」配置与执行入口:它把一个多源接入的数据源表,按配置的行级映射规则(节点类型、节点 ID 列、属性列、外键边规则、时间列)批量转化为图节点与边,落库到 Gotham 图存储。页面先列数据源并探测各源图谱映射是否已配置,选中 database 型源后提供「自动建议(读 schema + 外键探测)」一键回填表单、「保存配置」(一源一映射 upsert)、「执行图谱化」(任务化提交 + 每秒轮询 GET /tasks/:id 展示任务进度与结果,勾选先融合导入时另经 SSE 追踪本次导入批次进度)。

一句话总结:图谱映射页把"表数据 → 图数据"变成可视化配置、任务化执行、进度可查的标准操作。

2. 访问入口

3. 界面布局

+---------------------------------------------------------------+
| Gotham 行级图谱化   [刷新]                                     |
+---------------------------------------------------------------+
| [alert 操作结果提示条(可关闭)]                               |
+---------------------------------------------------------------+
| [数据源列表(N)]  ID|名称|显示名|来源类型|图谱映射|操作       |
|   每行:[配置图谱映射](仅 database 型可点)                    |
+---------------------------------------------------------------+
| [图谱映射配置 —— 数据源 #id「名称」(connector=xxx)](选中后)|
|  table_name* / node_type* / node_id_col* / node_label_col      |
|  time_col / chunk_size / enabled                               |
|  [自动建议(读 schema + 外键探测)] [清除建议]                  |
|  属性列 prop_cols(勾选列 / JSON 兜底)                         |
|  外键边规则 edge_rules  [+ 添加边规则](行内增删)              |
|  [保存配置] [执行图谱化]  ☑先融合导入(include_ingest)         |
+---------------------------------------------------------------+
| [图谱化任务 #id(提交后)]  状态 / 进度条% / 消息 / 结果 / 错误  |
|   导入批次:Batch #id + 状态徽标 / 批次进度条 + 已处理/总数(失败) |
+---------------------------------------------------------------+

4. 交互元素

控件位置含义与作用
「配置图谱映射」数据源行操作列选中该源载入表单;未配置时提示「可先『自动建议』再保存」
「自动建议(读 schema + 外键探测)」配置表单上方需先填 table_name;调 GET mapping-suggest?table= 读 schema+FK 探测并回填 node_label_col/node_id_col/node_type/prop_cols/edge_rules
「保存配置」表单底部校验 table_name/node_id_col/node_type 必填、prop_cols 合法 JSON、边规则需 type 与 from_col 后 PUT graph-mapping upsert
「执行图谱化」表单底部POST map-to-graph 任务化提交,成功后每秒轮询 GET /tasks/:id 直至终态
「先融合导入(include_ingest)」勾选表单底部默认勾选;同一任务内先融合导入(FusedEntity 落库)再图谱化
属性列勾选建议列 checklist勾选列写入 prop_cols({属性名:列名}),pk/时间列/FK 列不建议勾选;无建议时手动编辑 JSON textarea
「+ 添加边规则」/「删除」边规则区增删外键边规则行(type/from_col/to_table/to_column/to_node_type)
任务进度条 / 状态徽标 / 消息任务进度卡片每秒轮询 GET /tasks/:idtask.progress(0~1)驱动进度条,终态(success/failed/cancelled)停止轮询
导入批次进度条 + 已处理/总数(失败)任务进度卡片仅「先融合导入」时出现:提交后 30s 内每秒探测 GET /ingestion/batches?source_id= 找 id 大于提交前基线的本次新建批次,命中即订阅 GET /ingestion/batches/:id/progress(SSE)推进;失败数/总量兜底取 GET /ingestion/batches/:id
「刷新」页头重新加载数据源并探测各源配置状态

5. 后端关联

方法路径用途
GET/ingestion/sources数据源列表(仅 database 型可配置图谱映射)
GET/ingestion/sources/:id/graph-mapping查询图谱映射(未配置返回 404,前端视为未配置)
PUT/ingestion/sources/:id/graph-mapping保存图谱映射(一源一映射 upsert)
GET/ingestion/sources/:id/mapping-suggest?table=自动建议映射(读 schema + 外键探测,未保存)
POST/ingestion/sources/:id/map-to-graph提交图谱化任务(body {include_ingest},缺省 true)
GET/tasks/:id平台任务系统统一端点,轮询进度与结果
GET/ingestion/batches?source_id=按数据源列导入批次(用于定位本次新建批次,server.go:519
GET/ingestion/batches/:id单批次明细(状态与 imported/failed/total_records,server.go:520
GET/ingestion/batches/:id/progressSSE 导入进度流(text/event-streamserver.go:521

关键机制

映射模型GraphMappingRequest 字段 table_name / node_label_col / node_id_col / node_type / prop_cols({属性名:列名}) / time_col / edge_rules[] / chunk_size / enabled;边规则 EdgeRule{type, from_col, to_table, to_column, to_node_type} 描述本表外键列指向目标节点类型;time_col 把行时间写入边属性 occurrence_time(时序分析页依赖)。

任务化执行POST map-to-graph 提交 gotham_graph_mapping 类型任务;include_ingest=true 时先在同一任务内同步执行融合导入(进度并入 5%~35%),再执行行级图谱化(keyset 分页拉行 → UpsertNode/UpsertEdge 幂等)。任务结果 GraphMappingResultnodes_imported / edges_created / edges_skipped(悬挂边跳过数)。

任务状态机queued → running → success / failed(可 cancelled);前端把 success/failed/cancelled 视为终态并停止轮询,success 时读取结果提示「节点 N,边 M(跳过 K)」并刷新数据源列表,failed 时展示 task.error

自动建议mappingSuggest 读源表 schema 全列(供勾选)+ 外键探测,返回 columns / prop_cols / edge_rules 建议,前端「保存配置」后才落库。

导入批次进度(SSE)GET /ingestion/batches/:id/progressSSE(text/event-stream),事件体为 ProgressEvent{batch_id, processed, total, status}fusion/progress.go:17-22),status ∈ running|paused|completed|failed事件不含失败数(failed 数取自 GET /ingestion/batches/:idfailed_records,页面在订阅期与流结束时各刷新一次)。因 EventSource 无法带 Authorization 头,前端用 fetch + ReadableStream 读流并按 \n\n 切帧解析 data: 行(与本仓库多源接入页同一写法)。

批次定位策略map-to-graph 只返回 task、不返回 batch_id,故页面在提交前记下该源已有批次的最大 id 作基线,提交后 30s 内每秒拉 GET /ingestion/batches?source_id= 找 id 更大的新批次(避免误挂历史批次);命中后停探测并订阅 SSE,未命中(如 include_ingest=false 或任务提前失败)则停止探测、不下发无谓请求。

6. 权限与安全

7. 常见问题与排错

7.1 数据源列表为空

7.2 「配置图谱映射」点击无反应

7.3 「执行图谱化」后进度卡住

7.4 自动建议失败

7.5 勾选「先融合导入」后看不到批次进度条

7.6 批次进度条到 100% 但任务仍未结束

8. 已知缺陷与边界

缺陷/边界说明
两级进度任务卡有两套进度:任务进度GET /tasks/:idprogress 0~1,每秒轮询)与导入批次进度/ingestion/batches/:id/progress SSE,仅先融合导入时)。任务执行慢或后端未启动时任务进度仍可能卡在提交时状态,需按 Network 响应排障
批次进度为独立探测map-to-graph 不回传 batch_id,页面以「提交前批次最大 id 基线 + 30s 内每秒探测新批次」定位;同源并发其他导入可能被误认(概率低),且超过 30s 未出现即停止探测
批次事件无失败数SSE ProgressEvent 只含 batch_id/processed/total/status(fusion/progress.go:17-22),失败数取自批次明细 failed_records(订阅期与流结束各刷新一次),非实时
仅 database 型源source_type 非 database 无法配置/执行图谱化
边规则保存校验宽松前端仅校验 type 与 from_col 非空,to_column 缺省经 FK 探测补全
prop_cols JSON 兜底无建议列时需手填 JSON,非法 JSON 在保存时拦截
映射一源一条PUT 为 upsert 语义,重复保存覆盖旧配置
任务结果展示成功提示仅展示 nodes_imported/edges_created/edges_skipped,详细 result 需查看任务卡片 JSON