Получить все узлы структуры ориентированного графа n-> n в базе данных PostgreSQL SQL по одному задействованному идентификатору - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь написать запрос SQL, который будет извлекать все строки (со всеми их полями) ориентированного графа по идентификатору отдельной строки.

Моя структура выглядит следующим образом:

  • таблица: транзакция
    • столбец: id
  • таблица: отношение транзакций
    • столбец: left_id
    • col: right_id

Как будет выглядеть оптимальная функция, особенно с некоторым рекурсивным пределом?

Это мой текущая попытка. Идентификатор жестко закодирован. Я делаю массив всех задействованных идентификаторов путем рекурсивного обхода графа, и я заканчиваю, получая полные строки из массива идентификаторов. Но кажется, что я не получаю все узлы, он будет только выбирать все левые узлы + все правые узлы, игнорируя при этом правые узлы левых элементов и левые узлы правых элементов.

WITH RECURSIVE search_graph (path, last_left_id, last_right_id) AS (
  SELECT
    ARRAY [id],
    id,
    id
  FROM
    "transaction"
  WHERE
    id = '2fc798f7-bb87-4b27-8bbf-8721ba2ea1f8'
  UNION
  ALL
  SELECT
    sg.path || e.right_id || e.left_id,
    e.left_id,
    e.right_id
  FROM
    search_graph sg
    JOIN "transaction_relation" e ON (
      e.left_id = sg.last_right_id
      AND NOT path @> ARRAY [e.right_id]
    )
    OR(
      e.right_id = sg.last_left_id
      AND NOT path @> ARRAY [e.left_id]
    )
)
SELECT
  nr.*
FROM
  (
    SELECT
      DISTINCT unnest(path) as id
    FROM
      search_graph
  ) n1
  JOIN "transaction" nr ON n1.id = nr.id
...