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