Архитектура SQL Graph

Область применения: SQL Server 2017 (14.x) и более поздних версий Управляемого экземпляра Базы данныхSQL Azure SQL Azure

Узнайте об архитектуре SQL Graph. Знание основных принципов упрощает понимание других статей SQL Graph.

База данных SQL Graph

Пользователи могут создавать один граф для каждой базы данных. Граф — это коллекция таблиц узлов и пограничных таблиц. Узлы или пограничные таблицы можно создавать в любой схеме в базе данных, но все они принадлежат одному логическому графу. Таблица узлов — это коллекция аналогичных типов узлов. Например, таблица узлов содержит все Person узлы, Person принадлежащие графу. Аналогичным образом, граничная таблица — это коллекция похожих ребер. Например, граничная Friends таблица содержит все края, которые подключаются Person к другой Person. Так как узлы и ребра хранятся в таблицах, большинство операций, поддерживаемых в обычных таблицах, поддерживаются в таблицах узлов или пограничных таблиц.

На следующей схеме показана архитектура базы данных SQL Graph.

Diagram showing the SQL Graph database architecture.

Таблица узлов

Таблица узлов представляет сущность в схеме графа. Каждый раз при создании таблицы узлов вместе с определяемыми пользователем столбцами создается неявный $node_id столбец, который однозначно идентифицирует заданный узел в базе данных. Значения в $node_id ней создаются автоматически и представляют собой сочетание идентификатора объекта для таблицы графов этой таблицы узлов и внутреннего созданного большого значения. Однако при $node_id выборе столбца отображается вычисляемое значение в виде строки JSON. Кроме того, это псевдоколонок, $node_id который сопоставляется с внутренним именем с уникальным суффиксом. При выборе $node_id псевдоколонок из таблицы имя столбца отображается как $node_id_<unique suffix>.

Заметка

Использование псевдоколонок в запросах — единственный поддерживаемый и рекомендуемый способ запроса внутреннего $node_id столбца. Не следует напрямую использовать $node_id_<hex_string> столбцы в каких-либо запросах. Кроме того, вычисляемое представление JSON, показанное в псевдоколонок, является подробным описанием реализации. Не следует использовать прямую зависимость от формата этого представления JSON. Если вы должны иметь дело с этим представлением JSON, рассмотрите возможность использования NODE_ID_FROM_PARTS() и других связанных системных функций. Не рекомендуется напрямую использовать псевдоколонок графа ($node_id, $from_id, $to_id) в предикаты. Например, следует избегать предиката n.$node_id = e.$from_id . Такие сравнения, как правило, неэффективны из-за преобразования в представление JSON. Вместо этого следует полагаться на функцию MATCH насколько это возможно.

Рекомендуется создать уникальное ограничение или индекс в $node_id столбце во время создания таблицы узлов, но если он не создан, создается уникальный некластеризованный индекс по умолчанию. Однако любой индекс на графе псевдоколонок создается на базовых внутренних столбцах. То есть индекс, созданный в $node_id столбце, отображается во внутреннем graph_id_<hex_string> столбце.

Граничная таблица

Граничная таблица представляет связь в графе. Ребра всегда направляются и подключаются к двум узлам. Граничная таблица позволяет пользователям моделировать связи "многие ко многим" в графе. Пользовательские столбцы ("атрибуты") являются необязательными в пограничной таблице. Каждый раз при создании пограничной таблицы вместе с определяемыми пользователем столбцами в граничной таблице создаются три неявных столбца:

Столбец Description
$edge_id Уникально идентифицирует заданный край в базе данных. Это созданный столбец, а значение — это сочетание object_id пограничной таблицы и внутренне созданного большого значения. Однако при $edge_id выборе столбца отображается вычисляемое значение в виде строки JSON. $edge_id — это псевдоколонок, который сопоставляется с внутренним именем с уникальным суффиксом. При выборе $edge_id из таблицы имя столбца отображается как $edge_id_<unique suffix>. Использование имен псевдоколонок в запросах — это рекомендуемый способ запроса внутреннего столбца и использования внутреннего $edge_id имени с шестнадцатеричной строкой.
$from_id $node_id Хранит узел, откуда происходит ребра.
$to_id $node_id Сохраняет узел, на котором завершается ребра.

Узлы, к которым может подключаться заданный край, управляются данными, вставленными в $from_id столбцы и $to_id столбцами. В первом выпуске невозможно определить ограничения в пограничной таблице, чтобы ограничить подключение всех двух типов узлов. То есть ребра может подключать любые два узла в графе независимо от их типов.

$node_id Как и в столбце, рекомендуется создать уникальный индекс или ограничение для $edge_id столбца во время создания пограничной таблицы, но если он не создан, то для этого столбца автоматически создается уникальный, некластеризованный индекс по умолчанию. Однако любой индекс на графе псевдоколонок создается на базовых внутренних столбцах. То есть индекс, созданный в $edge_id столбце, отображается во внутреннем graph_id_<unique suffix> столбце. Для сценариев OLTP рекомендуется также создавать индекс в столбцах ($from_id, $to_id) для ускорения поиска в направлении края.

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

Diagram showing the Node and edge table representation.

Метаданные

Используйте эти представления метаданных для просмотра атрибутов узла или пограничной таблицы.

sys.tables

Для идентификации таблиц графов можно использовать следующие bit столбцы в sys.tables . Если is_node задано значение 1, таблица является таблицей узлов, а если is_edge задано значение 1, то таблица является граничной таблицей.

Имя столбца Тип данных Описание:
is_node bit Для таблиц is_node узлов установлено значение 1.
is_edge bit Для пограничных таблиц is_edge установлено значение 1.

sys.columns

graph_type_desc Столбцы graph_type в sys.columns представлении полезны для понимания различных типов столбцов, используемых в таблицах графов и пограничных таблицах:

Имя столбца Тип данных Описание:
graph_type целое Внутренний столбец с набором значений. Значения находятся в диапазоне от 1 до 8 для столбцов графа и NULL для других.
graph_type_desc nvarchar(60) Внутренний столбец с набором значений.

В следующей таблице перечислены допустимые значения столбца graph_type :

Значение столбца Description
1 GRAPH_ID
2 GRAPH_ID_COMPUTED
3 GRAPH_FROM_ID
4 GRAPH_FROM_OBJ_ID
5 GRAPH_FROM_ID_COMPUTED
6 GRAPH_TO_ID
7 GRAPH_TO_OBJ_ID
8 GRAPH_TO_ID_COMPUTED

sys.columns также хранит сведения о неявных столбцах, созданных в таблицах узлов или пограничных таблиц. Следующие сведения можно получить из sys.columns, однако пользователи не могут выбирать эти столбцы из таблицы узлов или edge.

Неявные столбцы в таблице узлов:

Имя столбца Тип данных is_hidden Комментарии
graph_id_\<hex_string> BIGINT 1 Внутреннее значение идентификатора графа.
$node_id_\<hex_string> NVARCHAR 0 Внешнее, символьного представления идентификатора узла.

Неявные столбцы в пограничной таблице:

Имя столбца Тип данных is_hidden Комментарии
graph_id_\<hex_string> BIGINT 1 Внутреннее значение идентификатора графа.
$edge_id_\<hex_string> NVARCHAR 0 Символьного представления идентификатора края.
from_obj_id_\<hex_string> INT 1 Внутреннее object_id значение для "from node".
from_id_\<hex_string> BIGINT 1 Внутреннее значение идентификатора графа для "from node".
$from_id_\<hex_string> NVARCHAR 0 символьное представление "from node".
to_obj_id_\<hex_string> INT 1 Внутренний object_id для элемента "to node".
to_id_\<hex_string> BIGINT 1 Внутреннее значение идентификатора графа для параметра "to node".
$to_id_\<hex_string> NVARCHAR 0 Внешнее, символьное представление "to node".

Системные функции

Для взаимодействия с псевдоколоннами в таблицах графов можно использовать следующие встроенные функции. Подробные ссылки предоставляются для каждой из этих функций в соответствующих ссылках на функции T-SQL.

Встроенный Description
OBJECT_ID_FROM_NODE_ID Извлеките идентификатор объекта для таблицы графов из node_id.
GRAPH_ID_FROM_NODE_ID Извлеките значение идентификатора графа node_idиз .
NODE_ID_FROM_PARTS Создайте node_id из идентификатора объекта для таблицы графа и значения идентификатора графа.
OBJECT_ID_FROM_EDGE_ID Извлечение идентификатора объекта для таблицы графа из edge_id.
GRAPH_ID_FROM_EDGE_ID Извлеките значение идентификатора графа для заданного edge_idобъекта.
EDGE_ID_FROM_PARTS Создание edge_id из идентификатора объекта для таблицы графа и значения идентификатора графа.

Справочник по Transact-SQL

Узнайте о расширениях Transact-SQL, представленных в SQL Server и Базе данных SQL Azure, которые позволяют создавать и запрашивать объекты графа. Расширения языка запросов помогают запрашивать и проходить по графу с помощью синтаксиса искусства ASCII.

Инструкции языка описания данных DDL

Задача Связанная статья Примечания
СОЗДАТЬ ТАБЛИЦУ CREATE TABLE (Transact-SQL) CREATE TABLE теперь расширена поддержка создания таблицы AS NODE или AS EDGE. Граничная таблица может или не иметь пользовательских атрибутов.
ALTER TABLE Инструкция ALTER TABLE (Transact-SQL) Узлы и пограничные таблицы можно изменить так же, как реляционная таблица с помощью ALTER TABLE. Пользователи могут добавлять или изменять определяемые пользователем столбцы, индексы или ограничения. Однако изменение внутренних столбцов графа, например $node_id или $edge_id, приводит к ошибке.
CREATE INDEX Инструкция CREATE INDEX (Transact-SQL) Пользователи могут создавать индексы для псевдоколонок и определяемых пользователем столбцов в таблицах узлов и пограничных таблиц. Поддерживаются все типы индексов, включая кластеризованные и некластеризованные индексы columnstore.
СОЗДАНИЕ ОГРАНИЧЕНИЙ EDGE ОГРАНИЧЕНИЯ EDGE (Transact-SQL) Теперь пользователи могут создавать ограничения на пограничные таблицы для применения определенной семантики и поддержания целостности данных
DROP TABLE DROP TABLE (Transact-SQL) Узлы и пограничные таблицы можно удалить так же, как реляционная таблица с помощью DROP TABLE. В настоящее время нет механизмов предотвращения удаления узлов, на которые ссылается ребра. При удалении узла (или удалении всей таблицы узлов) не поддерживается каскадное удаление ребер. Во всех таких случаях все края, подключенные к удаленным узлам, необходимо удалить вручную, чтобы обеспечить согласованность графа.

Инструкции языка обработки данных DML

Задача Связанная статья Примечания
ВСТАВИТЬ INSERT (Transact-SQL) Вставка в таблицу узлов не отличается от вставки в реляционную таблицу. Значения столбца $node_id создаются автоматически. Попытка вставки значения в $node_id столбец $edge_id приводит к ошибке. Пользователи должны предоставлять значения для $from_id столбцов и $to_id вставлять их в граничную таблицу. $from_id и $to_id являются $node_id значениями узлов, которые подключается заданный край.
DELETE DELETE (Transact-SQL) Данные из узлов или пограничных таблиц можно удалять так же, как и из реляционных таблиц. Однако в этом выпуске нет ограничений, чтобы убедиться, что ребра не указывают на удаленный узел и каскадное удаление ребер при удалении узла не поддерживается. Рекомендуется каждый раз, когда узел удаляется, все соединительные края с этим узлом также удаляются.
ОБНОВИТЬ UPDATE (Transact-SQL) Значения в определяемых пользователем столбцах можно обновить с помощью инструкции UPDATE. Вы не можете обновить внутренние столбцы графов, $node_id$edge_idа $to_idтакже $from_id .
MERGE MERGE (Transact-SQL) MERGE оператор поддерживается в таблице узлов или пограничных вычислений.

Инструкции запроса

Задача Связанная статья Примечания
ВЫБРАТЬ SELECT (Transact-SQL) Так как узлы и ребра хранятся в виде таблиц, большинство операций таблиц также поддерживаются в таблицах узлов и пограничных таблиц.
MATCH MATCH (Transact-SQL) Встроенная функция MATCH представлена для поддержки сопоставления шаблонов и обхода по графу.

Ограничения

Существуют некоторые ограничения для таблиц узлов и граничных таблиц:

  • Локальные или глобальные временные таблицы не могут быть узлами или пограничными таблицами.
  • Типы таблиц и переменные таблицы не могут быть объявлены как узел или граничная таблица.
  • Таблицы узлов и пограничных таблиц нельзя создавать как системные темпоральные таблицы.
  • Таблицы узлов и ребер не могут быть оптимизированными для памяти таблицами.
  • Пользователи не могут обновлять $from_id столбцы $to_id пограничных вычислений с помощью инструкции UPDATE. Чтобы обновить узлы, на которые ссылается ребра, пользователи должны вставить новый край, указывающий на новые узлы, и удалить предыдущий.
  • Межбазовые запросы к объектам графа не поддерживаются.

См. также

Далее