Графовые базы данных SQL Server |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Кардинальным отличием графовых баз данных в SQL Server от графовых баз данных направления NoSQL является то, что для моделирования графа в SQL Server используются таблицы. Это таблицы двух специальных видов. Один вид таблиц используется для создания узлов, и другой – для создания ребер (связей). Отметим, что табличное представление узлов и ребер дает возможность писать запросы к этим таблицам на языке SQL. Таблица типа узла описывает некую сущность. Экземпляры этой сущности представлены строками таблицы и характеризуются одинаковым набором свойств (столбцами таблицы). Таблица типа ребра определяет характер и направление связи между узлами. Скажем, таблица ToBeFriends (дружить) могла бы описывать дружественную связь между экземплярами одной или разных сущностей. Вероятно, пора переходить к примерам. Предлагаю взять учебную базу «Окраска», и отобразить реляционную структуру этой базы на структуру графа без потери информации. Это позволит нам писать запросы и сравнивать результаты на двух моделях, представляющих в разной форме одну и ту же информацию. Итак, у нас есть два типа узлов, представляющих сущности квадрата и баллона, и одна связь между ними, которую можно выразить так: баллон окрашивает квадрат. Направление связи – от баллона к квадрату. Создадим таблицы узлов:
Как видите, таблицы создаются аналогично обычным реляционным за исключением указания типа – AS NODE (т.е. узел). Теперь посмотрим на структуру созданных таблиц:
При создании таблицы узлов, помимо пользовательских, автоматически создаются еще два псевдостолбца – graph_id и $node_id. Давайте наполним таблицу данными и посмотрим, что находится в этих столбцах.
Здесь мы просто берем готовые данные, которые находятся в учебной базе данных с именем sql-ex.
Столбец graph_id отсутствует в выборке. Причиной является то, что этот столбец используется ядром СУБД и недоступен пользователю напрямую. Действительно, если выполнить запрос
Недопустимое имя столбца "graph_id". Столбец $node_id является уникальным идентификатором узла, представленным в формате JSON. Шестнадцатеричный суффикс в имени столбца делает имя столбца глобально уникальным, однако для доступа к столбцу он не используется. Например,
Таблица utvG выглядит аналогично таблице utqG, и поэтому мы не будем представлять тут её содержимое. Теперь создадим таблицу ребра.
Эта таблица содержит столбцы свойств – время окраски (B_datetime) и количество нанесенной из баллончика краски (b_vol). Она отличается от таблиц узлов типом – теперь это EDGE, а не NODE. Рассмотрим структуру этой таблицы:
Как и для узлов, автоматически были созданы несколько псевдостолбцов, среди которых доступными пользователю являются:
Заполним и эту таблицу данными. Если мы вспомним структуру исходной таблицы utb, то для каждой строки в столбец $from_id мы должны поместить идентификатор того узла из таблицы utvG, для которого v_id равен b_v_id таблицы utb. Тогда столбец $to_id должен содержать идентификатор того узла из таблицы utqG, для которого q_id равен, соответственно, b_q_id из той же строки таблицы utb. Читателю, наверное, будет проще понять оператор, который вставит описанные данные:
Теперь мы можем посмотреть на данные в таблице ребра, которая устанавливает связь между двумя узлами – баллончиком с краской и окрашиваемым квадратом.
Поскольку ширина результирующей таблицы значительно превышает ширину страницы, представим результат в формате «ключ: значение»
|