POST /api/metric/update
{
"name_zh": "测试指标_1762140669984",
"name_en": "metric_17621406",
"category": "应用类",
"organization": "citu",
"leader": "mxl",
"childrenId": [],
"frequency": "日",
"data_sensitivity": "低",
"tag": 82,
"describe": null,
"status": true,
"id_list": [
{
"id": 300,
"metaData": null,
"type": "metric"
},
{
"id": 2156,
"metaData": [2139, 2132, 2130],
"type": "model"
}
],
"metric_rules": "<span class=\"contenteditable-span\" data-id=\"300\" contenteditable=\"false\">指标_1762140669984(指标)</span>...",
"code": "generate_python_function_for_metrics_mapping",
"id": 300
}
| 属性名 | 类型 | 处理方式 |
|---|---|---|
name_zh |
string | 直接存储 |
name_en |
string | 直接存储 |
category |
string | 直接存储 |
organization |
string | 直接存储 |
leader |
string | 直接存储 |
frequency |
string | 直接存储 |
data_sensitivity |
string | 直接存储 |
tag |
integer | 用于创建 LABEL 关系 |
status |
boolean | 直接存储 |
metric_rules |
string | 直接存储 |
code |
string | 直接存储 |
id |
integer | 节点标识,不作为属性存储 |
| 属性名 | 类型 | 处理方式 |
|---|---|---|
childrenId |
array | 用于创建 child 关系(本例为空数组) |
tag |
integer | 用于创建 LABEL 关系(ID=82) |
| 属性名 | 类型 | 处理方式 |
|---|---|---|
id_list |
array of objects | 转换为 JSON 字符串存储 |
describe |
null | 过滤掉,不存储 |
model_selected 字段在测试数据中不存在,但如果存在会被排除,专门用于创建 connection 关系。
id_list 处理(关键测试点)原始值:
[
{
"id": 300,
"metaData": null,
"type": "metric"
},
{
"id": 2156,
"metaData": [2139, 2132, 2130],
"type": "model"
}
]
处理结果:
is_valid_neo4j_property() 检测为复杂类型"[{\"id\":300,\"metaData\":null,\"type\":\"metric\"},{\"id\":2156,\"metaData\":[2139,2132,2130],\"type\":\"model\"}]"LABEL 关系:
MATCH (metric:DataMetric), (tag:DataLabel)
WHERE id(metric) = 300 AND id(tag) = 82
MERGE (metric)-[:LABEL]->(tag)
child 关系:
由于 childrenId 为空数组,不创建任何 child 关系。
MATCH (n:DataMetric) WHERE id(n) = 300 RETURN n
MATCH (n)-[r]-() WHERE id(n) = 300 DELETE r
过滤和转换后的属性:
{
"name_zh": "测试指标_1762140669984",
"name_en": "metric_17621406",
"category": "应用类",
"organization": "citu",
"leader": "mxl",
"frequency": "日",
"data_sensitivity": "低",
"status": True,
"id_list": "[{\"id\":300,...}]", # JSON字符串
"metric_rules": "<span...",
"code": "generate_python_function_for_metrics_mapping"
}
MATCH (n:DataMetric)
WHERE id(n) = 300
SET n.name_zh = $name_zh,
n.name_en = $name_en,
n.category = $category,
n.organization = $organization,
n.leader = $leader,
n.frequency = $frequency,
n.data_sensitivity = $data_sensitivity,
n.status = $status,
n.id_list = $id_list,
n.metric_rules = $metric_rules,
n.code = $code
RETURN n
MATCH (metric:DataMetric), (tag:DataLabel)
WHERE id(metric) = 300 AND id(tag) = 82
MERGE (metric)-[:LABEL]->(tag)
由于 childrenId 为空,跳过此步骤。
问题: node_a[key] = value 不支持
修复: 使用 Cypher SET 子句更新属性
验证: 代码不再直接操作 Node 对象
问题: 尝试存储 Map 对象导致 Neo.ClientError.Statement.TypeError
修复:
is_valid_neo4j_property() 验证函数验证: id_list 从对象数组转换为 JSON 字符串
问题: session.push(), connect_graph.create() 等过时 API
修复: 全部替换为标准 Cypher 查询
验证: 所有数据库操作使用 driver.session().run()
curl -X POST http://your-server/api/metric/update \
-H "Content-Type: application/json" \
-d '{"id": 300, "name_zh": "测试指标_1762140669984", ...}'
{
"code": 200,
"data": {},
"msg": "success"
}
id_list 存储为 JSON 字符串(DataMetric:300)-[:LABEL]->(DataLabel:82)INFO - 属性 id_list 从复杂类型转换为JSON字符串
INFO - 成功更新数据指标节点属性: ID=300, 更新字段: ['name_zh', 'name_en', ...]
INFO - 成功创建LABEL关系: 300 -> 82
INFO - 数据指标编辑完成: ID=300
如果前端或其他服务读取 id_list 属性,需要:
// 之前:直接使用
const idList = node.id_list; // Array
// 现在:需要解析
const idList = JSON.parse(node.id_list); // String -> Array
建议在数据访问层统一处理 JSON 字符串的解析。
✅ 所有已知问题已修复:
✅ 代码已优化:
✅ 可以部署到生产环境进行实际测试
/api/metric/update 接口如有问题,请查看日志中的详细信息,特别关注: