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

Neo4j查询结果赋值变量触发KeyError报错问题咨询

报错原因

这个报错和你把print改成变量赋值没有任何关系,本质是代码改写出错触发的字典键不存在(KeyError),核心问题有两个:

  • 你在FastAPI接口里替换了测试阶段可正常运行的Cypher语句:测试代码的Cypher返回结果明确用AS recommendation给返回的电影标题起了别名,结果集里自然有recommendation这个键;但接口里你写的Cypher是MATCH (n:Person) RETURN n LIMIT 25,返回的只有n(Person节点对象)这一个字段,根本不存在recommendation键,强行读取自然报错。
  • 逻辑自相矛盾:你调用查询时传了movie="Crimson Tide"参数,但当前查Person节点的Cypher里根本没有定义$movie参数占位符,这个参数传了完全不生效,和你要查电影推荐的需求完全脱节。

另外你把遍历结果的逻辑写在了with driver.session()上下文块外面,虽然.data()方法会提前把所有结果拉取到本地内存不会触发连接释放错误,但不符合驱动使用规范,极端场景下可能出现异常。

修复方法
  1. 把接口内的Cypher语句换回和测试逻辑一致的、返回recommendation字段的查询;如果你确实需要查询Person节点,就把读取字段改成record['n'],同时删掉多余的movie传参。
  2. 把结果遍历、处理的逻辑移到session上下文块内部,符合驱动使用规范。
  3. 优化项:Neo4j的Driver是带连接池的全局对象,不要每次接口请求都新建、关闭Driver,全局初始化一次即可,服务停止时再统一关闭,能大幅提升性能。

修复后的完整可运行代码如下:

from fastapi import FastAPI
from neo4j import GraphDatabase, basic_auth

app = FastAPI()
# 全局初始化Driver,仅执行一次
driver = GraphDatabase.driver(
    "neo4j://34.201.9.108:7687",
    auth=basic_auth("neo4j", "chart-certifications-bottom")
)

@app.get("/neo4j")
def graph_db():
    # 和测试代码一致的电影推荐查询Cypher
    cypher_query = '''
    MATCH (m:Movie {title:$movie})<-[:RATED]-(u:User)-[:RATED]->(rec:Movie)
    RETURN distinct rec.title AS recommendation LIMIT 20
    '''
    res_list = []
    with driver.session(database="neo4j") as session:
        results = session.read_transaction(
            lambda tx: tx.run(cypher_query, movie="Crimson Tide").data()
        )
        # 结果处理放在session上下文内
        for record in results:
            res_list.append(record['recommendation'])
    return {"Result": res_list}

# 服务关闭时统一关闭驱动连接
@app.on_event("shutdown")
def shutdown_neo4j_driver():
    driver.close()

内容的提问来源于stack exchange,提问作者masjum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 19:18:21