Я не особо привык генерировать сложные SQL-запросы, и мне трудно смешивать свое понимание процедурных языков и операций над множествами при разработке рекурсивного запроса для обхода сети. Я хочу найти набор ребер, которые лежат «вверх по течению» от определенного узла, путем проведения поиска в глубину ориентированного графа (каждый узел может иметь более одного восходящего края) и в идеале реализовать это в SQL.
Псевдокод того, что я хочу сделать, выглядит следующим образом:
interesting_pipes = Pipes[]
func find_all_pipes_upstream(node n)
if is_inlet(nodename)
return Nil
else
for p in upstream_pipes:
if p in interesting_pipes:
return Nil
else
interesting_pipes.append(p)
find_all_pipes_upstream(upstream_node(p))
Я уже написал следующие функции на чистом SQL:
upstream_pipes(node_name varchar) RETURNS SETOF "Pipes"
upstream_node(pipe_name varchar) RETURNS "Node"
is_inlet(node_name) RETURNS boolean
но я изо всех сил пытаюсь понять, как управлять областью видимости и возвращаемыми типами при переводе приведенного выше псевдокода либо в запрос PostgreSQL WITH RECURSIVE
, либо в функцию PL/pgSQL. Большинство примеров запросов WITH RECURSIVE
, которые я видел, были разработаны для обхода деревьев, где каждый узел имеет только одного родителя. Есть ли у кого-нибудь какие-либо советы/советы, как лучше всего это сделать?
Ваше здоровье,
Будут