O Spanner Graph permite-lhe modelar dados ligados 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 ligações entre elas. Os nós e as arestas incluem etiquetas que classificam os tipos de nós e arestas. Os nós e os arcos também incluem propriedades que os descrevem.
Define um esquema de grafos do Spanner mapeando linhas de tabelas de entrada para nós e arestas do grafo. Personalize etiquetas e propriedades para nós e arestas, e compreenda como as alterações ao esquema afetam as dependências do gráfico. Também pode gerir dados sem esquema para definições de grafos mais flexíveis.
Para saber mais sobre o gráfico do Spanner, consulte a vista geral do gráfico do Spanner.
Compreenda o modelo de dados de grafos de propriedades
Um gráfico de propriedades permite-lhe modelar dados associados. Representa informações como uma rede de nós e arestas. Os nós simbolizam entidades na sua paisagem de dados, como clientes, produtos ou localizações. As arestas mostram as ligações entre esses nós, captando relações como comprado, segue ou localizado em.
Os nós e os limites podem incluir as seguintes informações:
Etiquetas: classifique nós e tipos de arestas. Se não definir explicitamente uma etiqueta para um nó ou uma aresta, o Spanner Graph usa o nome da tabela de entrada como a etiqueta predefinida. Por exemplo,
Accountpode ser uma etiqueta.Propriedades: usadas para descrever nós e arestas. Por exemplo, um nó
Personpode ter uma propriedadenamecom o valorAlexe uma propriedadeidcom o valor1.
O exemplo na Figura 1 mostra como pode criar um gráfico para modelar atividades financeiras. Este 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.
Estas entidades estão ligadas 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 liga uma origem Account a um destino Account, indicando o fluxo de dinheiro.
Figura 1. Exemplo de um gráfico com vários nós e arestas direcionadas.
Os nós e os limites incluem informações adicionais nas propriedades.
- 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 relação de amizade numa rede social, não são direcionadas e representam uma ligação recíproca sem uma origem ou um ponto final distintos. Neste caso, pode modelar arestas não direcionadas como duas arestas direcionadas, uma aresta em cada direção.
Design de esquemas do gráfico do Spanner
O Spanner Graph permite-lhe usar a declaração CREATE PROPERTY GRAPH para criar um gráfico a partir de tabelas. As tabelas que criam gráficos são denominadas tabelas de entrada. Esta abordagem usa SQL/PGQ (consultas de grafos de propriedades), que faz parte das normas SQL:2023.
Defina um nó a partir de uma tabela
Para definir um nó, adicione uma definição de nó na cláusula NODE TABLES. A forma mais simples de definição de nós contém apenas um nome de tabela de entrada. O gráfico do Spanner mapeia linhas da tabela de entrada para nós do gráfico.
No exemplo seguinte, 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
);
Etiquetas e propriedades predefinidas
Além de usar o nome da tabela de entrada como a etiqueta predefinida, o Spanner Graph expõe todas as colunas da tabela de entrada como propriedades do nó.
No exemplo anterior,
- Cada nó da conta usa a etiqueta
Account. - Cada nó da conta inclui propriedades das colunas da tabela
[id, create_time].Account
Chave do elemento
Uma definição de nó também define a chave do elemento que identifica exclusivamente um nó do gráfico.
- Por predefinição, a chave do elemento é a chave principal da tabela de entrada.
- Pode usar a cláusula
KEYpara definir explicitamente as chaves de elementos. - Pode usar colunas com uma restrição de índice único como chaves de elementos.
O exemplo seguinte define o nó Account e o nó Person.
- Por predefinição, o nó
Accountusa a chave principal da tabelaAccountcomo chave do elemento. - Por outro lado, o nó
Personespecifica explicitamente oidcomo 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
);
Mapeie 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ó único no gráfico, identificado pela chave de elemento.
- As linhas com uma chave de elemento nula são ignoradas.
Defina um limite a partir de uma tabela
Para definir um limite, adicione uma definição de limite à cláusula EDGE TABLES. A forma mais simples de definição de arestas contém apenas um nome de tabela de entrada. O gráfico do Spanner mapeia as linhas da tabela de entrada para as arestas do gráfico.
A etiqueta e as propriedades predefinidas das arestas são definidas 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 seguinte, cria um gráfico de propriedades FinGraph com o seguinte:
PersoneAccountnósPersonOwnAccountextremidade
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 do nó de origem e destino através das cláusulas SOURCE KEY, DESTINATION KEY e REFERENCES. O exemplo seguinte usa a definição de limite de PersonOwnAccount para ilustrar este conceito:
EDGE TABLES (
PersonOwnAccount
SOURCE KEY (id) REFERENCES Person (id)
DESTINATION KEY (account_id) REFERENCES Account (id)
)
Cada aresta PersonOwnAccount liga um nó Person (origem) a um nó Account (destino).
- O nó de origem de um limite é um nó
Personem que oidé igual aoiddo limite. - O nó de destino de um limite é um nó
Accountem que oidé igual aoaccount_iddo limite.
Além disso, o seguinte é verdadeiro para a aresta PersonOwnAccount:
- A chave do elemento é a chave principal 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 a etiqueta
PersonOwnAccountpredefinida.
Mapeie uma linha numa 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, normalmente, é mapeada para uma aresta única no seu gráfico.
- Uma linha pode corresponder a zero ou mais do que uma aresta no gráfico. Por exemplo, isto ocorre quando a referência do nó de origem corresponde a zero ou mais nós na tabela de nós de origem.
Defina nós e arestas numa única tabela
Pode definir um nó e as respetivas arestas de entrada ou saída numa única tabela se as colunas da tabela definirem uma relação com outra tabela. Esta abordagem reduz o número de tabelas, simplifica a gestão de dados e pode melhorar o desempenho das consultas eliminando a necessidade de uma junção a uma tabela de arestas separada.
Por exemplo, se a seguinte tabela Account tiver uma chave principal composta(owner_id, account_id), a parte owner_id pode ser uma chave externa que faz referência a uma tabela Person. Esta estrutura permite que a tabela Account represente o nó Account e a aresta de entrada do nó Person.
CREATE TABLE Person (
id INT64 NOT NULL,
) PRIMARY KEY (id);
-- Assume each account has exactly one owner.
CREATE TABLE Account (
owner_id INT64 NOT NULL,
account_id INT64 NOT NULL,
FOREIGN KEY (owner_id) REFERENCES Person(id)
) PRIMARY KEY (owner_id, account_id);
Pode usar a tabela Account para definir o nó Account e a respetiva aresta Owns de entrada. Isto é apresentado na seguinte CREATE PROPERTY GRAPH
declaração. Na cláusula EDGE TABLES, atribui o alias Owns à tabela Account. Isto deve-se ao facto de cada elemento no esquema do gráfico ter de ter um nome exclusivo.
CREATE PROPERTY GRAPH FinGraph
NODE TABLES (
Person,
Account
)
EDGE TABLES (
Account AS Owns
SOURCE KEY (owner_id) REFERENCES Person
DESTINATION KEY (owner_id, account_id) REFERENCES Account
);
Personalize etiquetas e propriedades
Pode usar as cláusulas LABEL e PROPERTIES para personalizar etiquetas e propriedades.
O exemplo seguinte define dois nós: Person e Account.
- Os nós
Personusam a etiquetaCustomerpara expor a propriedadeaddress. A propriedadeaddressé definida pela expressãoCONCAT(city, ", ", country),que se refere à colunacityecountryda tabela de entradaPerson. - Para
Account, o nóAccountusa a etiquetaAccountpara expor as propriedadesidecreate_time. PersoneAccounttêm a etiquetaEntitycom as propriedades [id, name].- Para
Person, as propriedadesidenamesão provenientes das colunas da tabela de entrada. - Para
Account, a propriedadenamerefere-se à colunanick_nameda 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 das etiquetas e propriedades
Num gráfico, as etiquetas e as propriedades são identificadas exclusivamente pelos respetivos nomes. Pode usar etiquetas e propriedades com o mesmo nome em várias definições de nós ou arestas. No entanto, as etiquetas e as propriedades com o mesmo nome têm de seguir estas regras:
- As propriedades com o mesmo nome usam o mesmo tipo de valor.
- As etiquetas com o mesmo nome expõem a mesma lista de propriedades.
No exemplo anterior, a etiqueta Entity está definida nos nós Person e Account. Ambas as definições incluem o mesmo conjunto de nomes de propriedades [id,
name] com tipos de valores 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ós e arestas, e as colunas das tabelas referenciadas pelas propriedades. O Spanner Graph não permite uma alteração do esquema que quebre uma destas dependências.
A seguinte declaração 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 alterações ao esquema:
- Não pode eliminar a tabela
Account. Para isso, tem de remover a definição do nóAccount. Para mais informações, consulte o artigo Remova definições de nós ou arestas existentes. - Não é possível largar
create_timecolunas da tabelaAccount. Para isso, tem de remover a propriedadecreate_timeda definição do nóAccount. Para mais informações, consulte o artigo Atualize as definições de nós ou arestas existentes.
No entanto, pode fazer as seguintes alterações ao esquema:
- Modifique o esquema da tabela
Accounte das colunasidecreate_timese outros requisitos do esquema o permitirem. Para mais informações, consulte o artigo Faça atualizações do esquema.
Veja uma visualização do esquema
Pode ver uma visualização do esquema no Spanner Studio depois de executar uma consulta do Spanner Graph. Para mais informações, consulte o artigo Use visualizações de gráficos do Spanner.
Faça a gestão de dados sem esquema
O Spanner Graph também suporta a gestão de dados sem esquema, o que é útil quando precisa de uma definição de gráfico mais flexível. Para mais informações, consulte o artigo Faça a gestão de dados sem esquema no Spanner Graph.
O que se segue?
- Crie um esquema de gráfico do Spanner.
- Atualize ou elimine um esquema do Spanner Graph.
- Faça a gestão de dados sem esquema com o Spanner Graph.