探索 Apache AGE:为 PostgreSQL 带来图数据库的强大功能

652 阅读2分钟

探索 Apache AGE:为 PostgreSQL 带来图数据库的强大功能

引言

Apache AGE 是一个为 PostgreSQL 提供图数据库功能的扩展。其全称为 A Graph Extension,灵感源自 Bitnine 的 PostgreSQL 10 分支 AgensGraph。AGE 的目标是创建一个可以同时处理关系型和图模型数据的单一存储,这样用户可以使用标准 ANSI SQL 以及图查询语言 openCypher。本文将介绍如何通过自然语言界面查询图数据库中的数据,并提供实际操作示例。

设置环境

要开始使用 Apache AGE,您需要在 PostgreSQL 实例上安装 AGE 扩展。一个简单的测试方法是运行官方 AGE Docker 镜像:

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

安装完毕后,您可以使用 langchain 库中的 GraphCypherQAChainAGEGraph 来和数据库进行交互:

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)

数据库初始化

通过 Cypher 查询语言可以很容易地为数据库添加数据。以下示例为数据库添加了电影《Top Gun》及其演员信息:

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 进行自然语言查询:

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

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

此段代码将返回电影《Top Gun》的演员列表。您还可以通过 top_k 参数限制返回结果数量,通过 return_intermediate_steps 检查中间步骤的详细信息。

常见问题和解决方案

  • 当数据库架构发生变化时如何处理? 可以使用 graph.refresh_schema() 刷新架构信息。
  • 如何提高查询的准确性? 使用 validate_cypher 参数,可以对生成的 Cypher 语句进行验证并自动修正关系方向。
chain = GraphCypherQAChain.from_llm(
    llm=ChatOpenAI(temperature=0),
    graph=graph,
    verbose=True,
    validate_cypher=True,
)

总结和进一步学习资源

Apache AGE 为 PostgreSQL 带来了强大且灵活的图数据库功能,通过结合 langchainChatOpenAI 的自然语言处理能力,开发者可以方便地与图数据库进行交互。您可以在以下链接中深入了解相关技术:

进一步的学习资源包括在线课程、社区论坛,帮助您更好地掌握和应用这一技术。

参考资料

  1. Apache AGE 源码与文档
  2. LangChain 官方库

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

---END---