Text2CypherRetriever:让数据库查询像聊天一样简单!
在这个信息过载的时代,快速准确地从数据中捞出想要的答案,几乎成了每个人的日常刚需。但传统的数据检索方式,往往需要你熟悉复杂的查询语言和数据库结构——这对很多开发者来说都是个坎儿,更别提普通用户了。

有没有一种方式,能让查询变得像聊天一样简单?
Text2CypherRetriever
下面,我们就来拆解一下,怎么把这个工具集成到项目里,让它真正帮你提高效率。
什么是 Text2Cypher?
简单来说,
Text2Cypher
Text2CypherRetriever 则是这个方法的落地实现:它先让大语言模型(LLM)根据用户的问题生成一段 Cypher 查询,然后这段查询会被拿到 Neo4j 数据库里去执行,捞回相关信息。最后,这些结果会被塞进 LLM 的上下文中,LLM 再据此生成最终的自然语言答案。
这相当于为用户和数据库之间搭了一座桥——用户只管用自然语言提问,LLM 包揽了查询生成和答案编写两件事,交互体验一下子直观了很多。
内部研究显示,Text2Cypher 作为检索方法,在面对各种不同的问题变体时,表现得最稳定。在处理不同复杂度的任务时,它的表现也比其他策略更靠谱。
设置
跟之前的文章类似,我们先连到一个预先配好的 Neo4j 演示数据库。这个数据库模拟了一个电影推荐的知识图谱。你可以直接用用户名和密码 recommendations,在 https://demo.neo4jlabs.com:7473/browser/ 访问它。这个配置提供了一个真实的场景——向量嵌入数据已经是 Neo4j 数据库的一部分,拿来就能用。
在 Python 环境里,先把 neo4j-graphrag 包和相关依赖装好:
pip install neo4j-graphrag neo4j openai
然后,用 Neo4j Python 驱动程序建立连接:
from neo4j import GraphDatabase
URI = "neo4j+s://demo.neo4jlabs.com"
AUTH = ("recommendations", "recommendations")
driver = GraphDatabase.driver(URI, auth=AUTH)
检索
接下来,配置 Text2CypherRetriever:
from neo4j_graphrag.retrievers import Text2CypherRetriever
from neo4j_graphrag.llm import OpenAILLM
t2c_llm = OpenAILLM(model_name="gpt-3.5-turbo")
neo4j_schema = """
节点属性:
Person {name: STRING, born: INTEGER}
Movie {tagline: STRING, title: STRING, released: INTEGER}
关系属性:
ACTED_IN {roles: LIST}
REVIEWED {summary: STRING, rating: INTEGER}
关系:
(:Person)-[:ACTED_IN]->(:Movie)
(:Person)-[:DIRECTED]->(:Movie)
(:Person)-[:PRODUCED]->(:Movie)
(:Person)-[:WROTE]->(:Movie)
(:Person)-[:FOLLOWS]->(:Person)
(:Person)-[:REVIEWED]->(:Movie)
"""
examples = [
"用户输入: '《黑客帝国》有哪些演员参演?' 查询: MATCH (p:Person)-[:ACTED_IN]->(m:Movie) WHERE m.title = "The Matrix" RETURN p.name"
]
retriever = Text2CypherRetriever(
driver=driver,
llm=t2c_llm,
neo4j_schema=neo4j_schema,
examples=examples,
)
使用 Text2CypherRetriever,生成并执行查询变得非常直接:
query_text = "雨果·维文参演了哪些电影?" print(retriever.search(query_text=query_text))
返回的结果:
items=[ RetrieverResultItem(content="", metadata=None), RetrieverResultItem(content=" ", metadata=None), RetrieverResultItem(content=" ", metadata=None), RetrieverResultItem(content=" ", metadata=None), RetrieverResultItem(content=" ", metadata=None), RetrieverResultItem(content=" ", metadata=None), RetrieverResultItem(content=" ", metadata=None), RetrieverResultItem(content=" ", metadata=None) ] metadata={ 'cypher': "MATCH (p:Person {name: 'Hugo Wea ving'})-[:ACTED_IN]->(m:Movie) RETURN m.title", '__retriever': 'Text2CypherRetriever' }
把这个检索器接入 GraphRAG 流水线:
from neo4j_graphrag.generation import GraphRAG
llm = OpenAILLM(model_name="gpt-4o", model_params={"temperature": 0})
rag = GraphRAG(retriever=retriever, llm=llm)
query_text = "雨果·维文参演了哪些电影?"
response = rag.search(query_text=query_text)
print(response.answer)
最终回答如下:
雨果·维文参演了以下电影: - 裁缝 - V字仇杀队 - 黑客帝国 - 沙漠妖姬 - 证明
总结
Text2CypherRetriever 的出现,可以说是将 Neo4j 与生成式 AI 集成的一个关键进展。它用自然语言处理替代了手写 Cypher 查询,降低了开发者的使用门槛。更重要的是,对于那些需要精确、上下文相关信息,又不想折腾向量嵌入的场景,这个工具恰好提供了非常轻量的解决方案。