You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 11:25:30