首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Oracle慌了|PG也将内置PGQ特性

Oracle慌了|PG也将内置PGQ特性

作者头像
用户4035096
发布2026-07-09 18:39:28
发布2026-07-09 18:39:28
10
举报

抱歉,又拿国际数据库Oracle开怼了,主要是怼国产容易被围攻。

进入正题。

PGQ是SQL:2023出台的属性图查询标准,一些人可能还不太熟悉,据称目前关系数据库仅Oracle 23ai率先支持了该标准。

我们先回顾一下,本来PG很早以前就可以通过AGE插件支持图查询,但是但是AGE插件被公司裁员搞没了,详见: 《裁员导致AGE开源图数据库项目面临死亡! 我们还能相信企业开源产品吗?》

不过没关系,昨天刚分享了一篇曲线救国的方法,且性能劲爆: 图数据库搅局者|每秒处理数十亿条边

作为PG老司机甚至还可以使用最炫技的递归SQL来实现图式搜索(详见: https://github.com/digoal/blog )

  • 《PostgreSQL 递归查询 - 深度优先、广度优先 搜索举例 - BREADTH DEPTH》
  • 《PostgreSQL 图式搜索(graph search)实践 - 百亿级图谱,毫秒响应》

但是今天主要分享的这个劲爆新闻可能令Oracle优势不保!

PG极有可能在下一个版本内置PGQ,Oracle表示有点慌!(PS:慌个锤子,O已经不靠数据库赚钱了)

这可不是空穴来风,patch都已经有了, 有人在pg 18 beta2打上patch, 玩得贼拉六.

下面就来看看PG PGQ怎么玩的。下一篇分享DuckPGQ.

以下内容翻译自: https://gavinray97.github.io/blog/postgres-sql-property-graphs

在 Postgres 18 中尝试 SQL:2023 PGQ图查询

TL;DR

获取下面的 Docker 镜像,连接psql,然后尝试图查询。SQL/PGQ 的使用体验就像轻松使用 Cypher。

简介

SQL:2023 引入了一种用于图形查询的新语法。

这种图查询语言被称为“SQL/PGQ”。您可以在下面阅读更多相关信息:

  • https://www.iso.org/standard/79473.html
  • https://www.postgresql.org/message-id/a855795d-e697-4fa5-8698-d20122126567%40eisentraut.org
  • https://blogs.oracle.com/database/post/property-graphs-in-oracle-database-23ai-the-sql-pgq-standard

到目前为止,只有 Oracle 23 发布了对它的支持,但我想向您展示如何在 Postgres 中试验 SQL/PGQ。

原作者说得不对, DuckDB也支持SQL/PGQ: https://duckpgq.org/documentation/sql_pgq/

明天就来分享DuckPGQ. 欢迎关注本公众号消息。

Postgres 18beta2 + SQL/PGQ 补丁的 Docker 镜像

我发布了一个 Docker 镜像,其中包含 Postgres 的最新版本并应用了邮件列表中的 SQL/PGQ 补丁。

代码语言:javascript
复制
docker run -d \  
  --name postgres-pgq \  
  -p 5432:5432 \  
  -v postgres-data:/var/lib/postgresql/data \  
  -e PGDATA=/var/lib/postgresql/data \  
  -e POSTGRES_PASSWORD=postgres \  
  gavinray/postgres-18beta2-pgql:latest  
  
docker exec -it postgres-pgq psql -U postgres -d postgres  

示例:电子商务产品推荐

虽然这个例子已经被用烂了,但它是展示 PGQ 的好方法。

假设我们有usersproducts,和purchases

代码语言:javascript
复制
-- Node Table: Users  
CREATE TABLE users (  
    id INT GENERATED ALWAYS AS IDENTITY,  
    name TEXT NOT NULL  
);  

-- Node Table: Products  
CREATE TABLE products (  
    id INT GENERATED ALWAYS AS IDENTITY,  
    name TEXT NOT NULL,  
    price NUMERIC(10, 2)  
);  

-- Edge Table: Purchases linking users and products  
CREATE TABLE purchases (  
    user_id INT REFERENCES users(id),  
    product_id INT REFERENCES products(id),  
    purchase_date DATE DEFAULT CURRENT_DATE,  
    PRIMARY KEY (user_id, product_id)  
);  

假设我们有AliceBobAlice购买一台笔记本电脑和一个鼠标,Bob购买一台笔记本电脑和一个键盘:

代码语言:javascript
复制
INSERT INTO  
    users (name)  
VALUES  
    ('Alice'), -- id 1  
    ('Bob'); -- id 2  

INSERT INTO  
    products (name, price)  
VALUES  
    ('Laptop', 1200.00), -- id 1  
    ('Mouse', 25.00), -- id 2  
    ('Keyboard', 75.00); -- id 3  

-- Insert purchases (edges)  
INSERT INTO  
    purchases (user_id, product_id)  
VALUES  
    (1, 1), -- Alice bought a Laptop  
    (1, 2), -- Alice bought a Mouse  
    (2, 1), -- Bob bought a Laptop (the shared item)  
    (2, 3); -- Bob bought a Keyboard (the recommendation)  

现在我们可以了解事情的本质:图定义和对它的查询。

我们首先定义一个PROPERTY GRAPH,并为其声明VERTEXEDGE表。此 DDL 语句的文档位于:

  • https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-property-graph.html
代码语言:javascript
复制
CREATE PROPERTY GRAPH recommender_graph  
VERTEX TABLES (  
    users LABEL users PROPERTIES (id, name),  
    products LABEL product PROPERTIES (id, name, price)  
)  
EDGE TABLES (  
    purchases  
    SOURCE KEY (user_id) REFERENCES users (id)  
    DESTINATION KEY (product_id) REFERENCES products (id)  
    LABEL BOUGHT  
);  

pic

我们可以问这样的问题:“Alice 还没有购买的类似产品有哪些?”

PGQL 中该语句的语法(好吧,它的一种表示)是:

代码语言:javascript
复制
-- (Alice) -> (Shared Product) <- (Similar User) -> (Recommended Product)  
  
SELECT DISTINCT g.rec_id, g.rec_name  
FROM GRAPH_TABLE (  
       recommender_graph  
       MATCH   (me  IS users    WHERE me.name = 'Alice')  
               -[:BOUGHT]->(p   IS product)<-[:BOUGHT]-(sim IS users)  
               -[:BOUGHT]->(rec IS product)  
       COLUMNS (me.id  AS uid,  
                rec.id AS rec_id,  
                rec.name AS rec_name)  
) AS g  
WHERE NOT EXISTS (  
        SELECT 1  
        FROM   purchases p  
        WHERE  p.user_id    = g.uid  
          AND  p.product_id = g.rec_id  
);  

这应该返回:

代码语言:javascript
复制
| Rec id | Rec name |  
| :----- | :------- |  
| 3      | Keyboard |  

看来Alice买了笔记本电脑和鼠标后,可能会想要买个键盘!太棒了。

补丁和构建详细信息

https://www.postgresql.org/message-id/CAEG8a3L3uZZRT5Ra5%3D9G-SOCEYULejw5eqQE99VL0YfTeX3-BA%40mail.gmail.com

代码语言:javascript
复制
Attachment Content-Type Size  
v10-0011-do-not-use-default-COLLATE.patch application/octet-stream 5.8 KB  
v10-0012-trivial-refactor-of-property-graph-object-addres.patch application/octet-stream 17.1 KB  
v10-0010-adapt-property-graph-to-more-intuitive-titles.patch application/octet-stream 2.6 KB  
v10-0008-Document-fixes.patch application/octet-stream 5.1 KB  
v10-0009-WIP-Do-not-print-empty-columns-table-for-a-prope.patch application/octet-stream 14.1 KB  
v10-0007-RLS-tests.patch application/octet-stream 182.1 KB  
v10-0006-Property-collation-and-edge-vertex-link-support.patch application/octet-stream 114.3 KB  
v10-0005-Access-permissions-on-property-graph.patch application/octet-stream 11.9 KB  
v10-0004-Fixes-following-issues.patch application/octet-stream 36.2 KB  
v10-0003-Support-cyclic-path-pattern.patch application/octet-stream 37.4 KB  
v10-0002-support-WHERE-clause-in-graph-pattern.patch application/octet-stream 7.2 KB  
v10-0001-WIP-SQL-Property-Graph-Queries-SQL-PGQ.patch application/octet-stream 504.4 KB  

此外,Dockerfile 中还有一些 hacky 补丁,它们删除了与塞尔维亚语语言环境和词干相关的大量功能,以修复编译错误。

进一步阅读

https://pgconf.in/conferences/pgconfin2025/program/proposals/895

https://www.enterprisedb.com/blog/representing-graphs-postgresql-sqlpgq

期待 Postgres 合并PGQ patch的那一天。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-07-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 digoal德哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 在 Postgres 18 中尝试 SQL:2023 PGQ图查询
    • 简介
    • Postgres 18beta2 + SQL/PGQ 补丁的 Docker 镜像
    • 示例:电子商务产品推荐
    • 补丁和构建详细信息
    • 进一步阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档