我代表了在Postgres 9.1的图形(恰好是双向和循环):查找集群节点给出PostgreSQL中
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,要检索该群中的其他节点。我开始与例如here的“从单个节点路径”,而这正是我:
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];
我想不出一个),如果有,因为我不写这个简单的方法关心收集完整的path
,以及b)如何使它在两个方向上移动(node1
- >node2
和node2
- >node1
)。谢谢你的一个好方法,任何灯光将不胜感激。谢谢!
一般来说,我会省略'edges.id'列,并使用两个对'nodes'的引用作为复合主键,可能也会以相反顺序引用它们作为唯一索引。除非需要有多个相同的链接,否则'edges.id'列只是自重。 – kgrittn
当然 - 这是一个简单化。还会有其他属性绑定到边缘,零边或更多边连接任何两个节点,因此复合主键不会是唯一的。 –