您是否知道可以将 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认证