Finalmente, cheguei a uma solução semelhante 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
);
Ele funciona com todos os nós para o exemplo fornecido. Mas se uma das folhas tiver um segundo pai e o ponto de partida estiver acima desse nó ou em uma ramificação diferente, não funcionará.
Mas para mim é bom o suficiente.
Uma solução para obter todos os nós no gráfico poderia ser:implementar o oposto da consulta acima (de cima para baixo) e depois executá-los (de baixo para cima, de cima para baixo) vice-versa até não encontrar mais novos nós. PL/SQL e também não sei sobre o desempenho.