Finalmente se me ocurrió una solución similar a esta:
SELECT child FROM child_parent START WITH parent =
(
SELECT DISTINCT parent FROM
(
SELECT parent
FROM child_parent
WHERE CONNECT_BY_ISLEAF = 1
START WITH child = 5
CONNECT BY PRIOR parent = child
UNION
SELECT parent
FROM child_parent
WHERE parent = 5
)
)
CONNECT BY NOCYCLE PRIOR child = parent
UNION
SELECT DISTINCT parent FROM
(
SELECT parent
FROM child_parent
WHERE CONNECT_BY_ISLEAF = 1
START WITH child = 5
CONNECT BY PRIOR parent = child
UNION
SELECT parent
FROM child_parent
WHERE parent = 5
);
Funciona con todos los nodos para el ejemplo proporcionado. Pero si una de las hojas tiene un segundo padre y el punto de partida está encima de este nodo o en una rama diferente, no funcionará.
Pero para mí es lo suficientemente bueno.
Una solución para obtener todos los nodos en el gráfico podría ser:implementar lo contrario de la consulta anterior (de arriba a abajo) y luego ejecutarlos (de abajo a arriba, de arriba a abajo) viceversa hasta que no encuentre más nodos nuevos. Esto necesitaría PL/SQL y tampoco sé sobre el rendimiento.