Vista geral das consultas do Spanner Graph

Este documento fornece uma vista geral da utilização da linguagem de consulta de grafos com o Spanner Graph, incluindo a respetiva sintaxe para a correspondência de padrões de grafos, e mostra-lhe como executar consultas no seu grafo. Com o Spanner Graph, pode executar consultas para encontrar padrões, percorrer relações e obter estatísticas a partir dos dados do seu gráfico de propriedades.

Os exemplos neste documento usam o esquema de grafos que cria em Configure e consulte o Spanner Graph. Este esquema é ilustrado no diagrama seguinte:

Um exemplo de um esquema de gráfico do Spanner.
Figura 1.: Um exemplo de um esquema de gráfico do Spanner.

Execute uma consulta do Spanner Graph

Pode usar a Google Cloud consola, a Google Cloud CLI, as bibliotecas cliente, a API REST ou a API RPC para executar uma consulta de grafos do Spanner.

Google Cloud consola

Os passos seguintes mostram como executar uma consulta na Google Cloud consola. Estes passos pressupõem que tem uma instância denominada test-instance que contém uma base de dados denominada example-db. Para obter informações sobre como criar uma instância com uma base de dados, consulte Configure e consulte o Spanner Graph.

  1. Na Google Cloud consola, aceda à página Instâncias do Spanner.

    Aceda às instâncias do Spanner

  2. Clique na instância com o nome test-instance.

  3. Em Bases de dados, clique na base de dados com o nome example-db.

  4. Abra o Spanner Studio e, de seguida, clique em Novo separador ou use o separador do editor.

  5. Introduza uma consulta no editor de consultas.

  6. Clique em Executar.

CLI gcloud

Para enviar consultas através da ferramenta de linhas de comando da CLI gcloud, faça o seguinte:

  1. Se ainda não estiver instalada, instale a CLI gcloud.

  2. Na CLI gcloud, execute o seguinte comando:

    gcloud spanner databases execute-sql

Para mais informações, consulte o artigo Início rápido da CLI do Spanner.

API REST

Para enviar consultas através da API REST, use um dos seguintes comandos:

Para mais informações, consulte os artigos Consultar dados através da API REST e Começar a usar o Spanner através de REST.

API RPC

Para enviar consultas através da API RPC, use um dos seguintes comandos:

Bibliotecas cliente

Para saber como executar uma consulta com uma biblioteca de cliente do Spanner, consulte o seguinte:

Para mais informações sobre as bibliotecas cliente do Spanner, consulte a vista geral das bibliotecas cliente do Spanner.

Visualize os resultados da consulta do Spanner Graph

Pode ver uma representação visual dos resultados da consulta do Spanner Graph no Spanner Studio na Google Cloud consola. Uma visualização de consulta permite-lhe ver como os elementos devolvidos (nós e arestas) estão ligados. Isto pode revelar padrões, dependências e anomalias difíceis de ver quando visualiza os resultados numa tabela. Para ver uma visualização de uma consulta, a consulta tem de devolver nós completos no formato JSON. Caso contrário, pode ver os resultados da consulta apenas no formato tabular. Para mais informações, consulte o artigo Use visualizações de consultas de gráficos do Spanner.

Estrutura de consulta do gráfico do Spanner

Uma consulta do Spanner Graph consiste em vários componentes, como o nome do gráfico de propriedades, os padrões de nós e arestas, e os quantificadores. Use estes componentes para criar uma consulta que encontre padrões específicos no seu gráfico. Cada componente é descrito na secção Correspondência de padrões de grafos deste documento.

A consulta na Figura 2 demonstra a estrutura básica de uma consulta do Spanner Graph. A consulta começa por especificar o gráfico de destino, FinGraph, através da cláusula GRAPH. A cláusula MATCH define o padrão a pesquisar. Neste caso, trata-se de um nó Person ligado a um nó Account através de um limite Owns. A cláusula RETURN especifica as propriedades dos nós correspondentes a devolver.

Exemplo de estrutura de consulta do Spanner Graph.
Figura 2.: Um exemplo da estrutura de uma consulta do Spanner Graph.

Correspondência de padrões de gráficos

A correspondência de padrões de grafos encontra padrões específicos no seu grafo. Os padrões mais básicos são padrões de elementos, como padrões de nós que correspondem a nós e padrões de arestas que correspondem a arestas.

Padrões de nós

Um padrão de nós corresponde aos nós no seu gráfico. Este padrão contém parênteses correspondentes, que podem incluir opcionalmente uma variável de padrão de gráfico, uma expressão de etiqueta e filtros de propriedades.

Encontre todos os nós

A seguinte consulta devolve todos os nós no gráfico. A variável n, uma variável de padrão de gráfico, é associada aos nós correspondentes. Neste caso, o padrão de nós corresponde a todos os nós no gráfico.

GRAPH FinGraph
MATCH (n)
RETURN LABELS(n) AS label, n.id;

Esta consulta devolve label e id:

etiqueta id
Conta 7
Conta 16
Conta 20
Pessoa 1
Pessoa 2
Pessoa 3

Encontre todos os nós com uma etiqueta específica

A seguinte consulta corresponde a todos os nós no gráfico que têm a etiqueta Person . A consulta devolve as propriedades label e id, name dos nós correspondentes.

GRAPH FinGraph
MATCH (p:Person)
RETURN LABELS(p) AS label, p.id, p.name;

Esta consulta devolve as seguintes propriedades dos nós com correspondência:

etiqueta id nome
Pessoa 1 Alex
Pessoa 2 Dana
Pessoa 3 Lee

Encontre todos os nós que correspondem a uma expressão de etiqueta

Pode criar uma expressão de etiqueta com um ou mais operadores lógicos. Por exemplo, a seguinte consulta corresponde a todos os nós no gráfico que têm a etiqueta Person ou Account. A variável de padrão de gráfico n expõe todas as propriedades dos nós com a etiqueta Person ou Account.

GRAPH FinGraph
MATCH (n:Person|Account)
RETURN LABELS(n) AS label, n.id, n.birthday, n.create_time;

Nos seguintes resultados desta consulta:

  • Todos os nós têm a propriedade id.
  • Os nós que correspondem à etiqueta Account têm a propriedade create_time, mas não têm a propriedade birthday. A propriedade birthday é NULL para estes nós.
  • Os nós que correspondem à etiqueta Person têm a propriedade birthday, mas não têm a propriedade create_time. A propriedade create_time é NULL para estes nós.
etiqueta id aniversário create_time
Conta 7 NULL 2020-01-10T14:22:20.222Z
Conta 16 NULL 2020-01-28T01:55:09.206Z
Conta 20 NULL 2020-02-18T13:44:20.655Z
Pessoa 1 1991-12-21T08:00:00Z NULL
Pessoa 2 1980-10-31T08:00:00Z NULL
Pessoa 3 1986-12-07T08:00:00Z NULL

Encontre todos os nós que correspondem à expressão de etiqueta e ao filtro de propriedades

Esta consulta corresponde a todos os nós no gráfico que têm a etiqueta Person e onde a propriedade id é igual a 1.

GRAPH FinGraph
MATCH (p:Person {id: 1})
RETURN LABELS(p) AS label, p.id, p.name, p.birthday;

Seguem-se os resultados da consulta:

etiqueta id nome aniversário
Pessoa 1 Alex 1991-12-21T08:00:00Z

Pode usar a cláusula WHERE para formar condições de filtragem mais complexas em etiquetas e propriedades.

A consulta seguinte usa a cláusula WHERE para formar uma condição de filtragem mais complexa nas propriedades. Corresponde a todos os nós no gráfico que têm a etiqueta Person e a propriedade birthday está antes de 1990-01-10.

GRAPH FinGraph
MATCH (p:Person WHERE p.birthday < '1990-01-10')
RETURN LABELS(p) AS label, p.name, p.birthday;

Seguem-se os resultados da consulta:

etiqueta nome aniversário
Pessoa Dana 1980-10-31T08:00:00Z
Pessoa Lee 1986-12-07T08:00:00Z

Padrões de limites

Um padrão de aresta corresponde a arestas ou relações entre nós. Os padrões de arestas estão entre parênteses retos ([]) e incluem símbolos como -, -> ou <- para indicar direções. Um padrão de aresta pode incluir opcionalmente uma variável de padrão de gráfico para associar a arestas correspondentes.

Encontre todas as arestas com etiquetas correspondentes

Esta consulta devolve todas as arestas no gráfico com a etiqueta Transfers. A consulta associa a variável do padrão do gráfico e às arestas correspondentes.

GRAPH FinGraph
MATCH -[e:Transfers]->
RETURN e.Id as src_account, e.order_number

Seguem-se os resultados da consulta:

src_account order_number
7 304330008004315
7 304120005529714
16 103650009791820
20 304120005529714
20 302290001255747

Encontre todas as arestas que correspondam à expressão de etiqueta e ao filtro de propriedades

O padrão de aresta desta consulta usa uma expressão de etiqueta e um filtro de propriedade para encontrar todas as arestas etiquetadas com Transfers que correspondem a um order_number especificado.

GRAPH FinGraph
MATCH -[e:Transfers {order_number: "304120005529714"}]->
RETURN e.Id AS src_account, e.order_number

Seguem-se os resultados da consulta:

src_account order_number
7 304120005529714
20 304120005529714

Encontre todas as arestas usando qualquer padrão de arestas de direção

Pode usar o padrão de aresta any direction (-[]-) numa consulta para encontrar arestas em qualquer direção. A seguinte consulta encontra todas as transferências com uma conta bloqueada.

GRAPH FinGraph
MATCH (account:Account)-[transfer:Transfers]-(:Account {is_blocked:true})
RETURN transfer.order_number, transfer.amount;

Seguem-se os resultados da consulta:

order_number amount
304330008004315 300
304120005529714 100
103650009791820 300
302290001255747 200

Padrões de caminho

Um padrão de caminho é criado a partir de padrões de nós e arestas alternados.

Encontre todos os caminhos a partir de um nó específico através de um padrão de caminho

A seguinte consulta encontra todas as transferências para uma conta iniciadas a partir de uma conta pertencente a Person com id igual a 2.

Cada resultado com correspondência representa um caminho de Person {id: 2} através de um Account ligado usando a aresta Owns, para outro Account usando a aresta Transfers.

GRAPH FinGraph
MATCH
  (p:Person {id: 2})-[:Owns]->(account:Account)-[t:Transfers]->
  (to_account:Account)
RETURN
  p.id AS sender_id, account.id AS from_id, to_account.id AS to_id;

Seguem-se os resultados da consulta:

sender_id from_id to_id
2 20 7
2 20 16

Padrões de caminhos quantificados

Um padrão quantificado repete um padrão dentro de um intervalo especificado.

Faça corresponder um padrão de arestas quantificado

Para encontrar caminhos de um comprimento variável, pode aplicar um quantificador a um padrão de aresta. A consulta seguinte demonstra isto ao encontrar contas de destino que estão a uma a três transferências de distância de uma origem Account com um id de 7.

A consulta aplica o quantificador {1, 3} ao padrão de aresta -[e:Transfers]->. Isto indica à consulta que faça corresponder caminhos que repetem o padrão de arestas Transfers uma, duas ou três vezes. A cláusula WHERE é usada para excluir a conta de origem dos resultados. A função ARRAY_LENGTH é usada para aceder ao group variable e. Para mais informações, consulte a variável do grupo de acesso.

GRAPH FinGraph
MATCH (src:Account {id: 7})-[e:Transfers]->{1, 3}(dst:Account)
WHERE src != dst
RETURN src.id AS src_account_id, ARRAY_LENGTH(e) AS path_length, dst.id AS dst_account_id;

Seguem-se os resultados da consulta:

src_account_id path_length dst_account_id
7 1 16
7 1 16
7 1 16
7 3 16
7 3 16
7 2 20
7 2 20

Algumas linhas nos resultados são repetidas. Isto acontece porque podem existir vários caminhos que correspondem ao padrão entre os mesmos nós de origem e de destino, e a consulta devolve todos eles.

Faça corresponder um padrão de caminho quantificado

A seguinte consulta encontra caminhos entre nós Account com um a dois Transfers limites através de contas intermédias que estão bloqueadas.

O padrão do caminho entre parênteses é quantificado e a respetiva cláusula WHERE especifica condições para o padrão repetido.

GRAPH FinGraph
MATCH
  (src:Account)
  ((a:Account)-[:Transfers]->(b:Account {is_blocked:true}) WHERE a != b){1,2}
    -[:Transfers]->(dst:Account)
RETURN src.id AS src_account_id, dst.id AS dst_account_id;

Seguem-se os resultados da consulta:

src_account_id dst_account_id
7 20
7 20
20 20

Variáveis de grupo

Uma variável de padrão de gráfico declarada num padrão quantificado torna-se uma variável de grupo quando acedida fora desse padrão. Em seguida, associa-se a uma matriz de elementos gráficos correspondentes.

Pode aceder a uma variável de grupo como uma matriz. Os elementos do gráfico são preservados pela ordem da respetiva apresentação ao longo dos caminhos correspondentes. Pode agregar uma variável de grupo usando a agregação horizontal.

Variável do grupo de acesso

No exemplo seguinte, a variável e é acedida da seguinte forma:

  • Uma variável de padrão de gráfico associada a uma única aresta na cláusula WHERE e.amount > 100 quando está no padrão quantificado.
  • Uma variável de grupo associada a uma matriz de elementos de aresta em ARRAY_LENGTH(e) na declaração RETURN quando está fora do padrão quantificado.
  • Uma variável de grupo associada a uma matriz de elementos de aresta, que é agregada por SUM(e.amount) fora do padrão quantificado. Este é um exemplo de agregação horizontal.
GRAPH FinGraph
MATCH
  (src:Account {id: 7})-[e:Transfers WHERE e.amount > 100]->{0,2}
  (dst:Account)
WHERE src.id != dst.id
LET total_amount = SUM(e.amount)
RETURN
  src.id AS src_account_id, ARRAY_LENGTH(e) AS path_length,
  total_amount, dst.id AS dst_account_id;

Seguem-se os resultados da consulta:

src_account_id path_length total_amount dst_account_id
7 1 300 16
7 2 600 20

Prefixos de pesquisa de caminhos

Para limitar os caminhos correspondentes em grupos que partilham nós de origem e destino, pode usar o ANY ou o ANY SHORTEST caminho prefixo de pesquisa. Só pode aplicar estes prefixos antes de um padrão de caminho completo e não os pode aplicar entre parênteses.

Encontre correspondências com ANY

A seguinte consulta encontra todas as contas únicas acessíveis que estão a um ou dois nós de distância de um determinado nó AccountTransfers.

O prefixo de pesquisa de caminho ANY garante que a consulta devolve apenas um caminho entre um par único de nós src e dst Account. No exemplo seguinte, embora possa alcançar o nó Account com {id: 16} em dois caminhos diferentes a partir do nó Account de origem, a consulta devolve apenas um caminho.

GRAPH FinGraph
MATCH ANY (src:Account {id: 7})-[e:Transfers]->{1,2}(dst:Account)
LET ids_in_path = ARRAY_CONCAT(ARRAY_AGG(e.Id), [dst.Id])
RETURN src.id AS src_account_id, dst.id AS dst_account_id, ids_in_path;

Seguem-se os resultados da consulta:

src_account_id dst_account_id ids_in_path
7 16 7,16
7 20 7,16,20

Padrões de gráficos

Um padrão de gráfico consiste num ou mais padrões de caminho, separados por uma vírgula (,). Os padrões de gráfico podem conter uma cláusula WHERE, que lhe permite aceder a todas as variáveis de padrão de gráfico nos padrões de caminho para formar condições de filtragem. Cada padrão de caminho gera uma coleção de caminhos.

Encontre correspondências com um padrão de gráfico

A seguinte consulta identifica contas intermediárias e os respetivos proprietários envolvidos em valores de transações superiores a 200, através dos quais os fundos são transferidos de uma conta de origem para uma conta bloqueada.

Os seguintes padrões de caminho formam o padrão do gráfico:

  • O primeiro padrão encontra caminhos em que a transferência ocorre de uma conta para uma conta bloqueada através de uma conta intermédia.
  • O segundo padrão encontra caminhos de uma conta para a pessoa proprietária.

A variável interm funciona como uma ligação comum entre os dois padrões de caminho, o que requer que interm faça referência ao mesmo nó de elemento em ambos os padrões de caminho. Isto cria uma operação de junção igual com base na variável interm.

GRAPH FinGraph
MATCH
  (src:Account)-[t1:Transfers]->(interm:Account)-[t2:Transfers]->(dst:Account),
  (interm)<-[:Owns]-(p:Person)
WHERE dst.is_blocked = TRUE AND t1.amount > 200 AND t2.amount > 200
RETURN
  src.id AS src_account_id, dst.id AS dst_account_id,
  interm.id AS interm_account_id, p.id AS owner_id;

Seguem-se os resultados da consulta:

src_account_id dst_account_id interm_account_id owner_id
20 16 7 1

Instruções de consulta lineares

Pode encadear várias declarações de gráficos para formar uma declaração de consulta linear. As declarações são executadas pela mesma ordem em que aparecem na consulta.

  • Cada declaração usa o resultado da declaração anterior como entrada. A entrada está vazia para a primeira declaração.

  • A saída da última declaração é o resultado final.

Por exemplo, pode usar declarações de consultas lineares para encontrar a transferência máxima para uma conta bloqueada. A seguinte consulta encontra a conta e o respetivo proprietário com a transferência de saída mais elevada para uma conta bloqueada.

GRAPH FinGraph
MATCH (src_account:Account)-[transfer:Transfers]->(dst_account:Account {is_blocked:true})
ORDER BY transfer.amount DESC
LIMIT 1
MATCH (src_account:Account)<-[owns:Owns]-(owner:Person)
RETURN src_account.id AS account_id, owner.name AS owner_name;

A tabela seguinte ilustra este processo mostrando os resultados intermédios transmitidos entre cada declaração. Para simplificar, apenas são apresentadas algumas propriedades.

Extracto Resultado intermédio (abreviado)
MATCH
  (src_account:Account)
    -[transfer:Transfers]->
  (dst_account:Account {is_blocked:true})
src_account transferência dst_account
{id: 7} {amount: 300.0} {id: 16, is_blocked: true}
{id: 7} {amount: 100.0} {id: 16, is_blocked: true}
{id: 20} {amount: 200.0} {id: 16, is_blocked: true}

ORDER BY transfer.amount DESC
src_account transferência dst_account
{id: 7} {amount: 300.0} {id: 16, is_blocked: true}
{id: 20} {amount: 200.0} {id: 16, is_blocked: true}
{id: 7} {amount: 100.0} {id: 16, is_blocked: true}

LIMIT 1
src_account transferência dst_account
{id: 7} {amount: 300.0} {id: 16, is_blocked: true}

MATCH
  (src_account:Account)
    <-[owns:Owns]-
  (owner:Person)
src_account transferência dst_account é proprietário proprietário
{id: 7} {amount: 300.0} {id: 16, is_blocked: true} {person_id: 1, account_id: 7} {id: 1, name: Alex}
RETURN
  src_account.id AS account_id,
  owner.name AS owner_name
        
account_id owner_name
7 Alex

Seguem-se os resultados da consulta:

account_id owner_name
7 Alex

Instrução return

A declaração RETURN especifica o que devolver dos padrões correspondentes. Pode aceder a variáveis de padrão de grafos e incluir expressões e outras cláusulas, como ORDER BY e GROUP BY.

O Spanner Graph não suporta a devolução de elementos do gráfico como resultados da consulta. Para devolver o elemento do gráfico completo, use a função TO_JSON ou a função SAFE_TO_JSON. Destas duas funções, recomendamos que use SAFE_TO_JSON.

Devolver elementos do gráfico como JSON

GRAPH FinGraph
MATCH (n:Account {id: 7})
-- Returning a graph element in the final results is NOT allowed. Instead, use
-- the TO_JSON function or explicitly return the graph element's properties.
RETURN TO_JSON(n) AS n;
GRAPH FinGraph
MATCH (n:Account {id: 7})
-- Certain fields in the graph elements, such as TOKENLIST, can't be returned
-- in the TO_JSON function. In those cases, use the SAFE_TO_JSON function instead.
RETURN SAFE_TO_JSON(n) AS n;

Seguem-se os resultados da consulta:

n
{"identifier":"mUZpbkdyYXBoLkFjY291bnQAeJEO","kind":"node","labels":["Account"],"properties":{"create_time":"2020-01-10T14:22:20.222Z","id":7,"is_blocked":false,"nick_name":"Vacation Fund"}}

Compor consultas maiores com a palavra-chave NEXT

Pode encadear várias declarações de consulta linear de grafos usando a palavra-chave NEXT. A primeira declaração recebe uma entrada vazia e a saída de cada declaração subsequente torna-se a entrada para a seguinte.

O exemplo seguinte encontra o proprietário da conta com o maior número de transferências recebidas encadeando várias declarações lineares de gráficos. Pode usar a mesma variável, por exemplo, account, para se referir ao mesmo elemento do gráfico em várias declarações lineares.

GRAPH FinGraph
MATCH (:Account)-[:Transfers]->(account:Account)
RETURN account, COUNT(*) AS num_incoming_transfers
GROUP BY account
ORDER BY num_incoming_transfers DESC
LIMIT 1

NEXT

MATCH (account:Account)<-[:Owns]-(owner:Person)
RETURN account.id AS account_id, owner.name AS owner_name, num_incoming_transfers;

Seguem-se os resultados da consulta:

account_id owner_name num_incoming_transfers
16 Lee 3

Funções e expressões

Pode usar todas as funções do GoogleSQL (funções agregadas e escalares), os operadores e as expressões condicionais nas consultas de gráficos do Spanner. O Spanner Graph também suporta funções e operadores específicos de gráficos.

Funções e operadores incorporados

As seguintes funções e operadores são usados no GQL:

  • PROPERTY_EXISTS(n, birthday): devolve se n tem a propriedade birthday.
  • LABELS(n): devolve as etiquetas de n, conforme definido no esquema do gráfico.
  • PROPERTY_NAMES(n): devolve os nomes das propriedades de n.
  • TO_JSON(n): devolve n no formato JSON. Para mais informações, consulte a função TO_JSON.

O predicado PROPERTY_EXISTS, a função LABELS e a função TO_JSON, bem como outras funções integradas, como ARRAY_AGG e CONCAT.

GRAPH FinGraph
MATCH (person:Person)-[:Owns]->(account:Account)
RETURN person, ARRAY_AGG(account.nick_name) AS accounts
GROUP BY person

NEXT

RETURN
  LABELS(person) AS labels,
  TO_JSON(person) AS person,
  accounts,
  CONCAT(person.city, ", ", person.country) AS location,
  PROPERTY_EXISTS(person, is_blocked) AS is_blocked_property_exists,
  PROPERTY_EXISTS(person, name) AS name_property_exists
LIMIT 1;

Seguem-se os resultados da consulta:

is_blocked_property_exists name_property_exists etiquetas contas localização pessoa
false true Person ["Vacation Fund"] Adelaide, Australia {"identifier":"mUZpbkdyYXBoLlBlcnNvbgB4kQI=","kind":"node","labels":["Person"],"properties":{"birthday":"1991-12-21T08:00:00Z","city":"Adelaide","country":"Australia","id":1,"name":"Alex"}}

Subconsultas

Uma subconsulta é uma consulta aninhada noutra consulta. As seguintes listas regras de subconsulta do Spanner Graph:

  • Uma subconsulta está entre um par de chavetas {}.
  • Uma subconsulta pode começar com a cláusula GRAPH inicial para especificar o gráfico no âmbito. O gráfico especificado não tem de ser o mesmo que o usado na consulta externa.
  • Quando a cláusula GRAPH é omitida na subconsulta, ocorre o seguinte:
    • O gráfico no âmbito é inferido a partir do contexto de consulta externo mais próximo.
    • A subconsulta tem de começar com uma declaração de correspondência de padrões de grafos com MATCH.
  • Não é possível declarar novamente uma variável de padrão de gráfico declarada fora do âmbito da subconsulta, mas pode ser referida em expressões ou funções dentro da subconsulta.

Use uma subconsulta para encontrar o número total de transferências de cada conta

A consulta seguinte ilustra a utilização da subconsulta VALUE. A subconsulta está entre chavetas {} precedidas pela palavra-chave VALUE. A consulta devolve o número total de transferências iniciadas a partir de uma conta.

GRAPH FinGraph
MATCH (p:Person)-[:Owns]->(account:Account)
RETURN p.name, account.id AS account_id, VALUE {
  MATCH (a:Account)-[transfer:Transfers]->(:Account)
  WHERE a = account
  RETURN COUNT(transfer) AS num_transfers
} AS num_transfers;

Seguem-se os resultados da consulta:

nome account_id num_transfers
Alex 7 2
Dana 20 2
Lee 16 1

Para ver uma lista das expressões de subconsulta suportadas, consulte o artigo Subconsultas do Spanner Graph.

Use uma subconsulta para encontrar contas pertencentes a cada pessoa

A consulta seguinte usa a declaração CALL com uma subconsulta inline. A declaração MATCH (p:Person) cria uma tabela com uma única coluna denominada p. Cada linha desta tabela contém um nó Person. A declaração CALL (p) executa a subconsulta incluída para cada linha nesta tabela de trabalho. A subconsulta encontra contas pertencentes a cada pessoa correspondente p. As várias contas da mesma pessoa são ordenadas por ID da conta.

O exemplo declara a variável de nó de âmbito externo p da cláusula MATCH (p:Person). A declaração CALL (p) faz referência a esta variável. Esta declaração permite-lhe redeclarar ou declarar várias vezes a variável de nó num padrão de caminho da subconsulta. Isto garante que as variáveis do nó pinteriorPerson e pexteriorPerson se associam ao mesmo nó Person no gráfico. Se a declaração CALL não declarar a variável de nó p, a subconsulta trata a variável p novamente declarada como uma nova variável. Esta nova variável é independente da variável de âmbito externo e a subconsulta não a declara várias vezes porque devolve resultados diferentes. Para mais informações, consulte a CALL declaração.

GRAPH FinGraph
MATCH (p:Person)
CALL (p) {
  MATCH (p)-[:Owns]->(a:Account)
  RETURN a.Id AS account_Id
  ORDER BY account_Id
}
RETURN p.name AS person_name, account_Id
ORDER BY person_name, account_Id;

Resultado

person_name account_Id
Alex 7
Dana 20
Lee 16

Parâmetros de consulta

Pode consultar o Spanner Graph com parâmetros. Para mais informações, consulte a sintaxe e saiba como consultar dados com parâmetros nas bibliotecas de cliente do Spanner.

A consulta seguinte ilustra a utilização de parâmetros de consulta.

GRAPH FinGraph
MATCH (person:Person {id: @id})
RETURN person.name;

Consultar gráficos e tabelas em conjunto

Pode usar consultas de gráficos em conjunto com SQL para aceder a informações dos seus gráficos e tabelas numa única declaração.

O operador GRAPH_TABLE recebe uma consulta de gráfico linear e devolve o respetivo resultado num formato tabular que pode ser integrado numa consulta SQL. Esta interoperabilidade permite-lhe enriquecer os resultados das consultas de grafos com conteúdo não gráfico e vice-versa.

Por exemplo, pode criar uma tabela CreditReports e inserir alguns relatórios de crédito, como mostrado no exemplo seguinte:

CREATE TABLE CreditReports (
  person_id     INT64 NOT NULL,
  create_time   TIMESTAMP NOT NULL,
  score         INT64 NOT NULL,
) PRIMARY KEY (person_id, create_time);
INSERT INTO CreditReports (person_id, create_time, score)
VALUES
  (1,"2020-01-10 06:22:20.222", 700),
  (2,"2020-02-10 06:22:20.222", 800),
  (3,"2020-03-10 06:22:20.222", 750);

Em seguida, pode identificar pessoas específicas através da correspondência de padrões de grafos em GRAPH_TABLE e juntar os resultados da consulta de grafos com a tabela CreditReports para obter classificações de crédito.

SELECT
  gt.person.id,
  credit.score AS latest_credit_score
FROM GRAPH_TABLE(
  FinGraph
  MATCH (person:Person)-[:Owns]->(:Account)-[:Transfers]->(account:Account {is_blocked:true})
  RETURN DISTINCT person
) AS gt
JOIN CreditReports AS credit
  ON gt.person.id = credit.person_id
ORDER BY credit.create_time;

Seguem-se os resultados da consulta:

person_id latest_credit_score
1 700
2 800

O que se segue?

Saiba mais sobre as práticas recomendadas para otimizar consultas.