我在 Postgres 9.1 中表示一个图(恰好是双向和循环的):
CREATE TABLE nodes (
id SERIAL PRIMARY KEY,
name text
);
CREATE TABLE edges (
id SERIAL PRIMARY KEY,
node1_id int REFERENCES nodes(id),
node2_id int REFERENCES nodes(id)
);
给定一个特定的节点 ID,想要检索该集群中的所有其他节点。我从这里的“来自单个节点的路径”示例开始,这就是我得到的地方:
WITH RECURSIVE search_graph(id, path) AS (
SELECT id, ARRAY[id]
FROM nodes
UNION
SELECT e.node2_id, sg.path || e.node2_id
FROM search_graph sg
JOIN edges e
ON e.node1_id = sg.id
)
-- find all nodes connected to node 3
SELECT DISTINCT id FROM search_graph WHERE path @> ARRAY[3];
我不知道a)是否有更简单的方法来编写它,因为我不关心收集完整的path
,以及b)如何使它在两个方向上遍历(node1
->node2
和node2
->node1
每个边缘)。对一个好的方法有任何启发将不胜感激。谢谢!