Рассчитать ребра в полном графе с SQL - PullRequest
0 голосов
/ 10 марта 2020

Предположим, у нас есть таблица T , которая представляет ребра (неориентированного) графа. Существует два столбца X и Y , где запись в столбце X является начальным узлом, а запись в Y - конечным узлом .

Например, следующий график:

enter image description here

Может быть представлен следующей таблицей:

|-----|----|
|  X  |  Y |
|-----|----|
|  a  |  e |
|  b  |  c |
|  d  |  c |
|-----|----|

Можно ли использовать запрос SQL для создания таблицы, содержащей все ребра всех непересекающихся полных графов, подразумеваемых T ? То есть график генерируется из T путем соединения любых двух узлов с ребром, если между ними существует некоторый путь (любой длины!).

Для приведенного выше примера завершенный граф будет выглядеть так:

enter image description here

И таблица может быть:

|-----|----|
|  X  |  Y |
|-----|----|
|  a  |  e |
|  b  |  c |
|  d  |  c |
|  b  |  d |
|-----|----|

В общем, у меня складывается впечатление, что это нельзя сделать с помощью запроса SQL без использования какого-либо рекурсивного общего табличного выражения. Используя al oop, проблему можно решить, соединив T с самим собой, чтобы сгенерировать список узлов, соединенных путем длиной 2, и затем снова соединить его для путей длины 3 et c. ., остановка после n шагов, где n - количество узлов.

Однако я не думаю, что такие циклы возможны в "стандартном" SQL , Есть ли идиоматический c SQL способ сделать это?

...