我代表了在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
當然 - 這是一個簡單化。還會有其他屬性綁定到邊緣,零邊或更多邊連接任何兩個節點,因此複合主鍵不會是唯一的。 –