Запросы к графовой базе данных |
||
Восстановить вид исходной таблицы Utb можно с помощью обычного SQL-запроса:
Однако для облегчения навигации по графу в SQL Server добавлена функция MATCH, которая задает шаблон для поиска узлов в соответствии со связями. Синтаксис шаблона напоминает образцы, используемые в языке Cypher, графовой базы данных Neo4j. В упрощенной форме шаблон имеет вид:
Узел представляется именем таблицы или алиасом (псевдонимом). Алиас необходим, когда одна таблица используется в образце несколько раз, например, в случае самосоединений. Шаблоны в функции MATCH можно соединять при помощи оператора AND. Перейдем к примерам. Для начала перепишем предыдущий запрос в «графовом» стиле:
Здесь мы используем алиасы только для сокращения записи. Мы можем поменять местами узлы, но направление связи должно сохраниться (от баллончика к квадрату):
В отличие от Cypher направление связи является обязательным, т.е. использование функции
Найти квадраты, которые окрашивались красной краской. Вывести идентификатор квадрата и объем красной краски. Реляционная схема
Графовая схема
Найти квадраты, которые окрашивались как красной, так и синей краской. Вывести: название квадрата. Реляционная схема
Графовая схема
Обратите внимание, что для в общем случае разных узлов, используемых в шаблоне, требуется добавлять соответствующую таблицу в предложение FROM (как и таблицу связи). Если же подразумевается один и тот же узел, как в нашем случае с квадратом, то мы можем использовать этот узел для двусторонней связи. Предикат
DISTINCT в этих запросах необходим, поскольку возможны дубликаты, если квадрат окрашивался несколькими красными (и/или синими) баллончиками. Найти квадраты, которые окрашивались всеми тремя цветами. Реляционная схемаМожно было бы добавить еще один запрос к предыдущему решению с помощью INTERSECT, однако давайте представим здесь более эффективное решение, опирающееся на тот факт, что количество уникальных цветов, которыми окрашивался квадрат, равно 3:
Графовая схема
Найти баллончики, которыми окрашивали более одного квадрата. Реляционная схема
Графовая схема
Условие match(Q2<-(B2)-V-(B1)->Q) утверждает, что один баллон участвовал в двух окрасках, в то время как условие Q.q_id <> Q2.q_id говорит о том, что при этом окрашивались разные квадраты. Предварительные выводыНа первый взгляд, запросы к реляционной и графовой схемам не так уж радикально отличаются. Более того, синтаксиса графовой базы данных можно не придерживаться, оставаясь в рамках языка SQL. Однако не стоит судить по рассмотренным примерам, поскольку преимущество графовых баз данных проявляется для тех предметных областей, которые характеризуются сложными связями между данными. |