Открыть сервис

SQL/PGQ

SQL/PGQ (SQL/Property Graph Queries) — это стандарт языка SQL, расширяющий его возможности для работы с графами свойств (property graphs). Он был разработан Международной организацией по стандартизации (ISO) и Международной электротехнической комиссией (IEC) и опубликован в 2023 году как часть стандарта SQL:2023. SQL/PGQ позволяет выполнять запросы к графовым структурам данных, хранящимся в реляционных базах данных, используя синтаксис, основанный на SQL, без необходимости перехода на специализированные языки запросов к графам, такие как Cypher или SPARQL.

История и контекст

Разработка SQL/PGQ началась в рамках работы Технического комитета ISO/IEC JTC 1/SC 32 (Управление данными и обмен данными) в середине 2010-х годов. Основной целью было создание единого стандарта для запросов к графовым данным, который был бы совместим с существующей экосистемой SQL. До появления SQL/PGQ существовало несколько проприетарных и открытых решений для работы с графами в реляционных СУБД (например, Oracle Database с поддержкой графов, Microsoft SQL Server с Graph Extensions), но они не были стандартизированы.

Стандарт SQL:2023, в который вошёл SQL/PGQ, был официально опубликован в июне 2023 года. Он стал первым международным стандартом, объединяющим реляционное и графовое представление данных. SQL/PGQ не заменяет существующие графовые базы данных, а предоставляет возможность выполнять графовые запросы непосредственно в реляционных СУБД, что упрощает интеграцию графового анализа в существующие информационные системы.

Основные понятия

Граф свойств (Property Graph)

Граф свойств — это математическая модель, состоящая из узлов (вершин) и рёбер (связей), каждому из которых может быть присвоен набор свойств в виде пар «ключ-значение». В контексте SQL/PGQ граф свойств определяется на основе существующих реляционных таблиц. Узлы и рёбра представляют собой строки в этих таблицах, а свойства — значения столбцов.

Маппинг (Mapping)

Маппинг — это процесс преобразования реляционных таблиц в графовую модель. В SQL/PGQ для этого используется конструкция CREATE PROPERTY GRAPH, которая определяет, какие таблицы будут служить источниками узлов и рёбер, а также как устанавливаются связи между ними. Например, таблица users может быть объявлена как источник узлов, а таблица friendships — как источник рёбер, где столбец user_id указывает на начальный узел, а friend_id — на конечный.

Пути и шаблоны

Основной операцией в SQL/PGQ является поиск путей и шаблонов в графе. Для этого используется конструкция MATCH, которая позволяет задавать шаблоны для поиска узлов и рёбер. Например, запрос MATCH (a:Person)-[r:Knows]->(b:Person) ищет все пары людей, связанных отношением «знает». Шаблоны могут быть произвольной длины, включать условия на свойства узлов и рёбер, а также использовать переменные для захвата значений.

Синтаксис и ключевые конструкции

Создание графа

Создание графа выполняется с помощью оператора CREATE PROPERTY GRAPH. Пример:

``sql CREATE PROPERTY GRAPH social_network VERTEX TABLES ( Person KEY (id) LABEL Person PROPERTIES (id, name, age) ) EDGE TABLES ( Knows KEY (id) SOURCE KEY (person1_id) REFERENCES Person DESTINATION KEY (person2_id) REFERENCES Person LABEL Knows PROPERTIES (since) ); ``

В этом примере создаётся граф social_network, где узлами являются записи из таблицы Person, а рёбрами — записи из таблицы Knows, связывающие два узла.

Запросы с MATCH

Основной синтаксис запроса выглядит так:

``sql SELECT a.name, b.name FROM social_network MATCH (a:Person)-[r:Knows]->(b:Person) WHERE a.age > 30 ``

Здесь MATCH задаёт шаблон, а WHERE накладывает дополнительные условия. Результатом будут имена людей старше 30 лет и их друзей.

Поиск путей произвольной длины

SQL/PGQ поддерживает поиск путей с переменной длиной, например, для поиска всех связей в цепочке «друг друга»:

``sql SELECT a.name, b.name FROM social_network MATCH (a:Person)-[:Knows]->{1,3}(b:Person) ``

Этот запрос найдёт всех людей, связанных через 1, 2 или 3 шага.

Агрегация и группировка

Графовые запросы могут комбинироваться с обычными SQL-операциями, такими как GROUP BY, ORDER BY и агрегатные функции. Например, можно подсчитать количество друзей каждого человека:

``sql SELECT a.name, COUNT(b) AS friends_count FROM social_network MATCH (a:Person)-[:Knows]->(b:Person) GROUP BY a.name ORDER BY friends_count DESC ``

Применение

Анализ социальных сетей

SQL/PGQ позволяет эффективно анализировать социальные графы: находить сообщества, выявлять влиятельных пользователей, вычислять кратчайшие пути между людьми. Например, в социальной сети «ВКонтакте» (принадлежит компании VK, не является иностранным агентом) можно было бы использовать SQL/PGQ для поиска цепочек знакомств.

Обнаружение мошенничества

В финансовой сфере SQL/PGQ применяется для выявления мошеннических схем, таких как «кольцевые» переводы денег или создание подставных счетов. Графовый анализ позволяет быстро находить подозрительные связи между счетами и транзакциями.

Рекомендательные системы

Графовые запросы используются для построения рекомендаций на основе связей между пользователями и товарами. Например, можно найти товары, которые часто покупают вместе, или рекомендовать друзей на основе общих интересов.

Биоинформатика

В биологии SQL/PGQ может применяться для анализа сетей взаимодействия белков, генетических последовательностей или метаболических путей.

Реализации и поддержка

На момент 2024 года поддержка SQL/PGQ реализована в следующих СУБД:

  • Oracle Database — начиная с версии 23c, Oracle предоставляет поддержку SQL/PGQ в рамках Oracle Graph.
  • PostgreSQL — через расширение pg_graphql (неполная поддержка) и экспериментальные проекты.
  • Microsoft SQL Server — частичная поддержка через Graph Extensions, но не полная реализация стандарта.
  • DuckDB — экспериментальная поддержка через расширение.

Большинство коммерческих СУБД планируют внедрить SQL/PGQ в ближайшие годы, но на текущий момент полная поддержка доступна только в Oracle Database.

Ограничения и критика

  • Сложность маппинга: Преобразование реляционных таблиц в графовую модель может быть нетривиальным, особенно для сложных схем данных.
  • Производительность: Графовые запросы, особенно с поиском путей произвольной длины, могут быть ресурсоёмкими и требовать оптимизации индексов.
  • Ограниченная выразительность: SQL/PGQ не поддерживает некоторые сложные графовые алгоритмы, такие как PageRank или кластеризация, которые требуют итеративных вычислений. Для таких задач часто используются специализированные графовые базы данных (например, Neo4j).
  • Отсутствие поддержки в open-source СУБД: На момент 2024 года ни одна популярная открытая СУБД (MySQL, MariaDB, PostgreSQL) не имеет полной встроенной поддержки SQL/PGQ, что ограничивает его распространение.

Источники

  • ISO/IEC 9075-16:2023 — Information technology — Database languages — SQL — Part 16: Property Graph Queries (SQL/PGQ).
  • Oracle Database 23c Documentation — SQL Property Graph Queries.
  • «SQL/PGQ: A New Standard for Graph Queries in SQL» — статья в журнале «ACM SIGMOD Record», 2023.
  • «Graph Querying with SQL:2016 and SQL:2023» — технический отчёт ISO/IEC JTC 1/SC 32.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →