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:
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.
Na Google Cloud consola, aceda à página Instâncias do Spanner.
Clique na instância com o nome
test-instance.Em Bases de dados, clique na base de dados com o nome
example-db.Abra o Spanner Studio e, de seguida, clique em Novo separador ou use o separador do editor.
Introduza uma consulta no editor de consultas.
Clique em Executar.
CLI gcloud
Para enviar consultas através da ferramenta de linhas de comando da CLI gcloud, faça o seguinte:
Se ainda não estiver instalada, instale a CLI gcloud.
Na CLI gcloud, execute o seguinte comando:
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:
- Consultar com a biblioteca cliente C++ do Spanner
- Consultar com a biblioteca cliente C# do Spanner
- Consultar através da biblioteca cliente Go do Spanner
- Consultar com a biblioteca cliente Java do Spanner
- Consultar através da biblioteca cliente Node.js do Spanner
- Consultar com a biblioteca cliente PHP do Spanner
- Consultar com a biblioteca cliente Python do Spanner
- Consultar através da biblioteca cliente Ruby do Spanner
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.
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
Accounttêm a propriedadecreate_time, mas não têm a propriedadebirthday. A propriedadebirthdayéNULLpara estes nós. - Os nós que correspondem à etiqueta
Persontêm a propriedadebirthday, mas não têm a propriedadecreate_time. A propriedadecreate_timeéNULLpara 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
WHEREe.amount > 100quando está no padrão quantificado. - Uma variável de grupo associada a uma matriz de elementos de aresta em
ARRAY_LENGTH(e)na declaraçãoRETURNquando 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})
|
|
||||||||||||
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
|
|
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 sentem a propriedadebirthday.LABELS(n): devolve as etiquetas den, conforme definido no esquema do gráfico.PROPERTY_NAMES(n): devolve os nomes das propriedades den.TO_JSON(n): devolvenno formato JSON. Para mais informações, consulte a funçãoTO_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
GRAPHinicial 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.