おそらく、一度に両方の方向から息をのむように?A の隣人、および B の隣人を取ります。まだリンクが見つからない場合は、A を「a の隣人」に追加し、B を「B の隣人」に追加してから、2 つのセット間のリンクを見つけます。
3 つのリンクよりも少し拡張するには、「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
終わったら、テーブルをきれいにすることを忘れないでください!すべてを 1 つのトランザクションとして実行し、ロールバックするのが最も簡単な方法かもしれません。