Возможно, сначала дыхание с обеих сторон одновременно?Возьмите соседей A и соседей B. Если вы еще не нашли ссылку, добавьте A к «соседям a» и B к «соседям B», затем найдите любую связь между двумя наборами.
Чтобы расширить его немного больше, чем на три ссылки, списки «соседей A / B» должны содержать немного больше.Вы не сможете сделать это в памяти - вам понадобится таблица с параметрами
whatever TRANSACTION_ID; (or use an ORACLE 1-per-session temp table)
boolean MY_BFS_WAS_ROOTED_AT_A;
int NODE_ID;
int previous_node_id;
(вам не нужно отслеживать глубину, если вы проверяете петли в своем операторе вставки)
вы нашли путь, когда существует какой-либо
select from pathfinder a, pathfinder b
where a.taxn_id = foo and b.tnx_id=foo
and a.MY_BFS_WAS_ROOTED_AT_A = false
and b.MY_BFS_WAS_ROOTED_AT_A = true
and a.node_id = b.node_id
Не забудьте очистить таблицу, когда вы закончите!Выполнение всего одной транзакции и откат назад может быть самым простым способом.