使用Neo4j和LLMs构建自然语言查询接口

139 阅读3分钟

使用Neo4j和LLMs构建自然语言查询接口

引言

Neo4j是一种图数据库管理系统,通过节点、边和属性来存储数据元素。本篇文章将展示如何使用大语言模型(LLMs)和Cypher查询语言,为Neo4j数据库提供一个自然语言接口。通过这种方式,无需熟悉Cypher语法也能方便地查询图数据库。

主要内容

设置与安装

在开始之前,你需要一个运行中的Neo4j实例。你可以选择以下方式之一:

  1. 在Aura云服务中创建一个免费的Neo4j数据库实例。
  2. 使用Neo4j Desktop应用程序在本地运行数据库。
  3. 通过运行Docker容器在本地运行数据库。

以下是运行Docker容器的示例脚本:

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

启动Docker容器后,等待几秒钟以确保数据库启动完毕。

连接Neo4j数据库

接下来,我们将使用langchain库连接Neo4j数据库:

from langchain.chains import GraphCypherQAChain
from langchain_community.graphs import Neo4jGraph
from langchain_openai import ChatOpenAI

# 使用API代理服务提高访问稳定性
graph = Neo4jGraph(url="bolt://localhost:7687", username="neo4j", password="password")

数据库初始化

假设数据库是空的,我们可以使用Cypher语言来填充数据。以下的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)
"""
)

刷新图模式信息

如果数据库模式改变,我们可以刷新模式信息以生成新的Cypher语句。

graph.refresh_schema()
print(graph.schema)

增强的模式信息

选择增强的模式版本可以自动扫描数据库中的示例值并计算分布统计信息。

enhanced_graph = Neo4jGraph(
    url="bolt://localhost:7687",
    username="neo4j",
    password="password",
    enhanced_schema=True,
)
print(enhanced_graph.schema)

图数据库查询

我们可以使用GraphCypherQAChain来对图数据库进行自然语言查询。

chain = GraphCypherQAChain.from_llm(
    ChatOpenAI(temperature=0), graph=graph, verbose=True
)

result = chain.invoke({"query": "Who played in Top Gun?"})
print(result)

代码示例

以下是一个完整的示例代码:

from langchain.chains import GraphCypherQAChain
from langchain_community.graphs import Neo4jGraph
from langchain_openai import ChatOpenAI

# 使用API代理服务提高访问稳定性
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)
"""
)

# 刷新图模式信息
graph.refresh_schema()
print(graph.schema)

# 图数据库查询
chain = GraphCypherQAChain.from_llm(
    ChatOpenAI(temperature=0), graph=graph, verbose=True
)

result = chain.invoke({"query": "Who played in Top Gun?"})
print(result)

常见问题和解决方案

  1. 连接失败: 检查Neo4j实例是否已经启动,并且URL、用户名和密码是否正确。如果你在某些地区,考虑使用API代理服务来提高访问稳定性。

  2. 查询结果不准确: 确保数据库模式和数据一致,尝试刷新模式信息。

  3. 性能问题: 分析查询语句,优化Cypher查询,或增加数据库资源。

总结和进一步学习资源

通过本文,我们演示了如何使用Neo4j和LLMs构建一个自然语言查询接口,使得非技术用户也可以方便地查询图数据库。希望本文对你有所帮助!

进一步学习资源

  1. Neo4j官方文档
  2. LangChain文档
  3. OpenAI API

参考资料

  1. Neo4j 官网 neo4j.com/
  2. LangChain 官方文档 docs.langchain.com/
  3. OpenAI API 官网 platform.openai.com/docs/overvi…

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

---END---