Arquitetura do SQL Graph
Aplica-se a: SQL Server 2017 (14.x) e versões posteriores
Banco de Dados SQL do Azure
Instância Gerenciada SQL do Azure
banco 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.
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.
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
eedge_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 deMsg 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
- Para começar a usar o SQL Graph, consulte Banco de Dados SQL Graph - Exemplo de