Vista geral do esquema do Spanner Graph

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, Account pode ser uma etiqueta.

  • Propriedades: usadas para descrever nós e arestas. Por exemplo, um nó Person pode ter uma propriedade name com o valor Alex e uma propriedade id com o valor 1.

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.

Diagrama da vista geral do esquema do gráfico do Spanner.

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 KEY para 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ó Account usa a chave principal da tabela Account como chave do elemento.
  • Por outro lado, o nó Person especifica explicitamente o id como a chave do elemento com a cláusula KEY.
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.

Referências de nós de origem e destino

No exemplo seguinte, cria um gráfico de propriedades FinGraph com o seguinte:

  • Person e Account nós
  • PersonOwnAccount extremidade
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ó Person em que o id é igual ao id do limite.
  • O nó de destino de um limite é um nó Account em que o id é igual ao account_id do 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 PersonOwnAccount predefinida.

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 Person usam a etiqueta Customer para expor a propriedade address. A propriedade address é definida pela expressão CONCAT(city, ", ", country), que se refere à coluna city e country da tabela de entrada Person.
  • Para Account, o nó Account usa a etiqueta Account para expor as propriedades id e create_time.
  • Person e Account têm a etiqueta Entity com as propriedades [id, name].
    • Para Person, as propriedades id e name são provenientes das colunas da tabela de entrada.
    • Para Account, a propriedade name refere-se à coluna nick_name da tabela de entrada.
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:

No entanto, pode fazer as seguintes alterações ao esquema:

  • Modifique o esquema da tabela Account e das colunas id e create_time se 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?