PostgreSQL получает всю возможную последовательность узлов источника/назначения

У меня есть эта таблица PostgreSQL с узлом ориентированного графа:

node_id | node_sequence 
-----------------------
   1           1
   2           2 
   3           3 

Я бы вернул таблицу со всеми возможными последовательностями пунктов назначения (только в одном направлении) между узлом: (1,2); (1,2,3); (2,3). Таким образом, выходная таблица должна быть:

node_id
 ----
   1
   2
   1
   2
   3
   2
   3

Может быть, WITH RECURSIVE - это правильно, но я не могу понять, как это сделать.


person franco_b    schedule 16.11.2018    source источник
comment
Что вы определяете как комбинации a ?   -  person Tim Biegeleisen    schedule 16.11.2018
comment
Я редактирую вопрос. Я бы получил все возможные комбинации значений   -  person franco_b    schedule 16.11.2018
comment
Почему нет {1,3}? почему не сиглетоны {1}, {2}, {3}?   -  person joop    schedule 16.11.2018
comment
Это таблица графа узлов. Мне нужны все возможные ссылки, а переход с 1 на 3 в моей системе невозможен. Извините, возможно, мой ответ был не ясен. Я просто редактирую его парой комбинаций, которые мне нужны   -  person franco_b    schedule 16.11.2018


Ответы (1)


Изменить первоначальный ответ:
Кажется, у вас есть 2 ограничения, которые вы не упомянули в своем вопросе:

  • Вам нужны последовательности как минимум из 2 элементов
  • Элементы в последовательности должны располагаться в порядке возрастания и последовательно

Вот простой запрос, который делает это (CTE GraphNode должен быть заменен вашей таблицей):

WITH RECURSIVE GraphPath AS (
SELECT G2.Node, ARRAY[G1.Node, G2.Node] AS GraphPath /* Start with 2 elements */
FROM GraphNode G1
JOIN GraphNode G2 ON G1.Node + 1 = G2.Node
UNION ALL
SELECT N.Node, P.GraphPath || N.Node
FROM GraphNode N
JOIN GraphPath P ON N.Node = 1 + P.Node 
), GraphNode AS (
SELECT UNNEST(ARRAY[1,2,3]) AS Node
)
SELECT GraphPath
FROM GraphPath
ORDER BY GraphPath
person FXD    schedule 16.11.2018
comment
Это не работает. Мне не нужна комбинация {1,3} - person franco_b; 16.11.2018
comment
Можете ли вы подробно описать причину, по которой {1,3} следует исключить? Для меня это допустимо (по крайней мере, с тех пор, как вы назвали все возможные комбинации. Это потому, что 1 и 3 не являются последовательными? - person FXD; 16.11.2018
comment
Это таблица графа узлов. Мне нужны все возможные ссылки, а переход с 1 на 3 в моей системе невозможен. Извините, может быть, мой ответ не ясен. Я просто редактирую его парой комбинаций, которые мне нужны - person franco_b; 16.11.2018
comment
Если вы не можете предоставить другую таблицу, в которой хранятся ребра графа, я ничего не могу сделать. Нет оператора для вещей, которые находятся только в вашем мозгу. - person FXD; 16.11.2018
comment
Спасибо, это работает. Но это не обобщающий запрос, потому что ребро графа специфично для этого примера. У меня также есть последовательность из 100 узлов. - person franco_b; 16.11.2018
comment
Я заменяю на: GraphEdge AS ( выберите * из (выберите a.node как FromNode, b.node AS ToNode из GraphNode a левое соединение GraphNode b на b.node›a.node и b.node::int-a.node: :int=1) как foo, где ToNode не равно null ) - person franco_b; 16.11.2018
comment
Если ограничения заключались в том, что значения должны быть последовательными, почему вы не сказали об этом? Вам не нужны края для такого случая, я редактирую ответ для простого случая. - person FXD; 17.11.2018