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.
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.
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_id arquivo . |
GRAPH_ID_FROM_NODE_ID | Extraia o valor da ID do gráfico de um node_id arquivo . |
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_id
eedge_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 umMsg 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
- Para começar a usar o SQL Graph, consulte Banco de dados do SQL Graph – Exemplo