如何为FastAPI构建的Neo4j接口实现动态多标签添加?
解决方案
完全可行,只需要对输入的标签字段做预处理,将单个标签或冒号分隔的多标签统一转换成标签列表,再传入Neo4j的APOC函数即可实现需求。以下是修改后的完整代码:
from fastapi import FastAPI from pydantic import BaseModel, validator import os from dotenv import load_dotenv from neo4j import GraphDatabase load_dotenv() uri = os.getenv("uri") user = os.getenv("user") pwd = os.getenv("pwd") class NodeModel(BaseModel): label: str name: str @validator('label') def split_labels(cls, v): # 将冒号分隔的字符串拆分为标签列表,自动过滤空字符串(处理多余冒号情况) return [label.strip() for label in v.split(':') if label.strip()] def get_neo4j_driver(): return GraphDatabase.driver(uri=uri, auth=(user, pwd)) app = FastAPI() @app.post("/createNode") def create_node(node: NodeModel): # 使用with语句自动管理驱动和会话的生命周期 with get_neo4j_driver() as driver: with driver.session() as session: cypher_query = """ CREATE(n {name: $name}) WITH n CALL apoc.create.addLabels(n, $labels) YIELD node RETURN node.name as name """ params = {"name": node.name, "labels": node.label} result = session.run(cypher_query, params).single() return {"response": f"节点 {result['name']} 已创建,标签为 {node.label}"}
关键修改点说明
- 标签预处理:通过Pydantic的
@validator装饰器,自动将输入的标签字符串按冒号拆分,转换成标签列表。无论是单个标签(如"Person")还是冒号分隔的多标签(如"Person:Employee"),都会被统一处理成列表格式。 - Cypher语句调整:将原语句中的
[$label]改为$labels,直接传入预处理后的标签列表,适配APOC函数的参数要求。 - 资源管理优化:使用
with语句管理Neo4j驱动和会话,确保资源自动释放,避免连接泄漏。 - 结果处理修复:修复原代码中返回字典的语法错误,正确提取查询结果并返回。
测试示例
- 单个标签请求体:
{ "label": "Person", "name": "Alice" }
- 多标签请求体:
{ "label": "Person:Employee:Manager", "name": "Bob" }
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

