Compartilhar via


Arquitetura do SQL Graph

Aplica-se a: SQL Server 2017 (14.x) e versões posteriores Banco de Dados SQL do Azure Banco de Dados SQL da Instância Gerenciada de SQL do Azure no Microsoft Fabric

Saiba mais sobre a arquitetura do SQL Graph. Conhecer os conceitos básicos facilita a compreensão de outros artigos do SQL Graph.

Banco de dados SQL Graph

Os usuários podem criar um gráfico por banco de dados. Um gráfico é uma coleção de tabelas de nós e bordas. As tabelas de nó ou borda podem ser criadas em qualquer esquema no banco de dados, mas todas pertencem a um gráfico lógico. Uma tabela de nós é uma coleção de tipos semelhantes de nós. Por exemplo, uma Person tabela de nós contém todos os Person nós pertencentes a um gráfico. Da mesma forma, uma tabela de borda é uma coleção de tipos semelhantes de bordas. Por exemplo, uma tabela de Friends borda contém todas as bordas que conectam a a Person outra Person. Como os nós e as bordas são armazenados em tabelas, a maioria das operações suportadas em tabelas regulares é suportada em tabelas de nó ou borda.

O diagrama a seguir mostra a arquitetura do banco de dados do SQL Graph.

Diagrama mostrando a arquitetura do banco de dados SQL Graph.

Tabela de nós

Uma tabela de nós representa uma entidade em um esquema gráfico. Toda vez que uma tabela de nós é criada, juntamente com as colunas definidas pelo usuário, uma coluna implícita $node_id é criada, que identifica exclusivamente um determinado nó no banco de dados. Os valores são $node_id gerados automaticamente e são uma combinação de ID de objeto para a tabela de gráficos dessa tabela de nós e um valor bigint gerado internamente. No entanto, quando a $node_id coluna é selecionada, um valor calculado na forma de uma cadeia de caracteres JSON é exibido. Além disso, $node_id é uma pseudo-coluna que mapeia para um nome interno com um sufixo exclusivo. Quando você seleciona a $node_id pseudocoluna na tabela, o nome da coluna aparece como $node_id_<unique suffix>.

Observação

Usar as pseudocolunas em consultas é a única maneira com suporte e recomendada de consultar a coluna interna $node_id . Você não deve usar diretamente as $node_id_<hex_string> colunas em nenhuma consulta. Além disso, a representação JSON computada mostrada nas pseudocolunas é um detalhe de implementação. Você não deve ter uma dependência direta do formato dessa representação JSON. Se você precisar lidar com essa representação JSON, considere usar o NODE_ID_FROM_PARTS() e outras funções do sistema relacionadas. Não é recomendável usar diretamente as pseudocolunas de grafo ($node_id, $from_id, $to_id) em predicados. Por exemplo, um predicado like n.$node_id = e.$from_id deve ser evitado. Essas comparações tendem a ser ineficientes, devido à conversão para a representação JSON. Em vez disso, confie na função CORRESP na medida do possível.

É recomendável que os usuários criem uma restrição ou índice exclusivo na $node_id coluna no momento da criação da tabela de nós, mas se um não for criado, um índice padrão exclusivo e não clusterizado será criado automaticamente. No entanto, qualquer índice em uma pseudocoluna de gráfico é criado nas colunas internas subjacentes. Ou seja, um índice criado na $node_id coluna aparece na coluna interna graph_id_<hex_string> .

Tabela de borda

Uma tabela de borda representa uma relação em um gráfico. As bordas são sempre direcionadas e conectam dois nós. Uma tabela de borda permite que os usuários modelem relações muitos-para-muitos no gráfico. As colunas definidas pelo usuário ("atributos") são opcionais em uma tabela de borda. Sempre que uma tabela de borda é criada, juntamente com as colunas definidas pelo usuário, três colunas implícitas são criadas na tabela de borda:

Nome da coluna Descrição
$edge_id Identifica exclusivamente uma determinada borda no banco de dados. É uma coluna gerada e o valor é uma combinação de object_id da tabela de borda e um valor bigint gerado internamente. No entanto, quando a $edge_id coluna é selecionada, um valor calculado na forma de uma cadeia de caracteres JSON é exibido. $edge_id é uma pseudocoluna que mapeia para um nome interno com um sufixo exclusivo. Quando você seleciona $edge_id na tabela, o nome da coluna aparece como $edge_id_<unique suffix>. O uso de nomes de pseudo-coluna em consultas é a maneira recomendada de consultar a coluna interna $edge_id e o uso de nome interno com string hexadecimal deve ser evitado.
$from_id Armazena o $node_id do nó, de onde a borda se origina.
$to_id Armazena o $node_id do nó, no qual a borda termina.

Os nós aos quais uma determinada borda pode se conectar são controlados pelos dados inseridos nas $from_id colunas e $to_id . Na primeira versão, não é possível definir restrições na tabela de borda, para impedi-la de conectar quaisquer dois tipos de nós. Ou seja, uma aresta pode conectar quaisquer dois nós no gráfico, independentemente de seus tipos.

Semelhante à $node_id coluna, é recomendável que os usuários criem um índice ou restrição exclusiva na $edge_id coluna no momento da criação da tabela de borda, mas se um não for criado, um índice padrão exclusivo e não clusterizado será criado automaticamente nessa coluna. No entanto, qualquer índice em uma pseudocoluna de gráfico é criado nas colunas internas subjacentes. Ou seja, um índice criado na $edge_id coluna aparece na coluna interna graph_id_<unique suffix> . Também é recomendado, para cenários OLTP, que os usuários criem um índice em colunas ($from_id, $to_id), para pesquisas mais rápidas na direção da borda.

O diagrama a seguir mostra como as tabelas de nó e borda são armazenadas no banco de dados.

Diagrama mostrando a representação da tabela de nó e borda.

Metadados

Use essas exibições de metadados para ver os atributos de um nó ou tabela de borda.

sys.tables

As colunas a seguir bit em sys.tables podem ser usadas para identificar tabelas de gráficos. Se is_node for definido como 1, a tabela será uma tabela de nó e, se is_edge for definido como 1, a tabela será uma tabela de borda.

Nome da Coluna Tipo de Dados Descrição
is_node bit Para tabelas de nós, is_node é definido como 1.
is_edge bit Para tabelas de borda, is_edge é definido como 1.

sys.columns

As graph_type colunas e graph_type_desc na sys.columns exibição são úteis para entender os diferentes tipos de colunas usadas em tabelas de nó e borda do gráfico:

Nome da Coluna Tipo de Dados Descrição
graph_type int Coluna interna com um conjunto de valores. Os valores estão entre 1 e 8 para colunas de grafo e NULL para outras.
graph_type_desc nvarchar(60) Coluna interna com um conjunto de valores.

A tabela a seguir lista os valores válidos para graph_type a coluna:

Valor da coluna Descrição
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 Também armazena informações sobre colunas implícitas criadas em tabelas de nó ou borda. As informações a seguir podem ser recuperadas de sys.columns, no entanto, os usuários não podem selecionar essas colunas de um nó ou tabela de borda.

As colunas implícitas em uma tabela de nós são:

Nome da Coluna Tipo de Dados is_hidden Comentário
graph_id_\<hex_string> bigint 1 Valor de ID do gráfico interno.
$node_id_\<hex_string> NVARCHAR 0 Representação externa de caracteres do ID do nó.

As colunas implícitas em uma tabela de borda são:

Nome da Coluna Tipo de Dados is_hidden Comentário
graph_id_\<hex_string> bigint 1 Valor de ID do gráfico interno.
$edge_id_\<hex_string> NVARCHAR 0 Representação de caractere do ID da borda.
from_obj_id_\<hex_string> INT 1 Valor interno object_id para o nó "de".
from_id_\<hex_string> bigint 1 Valor de ID de gráfico interno para o nó "de".
$from_id_\<hex_string> NVARCHAR 0 representação de caracteres do nó "de".
to_obj_id_\<hex_string> INT 1 Interno object_id para o "nó para".
to_id_\<hex_string> bigint 1 Valor de ID de gráfico interno para o "nó para".
$to_id_\<hex_string> NVARCHAR 0 Representação externa de caracteres do "nó para".

Funções do sistema

Você pode usar as seguintes funções internas para interagir com as pseudocolunas em tabelas de gráficos. Referências detalhadas são fornecidas para cada uma dessas funções nas respectivas referências de função T-SQL.

Interno Descrição
OBJECT_ID_FROM_NODE_ID Extraia a ID do objeto para a tabela de gráficos de um node_idarquivo .
GRAPH_ID_FROM_NODE_ID Extraia o valor da ID do gráfico de um node_idarquivo .
NODE_ID_FROM_PARTS Construa um node_id a partir de uma ID de objeto para a tabela de gráficos e um valor de ID de gráfico.
OBJECT_ID_FROM_EDGE_ID Extraia o ID do objeto para a tabela de gráficos de edge_id.
GRAPH_ID_FROM_EDGE_ID Extraia o valor da ID do gráfico para um determinado edge_id.
EDGE_ID_FROM_PARTS Construa edge_id a partir do ID do objeto para a tabela de gráficos e o valor do ID do gráfico.

Referência do Transact-SQL

Conheça as extensões Transact-SQL introduzidas no SQL Server e no Banco de Dados SQL do Azure que permitem criar e consultar objetos de grafo. As extensões de linguagem de consulta ajudam a consultar e percorrer o grafo usando a sintaxe de arte ASCII.

Instruções de DDL (Linguagem de Definição de Dados)

Tarefa Artigo relacionado Observações
CREATE TABLE CREATE TABLE (Transact-SQL) CREATE TABLE agora é estendido para suportar a criação de uma tabela AS NODE ou AS EDGE. Uma tabela de borda não precisa ter nenhum atributo definido pelo usuário.
ALTER TABLE ALTER TABLE (Transact-SQL) As tabelas de nó e borda podem ser alteradas da mesma forma que uma tabela relacional, usando o ALTER TABLE. Os usuários podem adicionar ou modificar colunas, índices ou restrições definidos pelo usuário. No entanto, alterar colunas internas do gráfico, como $node_id ou $edge_id, resulta em um erro.
CREATE INDEX CREATE INDEX (Transact-SQL) Os usuários podem criar índices em pseudocolunas e colunas definidas pelo usuário em tabelas de nó e borda. Há suporte para todos os tipos de índice, incluindo índices columnstore clusterizados e não clusterizados.
CRIAR RESTRIÇÕES DE BORDA RESTRIÇÕES DE BORDA (Transact-SQL) Os usuários agora podem criar restrições de borda em tabelas de borda para impor semântica específica e também manter a integridade dos dados
DROP TABLE DROP TABLE (Transact-SQL) As tabelas de nó e borda podem ser descartadas da mesma forma que uma tabela relacional, usando o DROP TABLE. Atualmente, não há mecanismos para impedir a exclusão de nós, que são referenciados por bordas. Não há suporte para exclusão em cascata de bordas, após a exclusão de um nó (ou descartando toda a tabela de nós). Em todos esses casos, todas as arestas conectadas aos nós excluídos devem ser excluídas manualmente, para manter a consistência do gráfico.

Instruções de DML (Linguagem de Manipulação de Dados)

Tarefa Artigo relacionado Observações
INSERT INSERT (Transact-SQL) Inserir em uma tabela de nós não é diferente de inserir em uma tabela relacional. Os valores da $node_id coluna são gerados automaticamente. Tentar inserir um valor em $node_id ou $edge_id coluna resulta em um erro. Os usuários devem fornecer valores para $from_id e $to_id colunas ao inserir em uma tabela de borda. $from_id e $to_id são os $node_id valores dos nós que uma determinada aresta conecta.
DELETE DELETE (Transact-SQL) Os dados de tabelas de nó ou borda podem ser excluídos da mesma forma que são excluídos de tabelas relacionais. No entanto, nesta versão, não há restrições para garantir que nenhuma borda aponte para um nó excluído e a exclusão em cascata de bordas, após a exclusão de um nó, não é suportada. Recomenda-se que, sempre que um nó for excluído, todas as arestas de conexão desse nó também sejam excluídas.
UPDATE UPDATE (Transact-SQL) Os valores em colunas definidas pelo usuário podem ser atualizados usando a instrução UPDATE. Não é possível atualizar as colunas internas do gráfico, $node_id, $edge_id$from_id , e $to_id.
MERGE MERGE (Transact-SQL) MERGE é suportada em uma tabela de nó ou borda.

Instruções de consulta

Tarefa Artigo relacionado Observações
SELECT SELECT (Transact-SQL) Como os nós e as bordas são armazenados como tabelas, a maioria das operações de tabela também tem suporte em tabelas de nó e borda.
MATCH MATCH (Transact-SQL) O MATCH integrado é introduzido para dar suporte à correspondência de padrões e à passagem pelo grafo.

Limitações

Há certas limitações nas tabelas de nó e borda:

  • As tabelas temporárias locais ou globais não podem ser tabelas de nó ou borda.
  • Os tipos de tabela e as variáveis de tabela não podem ser declarados como uma tabela de nó ou borda.
  • As tabelas de nó e borda não podem ser criadas como tabelas temporais com controle da versão do sistema.
  • As tabelas de nó e borda não podem ser tabelas com otimização de memória.
  • Os usuários não podem atualizar as colunas e $to_id de uma borda usando a $from_id instrução UPDATE. Para atualizar os nós referenciados por uma borda, os usuários precisam inserir uma nova borda apontando para novos nós e excluir a anterior.
  • Não há suporte para consultas entre bancos de dados em objetos de grafo.
  • As pseudocolunas de grafo (node_id, $to_id $from_ide edge_id) não podem ser usadas como as colunas de classificação para um índice columnstore clusterizado ordenado. A tentativa de usar qualquer pseudocoluna de grafo como as colunas de classificação para columnstore clusterizado ordenado resulta em um Msg 102: Incorrect syntax erro.
  • No banco de dados SQL do Fabric, o SQL Graph é permitido, mas as tabelas de nó e borda não serão espelhadas no OneLake do Fabric.

Confira também

Próximas etapas