跳到主要内容

图查询

Goose 通过 DuckPGQ 社区扩展支持图查询,该扩展实现了 SQL:2023 标准中的 SQL/PGQ 语法。

图查询可让你在连通数据中查找模式与路径,例如社交网络、金融交易或知识图谱,语法直观且易读。

警告:DuckPGQ 是社区扩展,仍在积极开发中。部分功能可能尚未完善。最新状态请查看 DuckPGQ 官网

安装 DuckPGQ

INSTALL duckpgq FROM community;
LOAD duckpgq;

创建属性图

属性图由顶点(节点)和边(关系)组成。你可以在现有表之上创建这层图模型:

CREATE TABLE Person (id BIGINT, name VARCHAR);
CREATE TABLE Knows (person1_id BIGINT, person2_id BIGINT, since DATE);

INSERT INTO Person VALUES (1, 'Alice'), (2, 'Bob'), (3, 'Charlie');
INSERT INTO Knows VALUES (1, 2, '2020-01-01'), (2, 3, '2021-06-15');

CREATE PROPERTY GRAPH social_network
VERTEX TABLES (
Person
)
EDGE TABLES (
Knows
SOURCE KEY (person1_id) REFERENCES Person (id)
DESTINATION KEY (person2_id) REFERENCES Person (id)
);

模式匹配

使用 GRAPH_TABLE 配合 MATCH 查找模式。语法中 () 表示节点,[] 表示边:

FROM GRAPH_TABLE (social_network
MATCH (a:Person)-[k:Knows]->(b:Person)
COLUMNS (a.name AS person1, b.name AS person2, k.since)
);
person1person2since
AliceBob2020-01-01
BobCharlie2021-06-15

路径查找

使用 {1,5}(1 到 5 跳)或 +(一跳及以上)等量词查找可变长度路径:

FROM GRAPH_TABLE (social_network
MATCH p = ANY SHORTEST (a:Person)-[k:Knows]->{1,3}(b:Person)
WHERE a.name = 'Alice' AND b.name = 'Charlie'
COLUMNS (a.name AS start_person, b.name AS end_person, path_length(p) AS hops)
);
start_personend_personhops
AliceCharlie2

图算法

警告:由于已知问题,图算法函数当前可能失败并返回 csr_cte does not exist 错误。

DuckPGQ 内置了若干图算法:

函数说明
pagerank(graph, vertex_label, edge_label)计算 PageRank 中心性分数
local_clustering_coefficient(graph, vertex_label, edge_label)衡量节点邻居之间的连通程度
weakly_connected_component(graph, vertex_label, edge_label)识别弱连通分量

示例:

FROM pagerank(social_network, Person, Knows);

用例:金融欺诈检测

图查询非常适合在金融数据中识别可疑模式。

清理

删除属性图:

DROP PROPERTY GRAPH social_network;

延伸阅读