# 数据加工可视化 API 接口文档
> 本文档为前端开发人员提供数据加工可视化(血缘追溯)功能的 API 接口说明。
## 目录
- [功能概述](#功能概述)
- [接口详情](#接口详情)
- [获取血缘可视化数据](#获取血缘可视化数据)
- [数据结构说明](#数据结构说明)
- [错误码说明](#错误码说明)
- [Vue 页面接入示例](#vue-页面接入示例)
---
## 功能概述
数据加工可视化功能用于展示数据产品的完整血缘关系图谱。当用户查看某个数据产品的数据样例时,前端发送一条样例数据,后端会:
1. 通过该数据产品关联的 BusinessDomain 节点
2. 沿着 INPUT/OUTPUT 关系向上追溯血缘
3. 直到到达数据源节点(具有 DataResource 标签)
4. 将样例数据的字段值映射到各层级节点的对应字段
5. 返回完整的节点图谱和关系数据
### 血缘关系模型
```
[DataResource] --INPUT--> [DataFlow] --OUTPUT--> [BusinessDomain] --INPUT--> [DataFlow] --OUTPUT--> [目标节点]
```
- **INPUT 关系**: BusinessDomain 作为 DataFlow 的输入源
- **OUTPUT 关系**: DataFlow 输出到 BusinessDomain
- **终止条件**: 节点同时具有 `BusinessDomain` 和 `DataResource` 两个标签
---
## 接口详情
### 获取血缘可视化数据
获取指定数据产品的血缘追溯图谱,并将样例数据映射到各节点字段。
**请求 URL:** `POST /api/dataservice/products/{product_id}/lineage-visualization`
**请求方式:** `POST`
**Content-Type:** `application/json`
#### 请求参数
**路径参数:**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| product_id | integer | 是 | 数据产品 ID |
**请求体参数:**
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| sample_data | object | 是 | 样例数据,key 为中文字段名,value 为对应的值 |
**请求示例:**
```json
{
"sample_data": {
"用户ID": 12345,
"姓名": "张三",
"年龄": 28,
"用户标签": "高价值用户"
}
}
```
#### 响应参数
**成功响应:**
| 参数名 | 类型 | 说明 |
|--------|------|------|
| code | integer | 状态码,200 表示成功 |
| message | string | 响应消息 |
| data | object | 响应数据 |
| data.nodes | array | 节点列表 |
| data.lines | array | 关系列表 |
| data.lineage_depth | integer | 血缘追溯深度 |
**节点对象 (node) 结构:**
| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | integer | 节点 ID(Neo4j 内部 ID) |
| name_zh | string | 节点中文名称 |
| name_en | string | 节点英文名称 |
| node_type | string | 节点类型,如 `BusinessDomain`、`DataFlow`、`DataResource` |
| labels | array | 节点标签列表 |
| is_target | boolean | 是否为目标节点(起始查询节点) |
| is_source | boolean | 是否为源节点(数据资源,血缘追溯终点) |
| matched_fields | array | 匹配到的字段列表(仅 BusinessDomain 节点有此字段) |
**匹配字段对象 (matched_field) 结构:**
| 字段名 | 类型 | 说明 |
|--------|------|------|
| field_name | string | 字段中文名称 |
| field_name_en | string | 字段英文名称 |
| data_type | string | 字段数据类型 |
| value | any | 样例数据中对应的值 |
| meta_id | integer | DataMeta 节点 ID |
**关系对象 (line) 结构:**
| 字段名 | 类型 | 说明 |
|--------|------|------|
| from | integer | 起始节点 ID |
| to | integer | 目标节点 ID |
| type | string | 关系类型,`INPUT` 或 `OUTPUT` |
#### 响应示例
**成功响应:**
```json
{
"code": 200,
"message": "获取血缘可视化数据成功",
"data": {
"nodes": [
{
"id": 212,
"name_zh": "用户标签库",
"name_en": "user_tag_library",
"node_type": "BusinessDomain",
"labels": ["BusinessDomain"],
"is_target": true,
"is_source": false,
"matched_fields": [
{
"field_name": "用户ID",
"field_name_en": "user_id",
"data_type": "integer",
"value": 12345,
"meta_id": 234
},
{
"field_name": "姓名",
"field_name_en": "name",
"data_type": "string",
"value": "张三",
"meta_id": 235
}
]
},
{
"id": 183,
"name_zh": "用户标签生成",
"name_en": "user_tag_generate",
"node_type": "DataFlow",
"labels": ["DataFlow"],
"is_target": false,
"is_source": false
},
{
"id": 159,
"name_zh": "用户画像",
"name_en": "user_profile",
"node_type": "BusinessDomain",
"labels": ["BusinessDomain"],
"is_target": false,
"is_source": false,
"matched_fields": [
{
"field_name": "用户ID",
"field_name_en": "user_id",
"data_type": "integer",
"value": 12345,
"meta_id": 234
}
]
},
{
"id": 156,
"name_zh": "用户数据清洗",
"name_en": "user_data_clean",
"node_type": "DataFlow",
"labels": ["DataFlow"],
"is_target": false,
"is_source": false
},
{
"id": 154,
"name_zh": "用户基础数据",
"name_en": "user_base_info",
"node_type": "DataResource",
"labels": ["DataResource", "BusinessDomain"],
"is_target": false,
"is_source": true,
"matched_fields": [
{
"field_name": "用户ID",
"field_name_en": "user_id",
"data_type": "integer",
"value": 12345,
"meta_id": 234
}
]
}
],
"lines": [
{"from": 183, "to": 212, "type": "OUTPUT"},
{"from": 159, "to": 183, "type": "INPUT"},
{"from": 156, "to": 159, "type": "OUTPUT"},
{"from": 154, "to": 156, "type": "INPUT"}
],
"lineage_depth": 2
}
}
```
**错误响应:**
```json
{
"code": 400,
"message": "sample_data 必须是非空的 JSON 对象",
"data": null
}
```
```json
{
"code": 404,
"message": "数据产品不存在: ID=999",
"data": null
}
```
---
## 数据结构说明
### 节点类型说明
| 节点类型 | 说明 | 图标建议 |
|----------|------|----------|
| BusinessDomain | 业务领域节点,表示一个数据表或业务实体 | 表格图标 |
| DataFlow | 数据流节点,表示一个 ETL 加工过程 | 流程图标 |
| DataResource | 数据资源节点,表示原始数据源 | 数据库图标 |
### 关系类型说明
| 关系类型 | 方向 | 说明 |
|----------|------|------|
| INPUT | BusinessDomain → DataFlow | 业务域作为数据流的输入 |
| OUTPUT | DataFlow → BusinessDomain | 数据流输出到业务域 |
### 特殊标识说明
| 标识 | 说明 | 可视化建议 |
|------|------|------------|
| is_target = true | 目标节点(用户查询的数据产品对应的节点) | 高亮显示或置于图谱中心 |
| is_source = true | 源节点(数据资源,血缘追溯的终点) | 使用不同颜色标识 |
---
## 错误码说明
| HTTP 状态码 | code | message | 说明 |
|-------------|------|---------|------|
| 200 | 200 | 获取血缘可视化数据成功 | 请求成功 |
| 400 | 400 | 请求数据不能为空 | 未提供请求体 |
| 400 | 400 | sample_data 必须是非空的 JSON 对象 | sample_data 格式错误 |
| 404 | 404 | 数据产品不存在: ID=xxx | 指定的数据产品不存在 |
| 500 | 500 | 获取血缘可视化数据失败: xxx | 服务器内部错误 |
---
## Vue 页面接入示例
### 1. API 服务封装
```javascript
// api/dataService.js
import request from '@/utils/request'
/**
* 获取数据产品血缘可视化数据
* @param {number} productId - 数据产品ID
* @param {object} sampleData - 样例数据
* @returns {Promise}
*/
export function getLineageVisualization(productId, sampleData) {
return request({
url: `/api/dataservice/products/${productId}/lineage-visualization`,
method: 'post',
data: {
sample_data: sampleData
}
})
}
```
### 2. Vue 组件示例
```vue
{{ selectedNode.name_zh }}
{{ selectedNode.name_en }}
{{ selectedNode.node_type }}
{{ label }}
匹配字段
```
### 3. 父组件调用示例
```vue
```
### 4. 使用 ECharts 渲染图谱(可选方案)
```javascript
// 使用 ECharts 关系图渲染
import * as echarts from 'echarts'
const renderWithECharts = (container, nodes, lines) => {
const chart = echarts.init(container)
const option = {
tooltip: {},
series: [{
type: 'graph',
layout: 'force',
symbolSize: 50,
roam: true,
label: {
show: true
},
edgeSymbol: ['circle', 'arrow'],
edgeSymbolSize: [4, 10],
data: nodes.map(node => ({
id: String(node.id),
name: node.name_zh,
category: node.node_type === 'DataFlow' ? 1 : 0,
itemStyle: {
color: node.is_source ? '#67C23A' :
node.is_target ? '#409EFF' : '#909399'
}
})),
links: lines.map(line => ({
source: String(line.from),
target: String(line.to),
label: {
show: true,
formatter: line.type
}
})),
categories: [
{ name: 'BusinessDomain' },
{ name: 'DataFlow' }
],
force: {
repulsion: 500
}
}]
}
chart.setOption(option)
return chart
}
```
---
## 注意事项
1. **样例数据格式**:`sample_data` 的 key 必须使用中文字段名,与 DataMeta 节点的 `name_zh` 匹配
2. **节点 ID**:返回的节点 ID 是 Neo4j 内部 ID,在构建图谱时需转为字符串
3. **关系方向**:`lines` 数组中的 `from` 和 `to` 表示关系的起点和终点,需按箭头方向渲染
4. **空结果处理**:如果数据产品未关联 BusinessDomain 节点,返回空数组
5. **性能考虑**:血缘追溯最大深度为 10 层,避免无限循环
---
## 更新日志
| 版本 | 日期 | 更新内容 |
|------|------|----------|
| 1.0.0 | 2025-12-30 | 初始版本,支持血缘追溯和字段匹配 |