为 DataOps 平台新增了 DataLabel 节点删除功能,允许用户通过 API 接口删除指定的数据标签节点及其所有关联关系。
app/core/data_interface/interface.py)新增函数: node_delete(node_id)
def node_delete(node_id):
"""
删除 DataLabel 节点及其所有关联关系
Args:
node_id: 节点ID(整数)
Returns:
dict: 删除结果,包含 success 状态和 message 信息
"""
执行流程:
连接数据库
driver = connect_graph()
if not driver:
return {"success": False, "message": "无法连接到数据库"}
cypher
MATCH (n:DataLabel)
WHERE id(n) = $nodeId
RETURN n
删除节点和关系
MATCH (n:DataLabel)
WHERE id(n) = $nodeId
DETACH DELETE n
RETURN count(n) as deleted_count
{"success": True, "message": "成功删除..."}{"success": False, "message": "错误信息..."}✅ 类型验证: 只删除 DataLabel 类型的节点
✅ 存在性检查: 删除前验证节点是否存在
✅ 关系清理: 使用 DETACH DELETE 自动删除所有关联关系
✅ 错误处理: 完整的异常捕获和错误返回
✅ 日志记录: 详细记录删除操作和结果
app/api/data_interface/routes.py)新增接口: POST /api/data/label/delete
@bp.route('/data/label/delete', methods=['POST'])
def data_label_delete():
"""删除数据标签节点"""
处理流程:
获取参数
node_id = receiver.get('id')
node_id = int(node_id) # 转换为整数 ```
执行删除
delete_result = interface.node_delete(node_id)
python
if delete_result["success"]:
return success({"id": node_id, "message": ...}, "删除成功")
else:
return failed({"id": node_id, "message": ...}, ...)
成功响应:
{
"code": 200,
"data": {
"id": 82,
"message": "成功删除 DataLabel 节点 (ID: 82)"
},
"msg": "删除成功"
}
失败响应:
{
"code": 500,
"data": {
"id": 82,
"message": "DataLabel 节点不存在 (ID: 82)"
},
"msg": "DataLabel 节点不存在 (ID: 82)"
}
DETACH DELETE 确保关系一并删除curl -X POST http://localhost:5000/api/data/label/delete \
-H "Content-Type: application/json" \
-d '{"id": 82}'
import requests
def delete_data_label(label_id):
url = "http://localhost:5000/api/data/label/delete"
response = requests.post(url, json={"id": label_id})
result = response.json()
if result['code'] == 200:
print(f"✅ {result['data']['message']}")
return True
else:
print(f"❌ {result.get('msg', 'Unknown error')}")
return False
# 使用示例
delete_data_label(82)
async function deleteDataLabel(labelId) {
try {
const response = await fetch('/api/data/label/delete', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({ id: labelId })
});
const result = await response.json();
if (result.code === 200) {
console.log(`✅ ${result.data.message}`);
return true;
} else {
console.error(`❌ ${result.msg}`);
return false;
}
} catch (error) {
console.error('请求失败:', error);
return false;
}
}
// 使用示例
deleteDataLabel(82);
本功能的实现参考了 metric_delete 的设计模式:
| 特性 | metric_delete | node_delete |
|---|---|---|
| 节点类型 | DataMetric | DataLabel |
| 删除方式 | DETACH DELETE | DETACH DELETE |
| 参数验证 | ✅ | ✅ |
| 错误处理 | ✅ | ✅ |
| 日志记录 | ✅ | ✅ |
| 返回格式 | 统一 dict | 统一 dict |
两个删除功能保持了一致的设计:
app/core/data_interface/interface.py - 新增 node_delete 函数app/api/data_interface/routes.py - 新增 /data/label/delete 接口docs/api_data_label_delete.md - API 接口文档DATA_LABEL_DELETE_FEATURE.md - 本功能总结文档# 测试接口是否可用
curl -X POST http://your-server/api/data/label/delete \
-H "Content-Type: application/json" \
-d '{"id": 999}'
# 预期返回节点不存在的错误
✅ 功能完整: 实现了完整的删除功能 ✅ 设计规范: 遵循项目的代码规范和设计模式 ✅ 文档齐全: 提供了详细的 API 文档和功能说明 ✅ 测试友好: 提供了多种测试示例 ✅ 生产就绪: 具备完整的错误处理和日志记录
该功能已经可以部署到生产环境使用!