Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Применимо к: SQL Server 2017 (14.x) и более поздних версий базы данных
SQLAzure Для Управляемого экземпляра
SQL Azureв Microsoft Fabric
Узнайте об архитектуре 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>.
Note
Использование псевдоколонок в запросах — единственный поддерживаемый и рекомендуемый способ запроса внутреннего $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) для ускорения поиска в направлении края.
На следующей схеме показано, как узлы и пограничные таблицы хранятся в базе данных.
Metadata
Используйте эти представления метаданных для просмотра атрибутов узла или пограничной таблицы.
sys.tables
Для идентификации таблиц графов можно использовать следующие bit столбцы в sys.tables . Если is_node задано значение 1, таблица является таблицей узлов, а если is_edge задано значение 1, то таблица является граничной таблицей.
| Имя столбца | Тип данных | Description |
|---|---|---|
| is_node | bit | Для таблиц is_node узлов установлено значение 1. |
| is_edge | bit | Для пограничных таблиц is_edge установлено значение 1. |
sys.columns
graph_type Столбцы graph_type_desc в sys.columns представлении полезны для понимания различных типов столбцов, используемых в таблицах графов и пограничных таблицах:
| Имя столбца | Тип данных | Description |
|---|---|---|
| graph_type | int | Внутренний столбец с набором значений. Значения находятся в диапазоне от 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 | Comment |
|---|---|---|---|
graph_id_\<hex_string> |
BIGINT | 1 | Внутреннее значение идентификатора графа. |
$node_id_\<hex_string> |
NVARCHAR | 0 | Внешнее, символьного представления идентификатора узла. |
Неявные столбцы в пограничной таблице:
| Имя столбца | Тип данных | is_hidden | Comment |
|---|---|---|---|
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_id_\<hex_string> |
BIGINT | 1 | Внутреннее значение идентификатора графа для параметра "to node". |
$to_id_\<hex_string> |
NVARCHAR | 0 | Внешнее, символьное представление "на узел". |
Системные функции
Для взаимодействия с псевдоколоннами в таблицах графов можно использовать следующие встроенные функции. Подробные ссылки предоставляются для каждой из этих функций в соответствующих ссылках на функции T-SQL.
| Built-in | 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
| Task | Связанная статья | Notes |
|---|---|---|
| CREATE TABLE | CREATE TABLE (Transact-SQL) |
CREATE TABLE теперь расширена поддержка создания таблицы AS NODE или AS EDGE. Для создания пользовательских атрибутов не требуется граничная таблица. |
| ALTER TABLE | Инструкция ALTER TABLE (Transact-SQL) | Узлы и пограничные таблицы можно изменить так же, как реляционная таблица с помощью ALTER TABLE. Пользователи могут добавлять или изменять определяемые пользователем столбцы, индексы или ограничения. Однако изменение внутренних столбцов графа, например $node_id или $edge_id, приводит к ошибке. |
| СОЗДАТЬ ИНДЕКС | Инструкция CREATE INDEX (Transact-SQL) | Пользователи могут создавать индексы для псевдоколонок и определяемых пользователем столбцов в таблицах узлов и пограничных таблиц. Поддерживаются все типы индексов, включая кластеризованные и некластеризованные индексы columnstore. |
| СОЗДАНИЕ ОГРАНИЧЕНИЙ EDGE | ОГРАНИЧЕНИЯ EDGE (Transact-SQL) | Теперь пользователи могут создавать ограничения на пограничные таблицы для применения определенной семантики и поддержания целостности данных |
| ТАБЛИЦА ВЫБРОСА | ТАБЛИЦА СБРОСОВ (Transact-SQL) | Узлы и пограничные таблицы можно удалить так же, как реляционная таблица с помощью DROP TABLE. В настоящее время нет механизмов предотвращения удаления узлов, на которые ссылается ребра. При удалении узла (или удалении всей таблицы узлов) не поддерживается каскадное удаление ребер. Во всех таких случаях все края, подключенные к удаленным узлам, необходимо удалить вручную, чтобы обеспечить согласованность графа. |
Инструкции языка обработки данных DML
| Task | Связанная статья | Notes |
|---|---|---|
| INSERT | ВСТАВЬТЕ (Transact-SQL) | Вставка в таблицу узлов не отличается от вставки в реляционную таблицу. Значения столбца $node_id создаются автоматически. Попытка вставки значения в $node_id столбец $edge_id приводит к ошибке. Пользователи должны предоставлять значения для $from_id столбцов и $to_id вставлять их в граничную таблицу.
$from_id и $to_id являются $node_id значениями узлов, которые подключается заданный край. |
| DELETE | УДАЛИТЬ (Transact-SQL) | Данные из узлов или пограничных таблиц можно удалять так же, как и из реляционных таблиц. Однако в этом выпуске нет ограничений, чтобы убедиться, что ребра не указывают на удаленный узел и каскадное удаление ребер при удалении узла не поддерживается. Рекомендуется каждый раз, когда узел удаляется, все соединительные края с этим узлом также удаляются. |
| UPDATE | ОБНОВЛЕНИЕ (Transact-SQL) | Значения в определяемых пользователем столбцах можно обновить с помощью инструкции UPDATE. Вы не можете обновить внутренние столбцы графов, $node_id$edge_idа $from_idтакже $to_id . |
| MERGE | СЛИЯНИЕ (Transact-SQL) |
MERGE оператор поддерживается в таблице узлов или пограничных вычислений. |
Запросные операторы
| Task | Связанная статья | Notes |
|---|---|---|
| SELECT | SELECT (Transact-SQL) | Так как узлы и ребра хранятся в виде таблиц, большинство операций таблиц также поддерживаются в таблицах узлов и пограничных таблиц. |
| MATCH | МАТЧ (Transact-SQL) | Встроенная функция MATCH представлена для поддержки сопоставления шаблонов и обхода по графу. |
Limitations
Существуют некоторые ограничения для таблиц узлов и граничных таблиц:
- Локальные или глобальные временные таблицы не могут быть узлами или пограничными таблицами.
- Типы таблиц и переменные таблицы не могут быть объявлены как узел или граничная таблица.
- Таблицы узлов и пограничных таблиц нельзя создавать как системные темпоральные таблицы.
- Таблицы узлов и ребер не могут быть оптимизированными для памяти таблицами.
- Пользователи не могут обновлять
$from_idстолбцы$to_idпограничных вычислений с помощью инструкции UPDATE. Чтобы обновить узлы, на которые ссылается ребра, пользователи должны вставить новый край, указывающий на новые узлы, и удалить предыдущий. - Межбазовые запросы к объектам графа не поддерживаются.
- Псевдоколонок графа (
node_id,$from_id$to_idиedge_id) нельзя использовать в качестве столбцов сортировки для упорядоченного кластеризованного индекса columnstore. Попытка использовать псевдоколонок графа в качестве столбцов сортировки для упорядоченного кластеризованного columnstore приводит к ошибкеMsg 102: Incorrect syntax. - В базе данных SQL Fabric допускается sql Graph, но таблицы Node и Edge не будут зеркально отображаться в Fabric OneLake.
См. также
Дальнейшие шаги
- Сведения о начале работы с SQL Graph см. в примере базы данных SQL Graph