私は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
各エッジ) がわかりません。良いアプローチに光を当てていただければ幸いです。ありがとう!