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()方法会提前把所有结果拉取到本地内存不会触发连接释放错误,但不符合驱动使用规范,极端场景下可能出现异常。
修复方法
- 把接口内的Cypher语句换回和测试逻辑一致的、返回
recommendation字段的查询;如果你确实需要查询Person节点,就把读取字段改成record['n'],同时删掉多余的movie传参。 - 把结果遍历、处理的逻辑移到session上下文块内部,符合驱动使用规范。
- 优化项: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
相关产品推荐
相关产品推荐

