【PGCCC】使用 Postgres 递归 CTE 进行图形检索

您是否知道可以将 Postgres 用作某些用例的图形数据库?

假设您有如下图表:

我们可以在 NetworkX 中构建此图:

sql 复制代码
 1import networkx as nx
 2
 3G = nx.Graph()
 4
 5G.add_edges_from([
 6    ("A", "B"),
 7    ("A", "C"),
 8    ("A", "D"),
 9    ("A", "E"),
10    ("A", "F"),
11    ("E", "G"),
12    ("F", "G"),
13    ("E", "H"),
14    ("H", "I"),
15    ("D", "I"),
16    ("J", "K"),
17    ("C", "K"),
18    ("C", "L"),
19    ("B", "L"),
20    ("B", "M"),
21    ("N", "O"),
22    ("P", "R"),
23    ("P", "Q"),
24    ("P", "S"),
25    ("R", "S"),
26    ("Q", "S")
27])

要将其存储在 Postgres 中,请创建一个edges表:

sql 复制代码
1CREATE TABLE IF NOT EXISTS edges (
2    u TEXT,
3    v TEXT
4    -- add other edge attributes
5)
将边插入到表中:

 1INSERT INTO edges (u, v) 
 2VALUES
 3    ('A', 'B'),
 4    ('A', 'C'),
 5    ('A', 'D'),
 6    ('A', 'E'),
 7    ('A', 'F'),
 8    ('B', 'L'),
 9    ('B', 'M'),
10    ('C', 'K'),
11    ('C', 'L'),
12    ('D', 'I'),
13    ('E', 'G'),
14    ('E', 'H'),
15    ('F', 'G'),
16    ('H', 'I'),
17    ('J', 'K'),
18    ('N', 'O'),
19    ('P', 'R'),
20    ('P', 'Q'),
21    ('P', 'S'),
22    ('Q', 'S'),
23    ('R', 'S');

现在我们已经存储了图形,让我们看看如何从 Postgres 中检索连通分量。如果我们想检索连接到"A"的所有节点,我们可以使用这个递归 CTE:

sql 复制代码
1WITH RECURSIVE cc AS (
 2    SELECT
 3        u, v
 4    FROM
 5        edges
 6    WHERE
 7        u = 'A' OR v = 'A'
 8
 9    UNION
10
11    SELECT
12        e.u, e.v
13    FROM
14        edges e
15    INNER JOIN
16        cc c ON 
17            c.u = e.v OR
18            c.v = e.u OR
19            c.v = e.v OR
20            c.u = e.u
21)
22
23SELECT * FROM cc;

它的视觉工作原理如下:

结论

使用 Postgres 存储图表的优点在于,如果您的实体(节点)已经存储在其他表中,那么您就可以将实体元数据和关系(图表)保存在同一个数据库中,从而避免 Postgres 和图表数据库之间的数据同步。

几点注意事项:

  • 我使用的图是具有数百万个连通分量的不相交无向图。这些图对于实体解析用例非常常见。
  • 检索后,我使用 NetworkX、igraph 等应用程序级库来应用图形算法。与 Neo4j等图形数据库中提供的少数图形算法选项相比,此设置为我提供了更多图形算法选项。
  • 如果您的图很大或者直径很大,最好添加语句超时或限制递归深度,以便上述查询不会花费很长时间。下面是如何实现它们的示例。
  • 我省略了约束和索引之类的内容,这些可以根据您的用例添加。
    【PGCCC】PostgreSQL培训考试认证中心,国内权威PG培训认证机构,由工业和信息化部教育与考试中心直发证书。咨询【加V:pgccc400】

#PCP#PCA#postgresql培训#postgresql考试#postgresql认证

相关推荐
时光书签37 分钟前
Mongodb副本集群为什么选择3个节点不选择4个节点
数据库·mongodb·nosql
人才程序员2 小时前
【C++拓展】vs2022使用SQlite3
c语言·开发语言·数据库·c++·qt·ui·sqlite
极客先躯2 小时前
高级java每日一道面试题-2025年01月23日-数据库篇-主键与索引有什么区别 ?
java·数据库·java高级·高级面试题·选择合适的主键·谨慎创建索引·定期评估索引的有效性
指尖下的技术2 小时前
Mysql面试题----MyISAM和InnoDB的区别
数据库·mysql
永远是我的最爱3 小时前
数据库SQLite和SCADA DIAView应用教程
数据库·sqlite
指尖下的技术3 小时前
Mysql面试题----为什么B+树比B树更适合实现数据库索引
数据结构·数据库·b树·mysql
数据馅4 小时前
python自动生成pg数据库表对应的es索引
数据库·python·elasticsearch
峰子20124 小时前
B站评论系统的多级存储架构
开发语言·数据库·分布式·后端·golang·tidb
浏览器爱好者5 小时前
如何使用MongoDB进行数据存储?
数据库·mongodb
yuanpan5 小时前
MongoDB中的横向扩容数据分片
数据库·mongodb