Архитектура SQL Graph
Область применения: SQL Server 2017 (14.x) и более поздних версий Управляемого экземпляра Базы данныхSQL Azure SQL Azure
Узнайте об архитектуре SQL Graph. Знание основных принципов упрощает понимание других статей SQL Graph.
База данных SQL Graph
Пользователи могут создавать один граф для каждой базы данных. Граф — это коллекция таблиц узлов и пограничных таблиц. Узлы или пограничные таблицы можно создавать в любой схеме в базе данных, но все они принадлежат одному логическому графу. Таблица узлов — это коллекция аналогичных типов узлов. Например, таблица узлов содержит все Person
узлы, Person
принадлежащие графу. Аналогичным образом, граничная таблица — это коллекция похожих ребер. Например, граничная Friends
таблица содержит все края, которые подключаются Person
к другой Person
. Так как узлы и ребра хранятся в таблицах, большинство операций, поддерживаемых в обычных таблицах, поддерживаются в таблицах узлов или пограничных таблиц.
На следующей схеме показана архитектура базы данных SQL Graph.
Таблица узлов
Таблица узлов представляет сущность в схеме графа. Каждый раз при создании таблицы узлов вместе с определяемыми пользователем столбцами создается неявный $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
) для ускорения поиска в направлении края.
На следующей схеме показано, как узлы и пограничные таблицы хранятся в базе данных.
Метаданные
Используйте эти представления метаданных для просмотра атрибутов узла или пограничной таблицы.
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. Чтобы обновить узлы, на которые ссылается ребра, пользователи должны вставить новый край, указывающий на новые узлы, и удалить предыдущий. - Межбазовые запросы к объектам графа не поддерживаются.
См. также
Далее
- Сведения о начале работы с SQL Graph см. в примере базы данных SQL Graph