Com o Spanner Graph, é possível modelar dados conectados como um gráfico de propriedades que representa informações como uma rede de nós e arestas. Os nós simbolizam entidades, e as arestas mostram as conexões entre elas. Nós e arestas incluem rótulos que os classificam em conjuntos. Os nós e as arestas também incluem propriedades que são pares de chave-valor.
Para definir um esquema de gráfico do Spanner, mapeie linhas de tabelas de entrada para nós e arestas do gráfico. Personalize rótulos e propriedades para nós e arestas e entenda como as mudanças de esquema afetam as dependências do gráfico. Também é possível gerenciar dados sem esquema para definições de gráficos mais flexíveis.
Para saber mais sobre o Spanner Graph, consulte a visão geral do Spanner Graph.
Entender o modelo de dados de gráfico de propriedades
Com um gráfico de propriedades, é possível modelar dados conectados. Ela representa informações como uma rede de nós e arestas. Os nós simbolizam entidades no cenário de dados, como clientes, produtos ou locais. As arestas mostram as conexões entre esses nós, capturando relações como "comprado", "segue" ou "localizado em".
Os nós e as arestas podem incluir as seguintes informações:
- Rótulos, que classificam nós e arestas em conjuntos, por exemplo, cidade.
- Propriedades, que são pares de chave-valor, por exemplo, população.
O exemplo na Figura 1 mostra como você pode projetar um gráfico para modelar atividades financeiras. Esse gráfico inclui os seguintes tipos de entidades modeladas como nós:
- Pessoa:representa um indivíduo envolvido em transações financeiras.
- Conta:representa uma conta bancária usada para transações.
Essas entidades estão conectadas por diferentes tipos de relações, que são representadas pelas seguintes arestas direcionadas:
- Proprietário:uma pessoa é proprietária de uma ou mais contas.
- Transferências:o dinheiro é movido de uma conta para outra.
Cada aresta direcionada indica uma relação unidirecional que flui de um nó de origem para um nó de destino. Por exemplo, uma aresta Transfers
conecta uma origem Account
a um destino Account
, indicando o fluxo de dinheiro.
Figura 1. Exemplo de gráfico com vários nós e arestas direcionadas.
Os nós e as arestas incluem mais informações nas propriedades. Cada propriedade inclui um nome e um valor.
- Os nós Person incluem estas propriedades:
name
(STRING
)id
(INT64
)
- As arestas Transfers incluem esta propriedade:
amount
(FLOAT64)
Arestas direcionadas e não direcionadas
O gráfico de exemplo usa arestas direcionadas que indicam uma direção específica na relação entre entidades. No entanto, algumas relações, como a de amigo em uma rede social, não são direcionadas e representam uma conexão recíproca sem uma origem ou um endpoint distintos. Nesse caso, você pode modelar arestas não direcionadas como duas arestas direcionadas, uma em cada direção.
Design de esquema do Spanner Graph
Com o Spanner Graph, você pode usar a instrução CREATE PROPERTY GRAPH para criar um gráfico com base em tabelas. As tabelas que criam gráficos são chamadas de tabelas de entrada. Essa abordagem usa SQL/PGQ (consultas de grafo de propriedades), que faz parte dos padrões SQL:2023.
Definir um nó em um gráfico de propriedades
Para definir um nó, adicione uma definição na cláusula NODE TABLES. A forma mais simples de definição de nó contém apenas um nome de tabela de entrada. O Spanner Graph mapeia linhas da tabela de entrada para nós de gráfico.
No exemplo a seguir, você usa a cláusula
NODE TABLES
para definir o nó Account
no gráfico de propriedades FinGraph
. A definição do nó contém a tabela de entrada Account
.
-- First, create an Account table.
CREATE TABLE Account (
id INT64 NOT NULL,
create_time TIMESTAMP,
) PRIMARY KEY (id);
-- Next, use the Account table as input table of Account node definition.
CREATE PROPERTY GRAPH FinGraph
NODE TABLES (
Account
);
Rótulos e propriedades padrão
Por padrão, todos os nós usam o nome da tabela de entrada como rótulo, e o gráfico do Spanner expõe todas as colunas da tabela de entrada como propriedades de nó.
No exemplo anterior,
- Cada nó de conta usa o rótulo
Account
. - Cada nó de conta inclui propriedades
[id, create_time]
das colunas da tabelaAccount
.
Chave do elemento
Uma definição de nó também define a chave do elemento que identifica de forma exclusiva um nó do gráfico.
- Por padrão, a chave do elemento é a chave primária da tabela de entrada.
- É possível usar a cláusula
KEY
para definir explicitamente as chaves de elemento. - É possível usar colunas com uma restrição de índice exclusivo como chaves de elemento.
O exemplo a seguir define os nós Account
e Person
.
- Por padrão, o nó
Account
usa a chave primária da tabelaAccount
como chave de elemento. - O nó
Person
, por outro lado, especifica explicitamente oid
como a chave do elemento com a cláusulaKEY
.
CREATE TABLE Person (
id INT64 NOT NULL,
name STRING(MAX),
) PRIMARY KEY (id);
CREATE TABLE Account (
id INT64 NOT NULL,
create_time TIMESTAMP,
) PRIMARY KEY (id);
CREATE PROPERTY GRAPH FinGraph
NODE TABLES (
Person KEY (id),
Account
);
Mapear uma linha na tabela de entrada para um nó no gráfico
- Cada linha com uma chave de elemento não nula é mapeada para um nó exclusivo no gráfico, identificado pela chave do elemento.
- As linhas com uma chave de elemento nulo são ignoradas.
Definir uma aresta em um gráfico de propriedades
Para definir uma aresta, adicione uma definição à cláusula EDGE TABLES. A forma mais simples de definição de aresta contém apenas um nome de tabela de entrada. O Spanner Graph mapeia linhas da tabela de entrada para arestas do gráfico.
O rótulo e as propriedades padrão das arestas são definidos da mesma forma que os nós.
A chave do elemento de cada aresta é definida da mesma forma que os nós.
Referências de nós de origem e destino
No exemplo a seguir, você cria um gráfico de propriedades FinGraph
com o seguinte:
- Nós
Person
eAccount
PersonOwnAccount
aresta
CREATE TABLE Person (
id INT64 NOT NULL,
name STRING(MAX),
) PRIMARY KEY (id);
CREATE TABLE Account (
id INT64 NOT NULL,
create_time TIMESTAMP,
) PRIMARY KEY (id);
CREATE TABLE PersonOwnAccount (
id INT64 NOT NULL,
account_id INT64 NOT NULL,
create_time TIMESTAMP,
FOREIGN KEY (account_id) REFERENCES Account (id)
) PRIMARY KEY (id, account_id),
INTERLEAVE IN PARENT Person;
CREATE PROPERTY GRAPH FinGraph
NODE TABLES (
Person,
Account
)
EDGE TABLES (
PersonOwnAccount
SOURCE KEY (id) REFERENCES Person (id)
DESTINATION KEY (account_id) REFERENCES Account (id)
);
Uma definição de aresta define a referência de nó de origem e destino usando
as cláusulas SOURCE KEY
, DESTINATION KEY
e REFERENCES
. O exemplo a seguir usa a definição de borda de PersonOwnAccount
para ilustrar esse conceito:
EDGE TABLES (
PersonOwnAccount
SOURCE KEY (id) REFERENCES Person (id)
DESTINATION KEY (account_id) REFERENCES Account (id)
)
Cada aresta PersonOwnAccount
conecta um Person
(origem) a um nó Account
(destino).
- O nó de origem de uma aresta é um nó
Person
em que oid
é igual aoid
da aresta. - O nó de destino de uma aresta é um nó
Account
em que oid
é igual aoaccount_id
da aresta.
Além disso, o seguinte é verdadeiro para a borda PersonOwnAccount
:
- A chave do elemento é a chave primária da tabela
PersonOwnAccount
, ou seja,(id, account_id)
. - Cada aresta tem o mesmo conjunto de propriedades das colunas da tabela
PersonOwnAccount
. - Cada aresta tem o rótulo padrão
PersonOwnAccount
.
Mapear uma linha em uma tabela de entrada de arestas para arestas no gráfico
- Cada linha na tabela de entrada de arestas, em que a chave do elemento não é nula, geralmente é mapeada para uma aresta única no gráfico.
- Uma linha pode corresponder a zero ou mais de uma aresta no gráfico. Por exemplo, isso acontece quando a referência do nó de origem corresponde a zero ou mais nós na tabela de nós de origem.
- É possível usar a mesma tabela de entrada em diferentes definições de nó ou aresta para criar conjuntos diferentes de nós ou arestas. Para mais informações, consulte Mesclar tabelas de entrada de nós e arestas.
Personalizar rótulos e propriedades
Use as cláusulas LABEL e PROPERTIES para personalizar rótulos e propriedades.
O exemplo a seguir define dois nós: Person
e Account
.
- Os nós
Person
usam o rótuloCustomer
para expor a propriedadeaddress
. A propriedadeaddress
é definida pela expressãoCONCAT(city, ", ", country),
, que se refere às colunascity
ecountry
da tabela de entradaPerson
. - Para
Account
, o nóAccount
usa o rótuloAccount
para expor as propriedadesid
ecreate_time
. Person
eAccount
têm o rótuloEntity
com as propriedades [id, name
].- Para
Person
, as propriedadesid
ename
vêm das colunas da tabela de entrada. - Para
Account
, a propriedadename
se refere à colunanick_name
da tabela de entrada.
- Para
CREATE TABLE Person (
id INT64 NOT NULL,
name STRING(MAX),
birthday TIMESTAMP,
country STRING(MAX),
city STRING(MAX),
) PRIMARY KEY (id);
CREATE TABLE Account (
id INT64 NOT NULL,
create_time TIMESTAMP,
is_blocked BOOL,
nick_name STRING(MAX),
) PRIMARY KEY (id);
CREATE PROPERTY GRAPH FinGraph
NODE TABLES (
Person KEY (id)
LABEL Customer
PROPERTIES (CONCAT(city, ", ", country) AS address)
LABEL Entity PROPERTIES (id, name),
Account KEY (id)
LABEL Account PROPERTIES (id, create_time)
LABEL Entity PROPERTIES (id, nick_name AS name)
);
Consistência de rótulos e propriedades
Em um gráfico, os rótulos e as propriedades são identificados de forma exclusiva pelos nomes. É possível usar rótulos e propriedades com o mesmo nome em várias definições de nós ou arestas. No entanto, rótulos e propriedades com o mesmo nome precisam seguir estas regras:
- Propriedades com o mesmo nome usam o mesmo tipo de valor.
- Rótulos com o mesmo nome expõem a mesma lista de propriedades.
No exemplo anterior, o rótulo Entity
é definido nos nós Person
e Account
. As duas definições incluem o mesmo conjunto de nomes de propriedades [id
, name
] com tipos de valor idênticos.
Dependências entre gráficos e outros objetos de esquema
O gráfico criado por CREATE PROPERTY GRAPH
depende de outros objetos de esquema, como as tabelas de entrada das definições de nó e aresta e as colunas de tabela referenciadas pelas propriedades. O Spanner Graph não permite uma mudança de esquema que interrompa uma dessas dependências.
A instrução a seguir torna FinGraph
dependente da tabela Account
e das colunas id
e create_time
.
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Account PROPERTIES (id, create_time)
);
Neste exemplo, o Spanner Graph não permite as seguintes mudanças de esquema:
- Não é possível excluir a tabela
Account
. Para isso, remova a definição do nóAccount
. Para mais informações, consulte Remover nós ou definições de arestas atuais. - Não é possível descartar colunas
create_time
da tabelaAccount
. Para fazer isso, remova a propriedadecreate_time
da definição do nóAccount
. Para mais informações, consulte Atualizar definições de nós ou arestas.
No entanto, é possível fazer as seguintes mudanças no esquema:
- Modifique o esquema da tabela
Account
e das colunasid
ecreate_time
se outros requisitos de esquema permitirem. Para mais informações, consulte Fazer atualizações de esquema.
Ver uma visualização de esquema
É possível ver uma visualização de esquema no Spanner Studio depois de executar uma consulta do Spanner Graph. Para mais informações, consulte Trabalhar com visualizações do Spanner Graph.
Gerenciar dados sem esquema
O Spanner Graph também oferece suporte ao gerenciamento de dados sem esquema, o que é útil quando você precisa de uma definição de gráfico mais flexível. Para mais informações, consulte Gerenciar dados sem esquema no Spanner Graph.
A seguir
- Crie um esquema do Spanner Graph.
- Atualize ou exclua um esquema do Spanner Graph.
- Gerencie dados sem esquema com o Spanner Graph.