Partilhar via


Arquitetura do SQL Graph

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

Saiba mais sobre a arquitetura do SQL Graph. Conhecer o básico 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 elas pertencem a um gráfico lógico. Uma tabela de nós é uma coleção de tipos semelhantes de nós. Por exemplo, uma tabela de nós Person contém todos os nós Person pertencentes a um gráfico. Da mesma forma, uma tabela de bordas é uma coleção de tipos semelhantes de bordas. Por exemplo, uma tabela de borda Friends contém todas as bordas que conectam um Person a outro Person. Como nós e bordas são armazenados em tabelas, a maioria das operações suportadas em tabelas regulares são suportadas em tabelas de nós ou bordas.

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

Diagrama mostrando a arquitetura do banco de dados SQL Graph.

Tabela de nós

Uma tabela de nó representa uma entidade em um esquema gráfico. Toda vez que uma tabela de nó é criada, juntamente com as colunas definidas pelo usuário, uma coluna de $node_id implícita é criada, que identifica exclusivamente um determinado nó no banco de dados. Os valores em $node_id são gerados automaticamente e são uma combinação de ID de objeto para a tabela gráfica dessa tabela de nó e um valor de bigint gerado internamente. No entanto, quando a coluna $node_id é 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 da tabela, o nome da coluna aparece como $node_id_<unique suffix>.

Observação

O uso das pseudocolunas em consultas é a única maneira suportada e recomendada de consultar a coluna $node_id interna. Você não deve usar diretamente as colunas $node_id_<hex_string> em nenhuma consulta. Além disso, a representação JSON computada mostrada nas pseudo-colunas é 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 é recomendado usar diretamente as pseudo-colunas do gráfico ($node_id, $from_id, $to_id) em predicados. Por exemplo, um predicado como n.$node_id = e.$from_id deve ser evitado. Tais comparações tendem a ser ineficientes, devido à conversão para a representação JSON. Em vez disso, confie na função MATCH na medida do possível.

É recomendável que os usuários criem uma restrição ou índice exclusivo na coluna $node_id no momento da criação da tabela de nós, mas se uma não for criada, 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 coluna $node_id, aparece na coluna graph_id_<hex_string> interna.

Tabela de bordas

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 de bigint gerado internamente. No entanto, quando a coluna $edge_id é selecionada, um valor calculado na forma de uma cadeia de caracteres JSON é exibido. $edge_id é uma pseudo-coluna 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 pseudocolunas em consultas é a maneira recomendada de consultar a coluna $edge_id interna e o uso de nome interno com cadeia de caracteres hexadecimal deve ser evitado.
$from_id Armazena a $node_id do nó, de onde a borda se origina.
$to_id Armazena a $node_id do nó, na qual a borda termina.

Os nós aos quais uma determinada borda pode se conectar são controlados pelos dados inseridos nas colunas $from_id e $to_id. Na primeira versão, não é possível definir restrições na tabela de borda, para restringi-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 à coluna $node_id, é recomendável que os usuários criem um índice ou restrição exclusivo na coluna $edge_id no momento da criação da tabela de borda, mas se uma não for criada, um índice exclusivo padrão 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 coluna $edge_id, aparece na coluna graph_id_<unique suffix> interna. 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 atributos de um nó ou tabela de borda.

sys.tables

As seguintes colunas bit em sys.tables podem ser usadas para identificar tabelas gráficas. Se is_node estiver definido como 1, a tabela será uma tabela de nós e, se is_edge estiver definida 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 colunas graph_type e graph_type_desc na visualização sys.columns 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-8 para colunas de gráfico 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 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ós ou bordas. As informações a seguir podem ser recuperadas de sys.columns, no entanto, os usuários não podem selecionar essas colunas de uma tabela de nó ou borda.

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

Nome da coluna Tipo de dados is_hidden Comentar
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 Comentar
graph_id_\<hex_string> BIGINT 1 Valor de ID do gráfico interno.
$edge_id_\<hex_string> NVARCHAR 0 Representação de caracteres do ID da borda.
from_obj_id_\<hex_string> INT 1 Valor de object_id interno para o nó "de".
from_id_\<hex_string> BIGINT 1 Valor de ID do 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 object_id interno para o "nó".
to_id_\<hex_string> BIGINT 1 Valor de ID do gráfico interno para o nó "to".
$to_id_\<hex_string> NVARCHAR 0 Representação externa de caracteres do "para nó".

Funções do sistema

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

Incorporado Descrição
OBJECT_ID_FROM_NODE_ID Extraia o ID do objeto para a tabela gráfica de um node_id.
GRAPH_ID_FROM_NODE_ID Extraia o valor de ID do gráfico de um node_id.
NODE_ID_FROM_PARTS Construa um node_id a partir de um ID de objeto para a tabela de gráfico e um valor de ID de gráfico.
OBJECT_ID_FROM_EDGE_ID Extraia o ID do objeto para a tabela gráfica do edge_id.
GRAPH_ID_FROM_EDGE_ID Extraia o valor de ID do gráfico para uma determinada edge_id.
EDGE_ID_FROM_PARTS Construa edge_id a partir do ID do objeto para a tabela do gráfico e o valor do ID do gráfico.

Transact-SQL referência

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

Instruções DDL (Data Definition Language)

Tarefa Artigo relacionado Observações
CRIAR TABELA CRIAR TABELA (Transact-SQL) CREATE TABLE agora é estendido para dar suporte à criação de uma tabela AS NODE ou AS EDGE. Uma tabela de borda não precisa ter atributos definidos pelo usuário.
TABELA ALTER TABELA ALTER (Transact-SQL) As tabelas de nós e bordas 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.
CRIAR ÍNDICE CRIAR ÍNDICE (Transact-SQL) Os usuários podem criar índices em pseudocolunas e colunas definidas pelo usuário em tabelas de nós e bordas. Todos os tipos de índice são suportados, 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ânticas específicas e também manter a integridade dos dados
MESA DE LARGADA MESA SUSPENSA (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 existem 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, quaisquer arestas conectadas aos nós excluídos devem ser excluídas manualmente, para manter a consistência do gráfico.

Instruções DML (Data Manipulation Language)

Tarefa Artigo relacionado Observações
INSERIR INSERIR (Transact-SQL) Inserir em uma tabela de nó não é diferente de inserir em uma tabela relacional. Os valores para $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 durante a inserção em uma tabela de borda. $from_id e $to_id são os valores $node_id dos nós que uma determinada borda conecta.
SUPRIMIR 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 aresta 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. É recomendável que, sempre que um nó for excluído, todas as bordas de conexão a esse nó também sejam excluídas.
ATUALIZAÇÃO 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.
MESCLAR MERGE (Transact-SQL) MERGE instrução é suportada em uma tabela de nó ou borda.

Instruções de consulta

Tarefa Artigo relacionado Observações
SELECIONAR SELECIONAR (Transact-SQL) Como nós e bordas são armazenados como tabelas, a maioria das operações de tabela também é suportada em tabelas de nós e bordas.
CORRESPONDÊNCIA JOGO (Transact-SQL) O MATCH built-in é introduzido para suportar a correspondência de padrões e a travessia através do gráfico.

Limitações

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

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

Ver também

Próximos passos