Postgres использует прагматичный, поэтапный подход к добавлению функциональности. Например, ещё в 2012 году Postgres добавил первую поддержку JSON.
Craig Kerstiens заявил: «мы жульничали», потому что это было просто текстовое поле с наложенной валидацией JSON. Два года спустя был выпущен JSONB. В новых релизах продолжают добавляться дополнительные возможности индексации и операторы. Сейчас и JSON, и JSONB имеют своё место.
Мы ожидаем, что реализация SQL/PGQ в Postgres 19 будет аналогичной. Первоначальный релиз, скорее всего, не заменит существующие рабочие процессы. Он ограничен запросами фиксированной глубины, что уже достаточно просто реализуется с текущим SQL.
Но с чего-то же нужно начинать!
Что реализовано?
DDL-определение: граф объявляется и получает имя.
CREATE PROPERTY GRAPH org_graph указывает, какие таблицы являются вершинами и рёбрами, один раз. Запросы могут ссылаться на граф по имени. Изменения схемы распространяются автоматически, выдаются понятные ошибки, если запрос ссылается на вершину/ребро, которого больше нет, и нельзя удалять таблицы с связанными графами.Когда-нибудь писали большой CTE-запрос, который сломался из-за изменения схемы? Да, я тоже.
Синтаксис запросов: синтаксис соответствует стандарту SQL:2023. Например,
(a)<-[IS reports_to]-(b) означает, что b подчиняется a.Вы получаете стандартную компонуемость SQL, потому что
GRAPH_TABLE ведёт себя как таблица. Его можно джойнить, фильтровать, агрегировать, помещать в CTE и использовать как новый источник в FROM.Реализованный подход отвечает на вопрос: «Что можно построить минимально, чтобы уже начать работать?» Ответ, судя по всему, — поддержка DDL и поддерживаемый синтаксис запросов.
Что SQL/PGQ пока не умеет, а рекурсивные CTE делают лучше:
Переменная глубина: если нужны все потомки на любой глубине, SQL/PGQ в Postgres 19 поддерживает только фиксированную глубину. Каждое “прыжковое” соединение нужно явно прописывать, что требует знать максимальную глубину на этапе написания запроса и делает запрос длинным.
Агрегация вдоль пути: CTE умеют накапливать массивы, конкатенировать пути, вычислять промежуточные суммы во время рекурсии.
Как и с поддержкой JSON, просто подождите: через несколько релизов вы оглянетесь и скажете: «О, теперь это тоже можно делать».
👉 @SQLPortal

