PostgreSQL 19 引入 SQL/PGQ:用标准 SQL 查询属性图

2026-08-01 28 预计阅读时间: 1 分钟
来源: postgr.es AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:9 分钟

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 GRAPHALTER PROPERTY GRAPHDROP PROPERTY GRAPH DDL。
  • 用于描述属性图元数据的新系统目录。
  • 用于标准化检查图定义的 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、应用层遍历或独立图数据库。


相关推荐