Je représente un graphe dans Postgres 9.1 (qui se trouve être bidirectionnel et cyclique) :
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)
);
Étant donné un ID de nœud particulier, je veux récupérer tous les autres nœuds dans ce cluster. J'ai commencé par l'exemple "Chemins à partir d'un seul noeud". aquí et c'est là que je suis arrivé :
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];
Je n'arrive pas à savoir a) s'il y a une manière plus simple d'écrire ceci puisque je ne me soucie pas de collecter l'intégralité de l'information. path
et b) comment le faire traverser dans les deux sens ( node1
-> node2
y node2
-> node1
pour chaque bord). Je vous serais reconnaissant de m'éclairer sur une bonne approche. Merci.