ByteNoteByteNote

字节笔记本

2026年5月30日

Text2Cypher:用自然语言查 Neo4j,不用学 Cypher

API中转
¥120

查询数据库不一定需要会 SQL 或 Cypher。自然语言直接转图查询,已经可以在生产环境中用了。

Text2CypherRetriever 做的事很直接:你把自然语言问题丢给它,它让 LLM 生成 Cypher 查询,在 Neo4j 中执行,然后把结果返回给你。整个过程对用户透明。

安装和连接:

bash
pip install neo4j-graphrag neo4j openai
python
from neo4j import GraphDatabase

URI = "neo4j+s://demo.neo4jlabs.com"
AUTH = ("recommendations", "recommendations")
driver = GraphDatabase.driver(URI, auth=AUTH)

核心配置是给 LLM 提供数据库 schema 和示例查询,让模型理解图结构和查询模式:

python
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}
关系:
(:Person)-[:ACTED_IN]->(:Movie)
(:Person)-[:DIRECTED]->(:Movie)
(:Person)-[:FOLLOWS]->(:Person)
"""

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,
)

查询时只需输入自然语言:

python
query_text = "雨果·维文参演了哪些电影?"
result = retriever.search(query_text=query_text)

会自动生成 Cypher 并执行:

cypher
MATCH (p:Person {name: 'Hugo Weaving'})-[:ACTED_IN]->(m:Movie) RETURN m.title

返回结果可以直接用,也可以接入 GraphRAG 流水线做进一步的生成式回答:

python
from neo4j_graphrag.generation import GraphRAG

llm = OpenAILLM(model_name="gpt-4o", model_params={"temperature": 0})
rag = GraphRAG(retriever=retriever, llm=llm)

response = rag.search(query_text="雨果·维文参演了哪些电影?")
print(response.answer)

输出:

雨果·维文参演了以下电影:裁缝、V字仇杀队、黑客帝国、沙漠妖姬、证明

Text2Cypher 的优势在于它不需要向量嵌入,不需要管理文档切分,直接面向结构化数据做精确查询。对于知识图谱类的数据场景,"问一句就能查到"比"建一套搜索系统"实用得多。

分享: