当前位置: 首页 > news >正文

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

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

假设您有如下图表:

在这里插入图片描述
我们可以在 NetworkX 中构建此图:

 1import networkx as nx23G = nx.Graph()45G.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表:

1CREATE TABLE IF NOT EXISTS edges (
2    u TEXT,
3    v TEXT
4    -- add other edge attributes
5)
将边插入到表中:1INSERT INTO edges (u, v) 2VALUES3    ('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:

1WITH RECURSIVE cc AS (2    SELECT3        u, v4    FROM5        edges6    WHERE7        u = 'A' OR v = 'A'89    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认证


http://www.mrgr.cn/news/599.html

相关文章:

  • oracle to_char 截取创建时间 到月 分组查询 每月数量
  • 首站,北京!OpenCSG邀您共赴AI之约【2024戴尔科技峰会预告】
  • 前端图片压缩compressorjs
  • Python编码系列—Python数据可视化:Matplotlib与Seaborn的实战应用
  • 链表(linked_list)的理解以及实现
  • HTML5+JavaScript绘制彩虹和云朵
  • 记录win10下 yolov8 tensorrt模型部署
  • 【关于电商测试】接口测试笔记经验分享
  • SuperMap GIS基础产品FAQ集锦(20240812)
  • 从快到慢学习Git指令
  • 【vue讲解:ref属性、动态组件、插槽、vue-cli创建项目、vue项目目录介绍、vue项目开发规范、es6导入导出语法】
  • 【人工智能】使用NLP进行语音到文本的转换和主题的提取项目实践及案例分析一
  • java栈的实现和应用(前中后缀表达式)
  • 【数据结构】二叉树(二)遍历
  • Go语言两个主要缺点
  • 免费Excel工作表同类数据合并工具
  • Node.js的os模块
  • k8s上部署rancher
  • linux内存相关
  • 大数据基础