【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认证

相关推荐
桀桀桀桀桀桀4 分钟前
数据库中的用户管理和权限管理
数据库·mysql
superman超哥1 小时前
04 深入 Oracle 并发世界:MVCC、锁、闩锁、事务隔离与并发性能优化的探索
数据库·oracle·性能优化·dba
用户8007165452001 小时前
HTAP数据库国产化改造技术可行性方案分析
数据库
engchina2 小时前
Neo4j 和 Python 初学者指南:如何使用可选关系匹配优化 Cypher 查询
数据库·python·neo4j
engchina2 小时前
使用 Cypher 查询语言在 Neo4j 中查找最短路径
数据库·neo4j
尘浮生2 小时前
Java项目实战II基于Spring Boot的光影视频平台(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·maven·intellij-idea
威哥爱编程2 小时前
SQL Server 数据太多如何优化
数据库·sql·sqlserver
小华同学ai2 小时前
AJ-Report:一款开源且非常强大的数据可视化大屏和报表工具
数据库·信息可视化·开源
Acrelhuang2 小时前
安科瑞5G基站直流叠光监控系统-安科瑞黄安南
大数据·数据库·数据仓库·物联网
十叶知秋3 小时前
【jmeter】jmeter的线程组功能的详细介绍
数据库·jmeter·性能测试