PostgreSQL 19 的开发版本加入了 SQL 属性图查询能力,实施依据是 SQL/PGQ 标准 ISO/IEC 9075-16:2023。此次提交不只是增加一个查询函数,还覆盖属性图的创建、修改和删除命令,并引入对应的系统目录与 information schema 视图。这意味着开发者有机会继续使用 PostgreSQL 的表、事务和 SQL 工具链,同时用图模式描述实体之间的多跳关系。
属性图没有取代关系表
属性图通常包含两类元素:
- 顶点:用户、设备、账户、订单等实体。
- 边:关注、转账、依赖、购买等关系。
在 SQL/PGQ 模型中,底层数据仍然可以存放在普通关系表中。属性图 DDL 负责声明哪些表是顶点表、哪些表是边表,以及边的起点和终点如何引用顶点。GRAPH_TABLE 则把图模式匹配的结果转换成关系型结果集,供 SELECT、聚合、排序和连接继续处理。
这种设计的重要价值在于:团队不必为了增加一类图查询,立即把已有数据复制到另一套数据库。主键、外键、事务边界和权限模型仍可围绕 PostgreSQL 管理。不过,属性图是建立在关系数据之上的查询模型,并不意味着所有图算法都会自动具备专用图引擎的执行特征。
这次提交带来了什么
根据提交摘要,PostgreSQL 19 的 SQL/PGQ 实现至少包含以下几部分:
GRAPH_TABLE表函数,用图模式匹配生成行集。CREATE PROPERTY GRAPH、ALTER PROPERTY GRAPH和DROP PROPERTY GRAPHDDL。- 用于描述属性图元数据的新系统目录。
- 用于标准化检查图定义的 information schema 视图。
对应用开发者而言,最值得关注的是 GRAPH_TABLE。它把图查询放进 SQL 的 FROM 体系中,因此图匹配输出可以像普通表一样被筛选和消费。例如,查询可以先匹配“用户通过关系连接到另一个用户”的路径,再把匹配到的姓名、关系属性或标识投影成列。
对平台团队而言,DDL 和元数据视图同样关键。属性图不再只是一段散落在应用代码中的查询约定,而是数据库中可命名、可检查、可变更的对象。迁移工具、审计脚本和 schema 检查程序也可以围绕这些对象工作。
可以这样实践:建立一个最小社交关系图
下面是一个便于理解的最小项目。由于来源摘要没有给出最终语法细节,而且 PostgreSQL 19 尚处于开发周期,以下属性图 DDL 和 GRAPH_TABLE 查询按 SQL/PGQ 形式编写,属于可改造示例;实际运行前应以所用 PostgreSQL 19 构建版本的文档和回归测试为准。
先创建普通关系表并写入测试数据:
CREATE TABLE people (
person_id bigint PRIMARY KEY,
name text NOT NULL,
city text NOT NULL
);
CREATE TABLE follows (
follower_id bigint NOT NULL REFERENCES people(person_id),
followed_id bigint NOT NULL REFERENCES people(person_id),
since_date date NOT NULL,
PRIMARY KEY (follower_id, followed_id)
);
INSERT INTO people (person_id, name, city) VALUES
(1, 'Alice', 'Shanghai'),
(2, 'Bob', 'Beijing'),
(3, 'Carol', 'Shenzhen');
INSERT INTO follows (follower_id, followed_id, since_date) VALUES
(1, 2, DATE '2024-01-10'),
(2, 3, DATE '2024-03-15'),
(1, 3, DATE '2025-02-01');
接着把 people 声明为顶点表,把 follows 声明为有向边表:
CREATE PROPERTY GRAPH social_graph
VERTEX TABLES (
people
KEY (person_id)
LABEL person
PROPERTIES (person_id, name, city)
)
EDGE TABLES (
follows
KEY (follower_id, followed_id)
SOURCE KEY (follower_id) REFERENCES people (person_id)
DESTINATION KEY (followed_id) REFERENCES people (person_id)
LABEL follows
PROPERTIES (since_date)
);
一个直接关系查询可以这样表达:
SELECT *
FROM GRAPH_TABLE (
social_graph
MATCH (src IS person)-[rel IS follows]->(dst IS person)
COLUMNS (
src.name AS follower_name,
dst.name AS followed_name,
rel.since_date AS following_since
)
) AS matches
ORDER BY follower_name, followed_name;
预期结果是普通行集,因此应用程序不需要接收特殊的图对象:
follower_name | followed_name | following_since
---------------+---------------+----------------
Alice | Bob | 2024-01-10
Alice | Carol | 2025-02-01
Bob | Carol | 2024-03-15
如果开发版本支持所需的路径模式,还可以把模式改造成多跳查询,例如寻找 Alice 经过一个中间用户能够到达的人。这里需要特别检查路径重复、环路以及可变长度模式的具体语义,不能直接假设它与某种既有图查询语言完全一致。
在测试环境中检查功能
PostgreSQL 19 发布前,建议只在隔离环境中验证。已有对应开发镜像或本地构建时,可以先检查服务版本:
psql "$DATABASE_URL" -X -v ON_ERROR_STOP=1 <<'SQL'
SELECT version();
SELECT current_setting('server_version_num');
SQL
把建表、属性图 DDL 和查询保存为 sqlpgq_demo.sql 后,可用下面的命令执行,并让第一个错误立即终止脚本:
psql "$DATABASE_URL" -X -v ON_ERROR_STOP=1 -f sqlpgq_demo.sql
还应通过 PostgreSQL 19 提供的系统目录或 information schema 视图确认图对象已注册。由于摘要没有列出视图的最终名称,自动化脚本不应提前硬编码目录结构;先从目标构建版本的文档中确认名称,再加入迁移检查。
采用前需要回答的几个问题
SQL/PGQ 很适合关系数据已经在 PostgreSQL 中,而业务开始出现路径匹配需求的场景,例如权限继承、供应链依赖、账户关系或服务拓扑。它减少了跨数据库同步和双写的压力,也让结果继续进入熟悉的 SQL 分析流程。
正式采用前,应完成以下检查:
- 确认 PostgreSQL 19 正式版本中的语法、功能边界和升级规则。
- 用真实数据量执行
EXPLAIN (ANALYZE, BUFFERS),不要只依据小型样例判断性能。 - 为边表的起点、终点和常用过滤属性建立合适索引。
- 明确删除顶点时边记录的外键策略,避免留下失效关系。
- 检查图对象、底层表和投影属性的权限是否符合最小权限原则。
- 对高连通节点、环路和深路径设置测试用例,观察结果规模与执行时间。
这次提交让 PostgreSQL 的图能力进入标准 SQL 对象和查询语法的范围,但它仍是 PostgreSQL 19 开发周期中的新功能。当前最合理的动作是建立可重复的基准测试和迁移实验,等正式版本确定语法与行为后,再决定它能否替代现有的递归 CTE、应用层遍历或独立图数据库。