Arquitetura do SQL Graph

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

Saiba mais sobre a arquitetura do SQL Graph. Conhecer as noções básicas facilita a compreensão de outros artigos do SQL Graph.

Banco de dados do SQL Graph

Os usuários podem criar um grafo por banco de dados. Um grafo é uma coleção de tabelas de nó e borda. Tabelas de nó ou de borda podem ser criadas em qualquer esquema no banco de dados, mas todas pertencem a um grafo 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 grafo. Da mesma forma, uma tabela de borda é uma coleção de tipos semelhantes de bordas. Por exemplo, uma Friends tabela de borda 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 com suporte em tabelas regulares tem suporte em tabelas de nó ou de borda.

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

Diagrama mostrando a arquitetura do banco de dados do SQL Graph.

Tabela de nós

Uma tabela de nós representa uma entidade em um esquema de grafo. Sempre que uma tabela de nós é criada, juntamente com as colunas definidas pelo usuário, uma coluna implícita $node_id é criada, o 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 de grafo 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 pseudo-coluna da tabela, o nome da coluna aparece como $node_id_<unique suffix>.

Observação

Usar pseudo-colunas 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 pseudo-colunas é um detalhe de implementação. Você não deve assumir uma dependência direta no 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 pseudo-colunas de grafo ($node_id, $from_id, $to_id) em predicados. Por exemplo, um predicado como 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 MATCH o mais longe 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 exclusivo padrão não clusterizado será criado automaticamente. No entanto, qualquer índice em uma pseudo-coluna de grafo é 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 grafo. 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 grafo. 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 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 pseudocoleção em consultas é a maneira recomendada de consultar a coluna interna $edge_id e o uso de nome interno com cadeia de caracteres 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 é encerrada.

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 dois tipos de nós. Ou seja, uma borda pode conectar dois nós no grafo, independentemente de seus tipos.

Semelhante à $node_id coluna , é recomendável que os usuários criem um índice ou restrição exclusivo na $edge_id coluna no momento da criação da tabela de borda, mas se um não for criado, um índice exclusivo padrão não clusterizado será criado automaticamente nessa coluna. No entanto, qualquer índice em uma pseudo-coluna de grafo é criado nas colunas internas subjacentes. Ou seja, um índice criado na $edge_id coluna aparece na coluna interna graph_id_<unique suffix> . Também é recomendável, 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 De nó e tabela de borda.

Metadados

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

sys.tables

bit As colunas a seguir em sys.tables podem ser usadas para identificar tabelas de grafo. Se is_node for 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 graph_type colunas e graph_type_desc na exibição sys.columns são úteis para entender os diferentes tipos de colunas usadas em tabelas de borda e nó de grafo:

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 a 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ó ou de borda. No entanto, as informações a seguir podem ser recuperadas de sys.columns. No entanto, os usuários não podem selecionar essas colunas em 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 da ID do grafo interno.
$node_id_\<hex_string> NVARCHAR 0 Representação de caractere externa da 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 da ID do grafo interno.
$edge_id_\<hex_string> NVARCHAR 0 Representação de caractere da ID de borda.
from_obj_id_\<hex_string> INT 1 Valor interno object_id para o "do nó".
from_id_\<hex_string> bigint 1 Valor da ID do grafo interno para o "do nó".
$from_id_\<hex_string> NVARCHAR 0 representação de caractere do "do nó".
to_obj_id_\<hex_string> INT 1 Interno object_id para o "para nó".
to_id_\<hex_string> bigint 1 Valor da ID do grafo interno para o "para nó".
$to_id_\<hex_string> NVARCHAR 0 Externa, representação de caractere do "para nó".

Funções do sistema

Você pode usar as seguintes funções internas para interagir com as pseudo-colunas em tabelas de grafo. 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 grafo de um node_id.
GRAPH_ID_FROM_NODE_ID Extraia o valor da ID do grafo de um node_id.
NODE_ID_FROM_PARTS Construa um node_id de uma ID de objeto para a tabela de grafo e um valor de ID de grafo.
OBJECT_ID_FROM_EDGE_ID Extraia a ID do objeto para a tabela de grafo de edge_id.
GRAPH_ID_FROM_EDGE_ID Extraia o valor da ID do grafo para um determinado edge_id.
EDGE_ID_FROM_PARTS Construa edge_id a partir da ID do objeto para a tabela de grafo e o valor da ID do grafo.

Referência do Transact-SQL

Conheça as extensões Transact-SQL introduzidas no banco de dados SQL Server e 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 dar suporte à criação de uma tabela AS NODE ou AS EDGE. Uma tabela de borda pode ou não ter atributos definidos 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 de grafo internas, como $node_id ou $edge_id, resulta em um erro.
CREATE INDEX CREATE INDEX (Transact-SQL) Os usuários podem criar índices em pseudo-colunas e colunas definidas pelo usuário em tabelas de nó e borda. Todos os tipos de índice têm suporte, 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 de 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 remoção de toda a tabela de nós). Em todos esses casos, todas as bordas conectadas aos nós excluídos devem ser excluídas manualmente para manter a consistência do grafo.

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

Tarefa Artigo relacionado Observações
INSERT INSERT (Transact-SQL) A inserção em uma tabela de nós não é diferente da inserção em uma tabela relacional. Os valores da $node_id coluna são gerados automaticamente. Tentar inserir um valor na $node_id coluna ou $edge_id resulta em um erro. Os usuários devem fornecer valores para $from_id colunas e $to_id durante a inserção em uma tabela de borda. $from_id e $to_id são os $node_id valores dos nós que uma determinada borda conecta.
Delete (excluir) DELETE (Transact-SQL) Os dados de tabelas de nó ou de borda podem ser excluídos da mesma forma que são excluídos das tabelas relacionais. No entanto, nesta versão, não há restrições para garantir que nenhuma borda aponte para um nó excluído e exclusão em cascata de bordas, após a exclusão de um nó não tenha suporte. É recomendável que, sempre que um nó for excluído, todas as bordas de conexão a esse 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 de grafo internas, $node_id, $edge_id$from_id e $to_id.
MESCLAR MERGE (Transact-SQL) MERGE há suporte para a instrução em um nó ou tabela de borda.

Instruções de consulta

Tarefa Artigo relacionado Observações
SELECT SELECT (Transact-SQL) Como nós e 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 interno é introduzido para dar suporte à correspondência de padrões e à passagem pelo grafo.

Limitações

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

  • Tabelas temporárias locais ou globais não podem ser tabelas de nó ou de borda.
  • Tipos de tabela e variáveis de tabela não podem ser declarados como um nó ou tabela de borda.
  • Tabelas de nó e borda não podem ser criadas como tabelas temporais com controle de versão do sistema.
  • Tabelas de nó e borda não podem ser tabelas com otimização de memória.
  • Os usuários não podem atualizar as $from_id colunas 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 a anterior.
  • Não há suporte para consultas entre bancos de dados em objetos de grafo.

Confira também

Próximas etapas