news 2026/5/6 22:25:23

PostgreSQL 图数据库化方案:Apache AGE 的引入与实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PostgreSQL 图数据库化方案:Apache AGE 的引入与实践

一、介绍

图数据库擅长处理复杂关联关系,而 PostgreSQL 擅长事务型数据管理。Apache AGE 通过扩展方式将图数据库能力引入 PostgreSQL,使其在保持原有稳定性与生态优势的同时,补齐了图数据建模与查询能力的短板。这种“关系型数据库 + 图模型”的融合架构,为需要同时处理强事务与复杂关系的数据场景提供了一种务实且高性价比的技术路径。

二、架构

Apache AGE 是一个 PostgreSQL 的扩展,用户能够在现有关系数据库中使用图数据库。AGE 是 A Graph Extension 的缩写。

特点

  • 采用符合OpenCypher规范的查询解析器,支持标准化的图查询语言;

  • Cypher 查询语句转换为 PostgreSQL 可识别和执行的内部查询表示;

  • 能够解析和理解图数据操作语义,并生成对应的图查询执行计划

  • 按照生成的执行计划高效执行图查询与图计算操作;

  • 在执行 Cypher 查询的同时,完整继承PostgreSQL 的 ACID 事务特性,确保数据一致性与可靠性。

三、配置AGE插件

  • 安装Apache AGE图扩展插件

#编译安装插件yum install gcc glibc glib-common readline readline-devel zlib zlib-devel flex bisonmake PG_CONFIG=/usr/local/pgsql17/bin/pg_config install

  • 加载扩展插件

#AGE这个插件与其他插件不同,安装后。为了让数据库能够找到 AGE 的函数,如 create_graph(),还需要设置搜索路径。create extension age; LOAD 'age';SET search_path = ag_catalog, "$user", public;

四、图形在PostgreSQL中的存储形态

在使用AGE创建图表时,将为每个单独的图生成一个命名空间。 创建的图可以在ag_catalog命名空间的ag_graph表中查看:

graphid | name | namespace ---------+------------+------------ 17012 | graph_dba | graph_dba 17034 | graph_test | graph_test

创建图表后,在图表的命名空间下将创建两个表来存储顶点和边:_ag_label_vertex_ag_label_edge,这两个表作为点和边表的母表,之后创建任何类型的点表和边表都继承该表。同时,会将_ag_label_vertex和_ag_label_edge作为点和边表的信息插入ag_label中

  • name→ 标签名称或内部标签名

  • graph→ 图的唯一 ID

  • id→ 标签唯一 ID

  • kind→ 'v' 节点或 'e' 边

  • relation→ 底层 PostgreSQL 表名

  • seq_name→ 自增序列名(ID 自增用)

name | graph | id | kind | relation | seq_name ------------------+-------+----+------+-----------------------------+------------------------- _ag_label_vertex | 17012 | 1 | v | graph_dba._ag_label_vertex | _ag_label_vertex_id_seq _ag_label_edge | 17012 | 2 | e | graph_dba._ag_label_edge | _ag_label_edge_id_seq Person | 17012 | 3 | v | graph_dba."Person" | Person_id_seq FRIEND | 17012 | 4 | e | graph_dba."FRIEND" | FATHER_id_seq

节点表记录了节点的属性,关系表则记录了点之间的联系

select * from graph_dba."Person"; id | properties -----------------+---------------------- 844424930131975 | {"name": "Jack"} 844424930131976 | {"name": "Tom"}select * from graph_dba."FRIEND"; id | start_id | end_id | properties ------------------+-----------------+-----------------+----------------- 1407374883553282 | 844424930131975 | 844424930131976 | {"since": 2015} 1407374883553283 | 844424930131976 | 844424930131975 | {"since": 2015}

五、语法解析

5.1 Cypher语法

  • 节点(node) :图中的实体,可以设置标签(Label)表示类型,设置属性(Property)存储信息

  • 关系(Relationship):连接两个节点,表示二者之间的联系. 拥有方向(单向或者双向),同样可以设置标签及属性

  • 核心语法:MATCH:匹配节点和关系、WHERE:过滤条件。RETURN:返回结果。

5.2 SQL语法与Cypher语法的结合

  • 在 Apache AGE 中,所有 Cypher 都必须通过 SQL 函数调用,不能直接执行MATCH,必须显式声明返回列结构。调用的Cypher语法必须使用$$包裹,避免SQL Parser冲突

SELECT * FROM cypher('graph_dba', //SQL调用Cypher函数,查询图graph_dba$$ MATCH (n) //Cypher匹配所有节点 RETURN n$$) AS (n agtype); //返回JSON类型结果
  • 图操作

1、创建&&删除SELECT * FROM ag_catalog.create_graph('graph_dba');SELECT * FROM ag_catalog.drop_graph('graph_dba', true); graphid | name | namespace ---------+------------+------------ 17012 | graph_dba | graph_dba
  • 节点操作

#创建多个点SELECT *FROM cypher( 'graph_dba', $$ UNWIND [ {name:'zhang3'}, {name:'li4'} ] AS row CREATE (p:Person { name: row.name }) RETURN p $$) AS (p agtype); p -------------------------------------------------------------------------------------- {"id": 844424930131969, "label": "Person", "properties": {"name": "zhang3"}}::vertex {"id": 844424930131970, "label": "Person", "properties": {"name": "li4"}}::vertex
  • 关系(边)操作

#创建点之间的关系SELECT *FROM cypher( 'graph_dba', $$ MATCH (a:Person {name:'zhang3'}), (b:Person {name:'li4'}) MERGE (a)-[r:FRIENDS {since:2001}]->(b) RETURN r $$) AS (r agtype); r ------------------------------------------------------------------------------------------------------------------------------------------- {"id": 1125899906842625, "label": "FRIENDS", "end_id": 844424930131970, "start_id": 844424930131969, "properties": {"since": 2001}}::edge
  • 查询

#根据关系及关系的属性进行匹配查询SELECT *FROM cypher( 'graph_dba', $$ MATCH (a:Person {name:'zhang3'})-[r:FRIENDS]->(b:Person) WHERE r.since = 2001 RETURN b $$) AS (b agtype); b ----------------------------------------------------------------------------------- {"id": 844424930131970, "label": "Person", "properties": {"name": "li4"}}::vertex

六、 应用样例

用户在应用层提出自然语言查询。该问题首先传入LangChain 的 GraphCypherQAChain,链内部调用LLM 引擎将自然语言自动转换为Cypher 查询语句。生成的 Cypher 查询通过AGE图实例(AGEGraph)发送到PostgreSQL + Apache AGE 图数据库执行,检索出对应的图结构数据(节点、关系及属性)。数据库返回的结果再次由 LLM 解析和整理,最终以自然语言答案的形式返回给用户。

from langchain_community.graphs.age_graph import AGEGraphfrom langchain.chains import GraphCypherQAChainfrom langchain_openai import ChatOpenAIdef main(): # 1. 配置并连接 Apache AGE 图数据库 conf = { "database": "postgresDB", "user": "postgresUser", "password": "postgresPW", "host": "localhost", "port": 5432, } # graph_name 是 AGE 中的具体图名称 graph = AGEGraph(graph_name="age_test", conf=conf) # 2. 填充一些示例图数据(如果数据库为空) 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. 使用 ChatOpenAI LLM 创建 LangChain 查询链 llm = ChatOpenAI(temperature=0) # 使用默认模型 chain = GraphCypherQAChain.from_llm( llm, graph=graph, verbose=True, allow_dangerous_requests=True ) # 4. 输入自然语言查询 question = "Who played in Top Gun?" # 5. 执行链并输出结果 response = chain.invoke(question) print("自然语言查询:", response["query"]) print("生成答案:", response["result"])if __name__ == "__main__": main()

七、总结

在 PostgreSQL 图数据库化的实践中,Apache AGE 的引入为传统关系型数据库注入了强大的图计算能力。作为 PostgreSQL 的插件,AGE 无需额外独立部署,便可在熟悉的数据库环境中管理节点、关系及属性,实现图数据的存储与查询。其原生支持 Cypher 查询语言,使得图分析与知识图谱构建变得更为简便,同时保留了 PostgreSQL 在事务管理、扩展性和生态兼容性方面的优势。如需启用或试用相关能力,请联系 DBA 进行评估与支持。未来,我们计划在此基础上引入更多 PostgreSQL 插件,进一步拓展数据库的功能边界,为企业数据应用提供更多可能性。

云数据库产品,提供一站式全生命周期数据库服务自助管理能力,产品访问使用请联系官方客服。

END

360智汇云AI产品推荐:

大模型开发TLM:https://zyun.360.cn/product/tlm

AI标注平台TLP:https://zyun.360.cn/product/tlp

AI评测平台TEP:https://console.zyun.360.cn/tep

MCP市场MCPMKT:https://console.zyun.360.cn/mcpmkt

智能体对话AIMI:https://zyun.360.cn/product/aimi

智能体记忆AMS:https://console.zyun.360.cn/ams/

更多技术干货,

请关注“360智汇云开发者”👇

360智汇云是以"汇聚数据价值,助力智能未来"为目标的企业应用开放服务平台,融合360丰富的产品、技术力量,为客户提供平台服务。目前,智汇云提供数据库、中间件、存储、大数据、人工智能、计算、网络、视联物联与通信等多种产品服务以及一站式解决方案。

官网:https://zyun.360.cn(复制在浏览器中打开)

更多好用又便宜的云产品,欢迎试用体验~

添加工作人员企业微信👇,get更快审核通道+试用包哦~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/29 9:16:03

【倒计时一天】2025第八届金猿大数据产业发展论坛——暨AI InfraData Agent趋势论坛丨颁奖典礼·上海

第八届金猿颁奖典礼“重要提示➩ 活动报名&现场签到有好礼,先到先得点此小程序链接可报名参会大数据产业创新服务媒体——聚焦数据 改变商业数智产业正站在变革的临界点上。过去十年,大数据从技术概念演进为基础设施,完成了产业奠基&…

作者头像 李华
网站建设 2026/5/2 16:41:40

Figma中文插件完全配置指南:告别英文界面困扰

Figma中文插件完全配置指南:告别英文界面困扰 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma复杂的英文界面而头疼吗?面对专业设计工具,…

作者头像 李华
网站建设 2026/5/3 22:16:13

Figma中文界面本地化:设计师专属的语言解决方案

Figma中文界面本地化:设计师专属的语言解决方案 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 语言障碍的痛点与解决方案 对于国内设计从业者而言,Figma作为专…

作者头像 李华
网站建设 2026/5/6 19:15:23

Day 33:【99天精通Python】日志记录 (Logging) - 告别 Print 调试

Day 33:【99天精通Python】日志记录 (Logging) - 告别 Print 调试 前言 欢迎来到第33天! 在之前的编程练习中,当我们需要调试代码或者查看程序运行状态时,最常用的办法就是 print()。 但是在真正的项目开发(尤其是服务…

作者头像 李华
网站建设 2026/5/6 17:25:38

基于STSW-LINK007工具的STLink升级实战案例

STLink固件升级实战:从避坑到精通的完整指南 在嵌入式开发的世界里,调试器就像医生的听诊器——看不见它的时候风平浪静,一旦“连不上”、“下不进程序”,整个项目进度立刻停摆。而当你发现原因竟是 调试器固件太老不支持新芯片…

作者头像 李华
网站建设 2026/5/3 10:10:26

大语言模型完整技术栈:从理论到实践的全面指南

本文全面介绍了大语言模型(LLM)的核心技术,包括Transformer架构、预训练挑战、分布式训练方法。重点讲解了参数高效微调(PEFT)技术如LoRA和QLoRA,以及提示工程策略。同时详细探讨了模型优化技术,包括量化(GPTQ、NF4、GGML)、蒸馏和剪枝&#…

作者头像 李华