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.
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.
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
- Para começar a usar o SQL Graph, confira Banco de Dados do SQL Graph – Exemplo