Este documento descreve o esquema do Spanner Graph e fornece exemplos para ilustrar os principais conceitos. Para saber mais sobre o gráfico do Spanner, consulte Visão geral do Spanner Graph.
Modelo de dados do gráfico de propriedades
Um gráfico de propriedades permite modelar dados conectados. Ele representa informações como uma rede de nós e arestas. Os nós simbolizam entidades no seu cenário de dados, como "clientes", "produtos" ou "locais". As arestas mostram as conexões entre esses nós, capturando relacionamentos como "comprado", "segue" ou "localizado em".
Tanto os nós quanto as bordas podem incluir as seguintes informações:
- Rótulos, que classificam nós e bordas em conjuntos, por exemplo, cidade.
- Propriedades, que são pares de chave-valor, por exemplo, preenchimento.
O exemplo na Figura 1 mostra como projetar um gráfico para modelar atividades financeiras. Este gráfico inclui os seguintes tipos de entidades modelados 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 são conectadas por diferentes tipos de relações, que são representada pelas seguintes bordas direcionadas:
- Propriedade:uma pessoa tem uma ou mais contas.
- Transferências:transferências de dinheiro de uma conta para outra.
Cada aresta dirigida 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 bordas direcionadas.
Os nós e as arestas podem conter outras informações na forma de propriedades. Cada propriedade tem um nome e um valor.
- Os nós Pessoa têm as seguintes propriedades:
name
(STRING
)id
(INT64
)
- As transferências têm a seguinte propriedade:
amount
(FLOAT64)
Bordas direcionadas e não direcionadas
O exemplo de gráfico usa arestas direcionadas, que indicam uma direção específica na relação entre entidades. No entanto, algumas relações, como a "amigo" em uma rede social, não são direcionadas e representam recíproca sem origem ou endpoint distinto. Nesse caso, modela arestas não direcionadas como duas arestas direcionadas, uma em cada direção.
Design do esquema do gráfico do Spanner
Com o gráfico do Spanner, é possível criar um gráfico de tabelas usando instrução CREATE PROPERTY GRAPH. As tabelas usadas para criar gráficos são chamadas de tabelas de entrada. Essa abordagem é baseada em SQL/PGQ (Property Graph Queries), que faz parte dos padrões SQL:2023.
Como definir um nó em um gráfico de property
Para definir um nó, adicione uma definição de nó na cláusula NODE TABLES. A forma mais simples de definição de nó contém apenas um nome de tabela de entrada. Linhas da tabela de entrada são mapeados para nós de gráfico.
No exemplo a seguir, você usa a cláusula NODE TABLES para definir os
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ótulo e propriedades padrão
Por padrão, todos os nós usam o nome da tabela de entrada como rótulo, e todas as colunas da tabela de entrada são expostas como propriedades do nó.
No exemplo anterior,
- Cada nó de conta tem o rótulo
Account
. - Cada nó de conta tem propriedades
[id, create_time]
criadas com base nas colunas da tabelaAccount
.
Chave do elemento
Uma definição de nó também define a chave de 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.
- As chaves do elemento podem ser explicitamente definidas pela cláusula
KEY
. - As colunas com restrições de exclusividade
UNIQUE INDEX
podem ser usadas como chaves de elementos.
O exemplo a seguir define os nós Account
e Person
.
- O nó
Account
usa a chave primária da tabelaAccount
como elemento por padrão. - 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
);
Mapeamento de 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 nula são ignoradas.
Como definir uma aresta em um gráfico de property
Para definir uma aresta, adicione uma definição de aresta à cláusula EDGE TABLES. A forma mais simples de definição de borda contém apenas um nome de tabela de entrada. As linhas da tabela de entrada são mapeadas para as 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 de elemento de cada borda é definida da mesma forma que os nós.
Referência do nó de origem e destino
No exemplo a seguir, você cria um gráfico de propriedades FinGraph
com o
seguintes:
- Nós
Person
eAccount
- Borda
PersonOwnAccount
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 borda deve definir a referência do 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 borda de PersonOwnAccount
conecta um Person
(origem) a um Account
.
nó (destino).
- O nó
SOURCE
de uma aresta é um nóPerson
comid
igual a na bordaid
. - O nó
DESTINATION
de uma aresta é um nóAccount
cujoid
é 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 que as colunas da
Tabela
PersonOwnAccount
. - Cada aresta tem o rótulo
PersonOwnAccount
padrão.
Mapear uma linha em uma tabela de entrada de borda para as bordas do gráfico
- Cada linha na tabela de entrada de borda, cuja chave de elemento não é nula, geralmente é mapeada para uma aresta exclusiva no gráfico.
- Uma linha pode corresponder a zero ou mais arestas no gráfico, por exemplo, quando a referência do nó de origem corresponde a zero ou mais nós na tabela de nós de origem.
- A mesma tabela de entrada pode ser usada em diferentes definições de nó ou aresta para criar diferentes conjuntos de nós ou arestas. Para mais informações, consulte Mesclar tabelas de entrada de arestas e nós.
Personalizar rótulos e propriedades
Você pode usar LABEL e PROPRIEDADES cláusulas para personalizar rótulos e propriedades.
No exemplo abaixo, há dois nós definidos, Person
e
Account
.
- Os nós
Person
expose
a propriedadeaddress
pelo rótuloCustomer
. O A propriedadeaddress
é definida pela expressãoCONCAT(city, ", ", country),
, que se refere às colunascity
ecountry
da entrada. tabelaPerson
. - Para
Account
, o nóAccount
expõe oid
e ocreate_time
pelo rótuloAccount
. 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 aonick_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. Rótulos e propriedades com o mesmo nome podem aparecer em várias definições de nó ou aresta. No entanto, os rótulos e as propriedades com o mesmo nome precisam seguir estas regras:
- Propriedades com o mesmo nome precisam ter o mesmo tipo de valor.
- Os rótulos com o mesmo nome precisam expor a mesma lista de propriedades.
No exemplo anterior, o rótulo Entity
é definido em Person
e
Account
nós. Em ambas as definições, elas têm 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
tem uma dependência 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. Se uma alteração de esquema corromper um desses
dependências, a alteração não será permitida.
A instrução a seguir cria uma dependência de FinGraph
para o Account
tabela e as colunas id
, create_time
.
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Account PROPERTIES (id, create_time)
);
Confira abaixo exemplos de mudanças de esquema que não são permitidas:
- Exclua a tabela
Account
, a menos que você remova primeiro a definição do nóAccount
. Para mais informações, consulte Remova nós ou definições de borda atuais. - Elimine as colunas
create_time
da tabelaAccount
, a menos que você primeiro remova a propriedadecreate_time
da definição do nóAccount
. Para mais informações, consulte Atualizar definições de nós ou bordas existentes.
No entanto, é possível fazer as seguintes mudanças no esquema:
- Modifique a tabela
Account
e o esquema das colunasid
ecreate_time
como desde que permitidos por outros requisitos de esquema. Para mais informações, consulte Fazer atualizações de esquema.