图查询
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)
);
| person1 | person2 | since |
|---|---|---|
| Alice | Bob | 2020-01-01 |
| Bob | Charlie | 2021-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_person | end_person | hops |
|---|---|---|
| Alice | Charlie | 2 |
图算法
警告:由于已知问题,图算法函数当前可能失败并返回
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;