Práticas recomendadas para ajustar consultas do gráfico do Spanner

Este documento descreve as práticas recomendadas para ajustar o desempenho da consulta do Spanner Graph, incluindo as seguintes otimizações:

  • Evite uma verificação completa da tabela de entrada para nós e arestas.
  • Reduza a quantidade de dados que a consulta precisa ler do armazenamento.
  • Reduzir o tamanho dos dados intermediários.

Começar com nós de cardinalidade mais baixa

Escreva o caminho de acesso para que ele comece com os nós de cardinalidade mais baixos. Essa abordagem mantém o conjunto de resultados intermediários pequeno e acelera a consulta execução.

Por exemplo, as consultas a seguir têm a mesma semântica:

  • Transposição de borda para frente:

    GRAPH FinGraph
    MATCH (p:Person)-[:Owns]->(a:Account)
    WHERE p.name = "Alex"
      AND a.is_blocked
    RETURN p.id AS person_id, a.id AS account_id;
    
  • Travessia de arestas reversa:

    GRAPH FinGraph
    MATCH (a:Account)<-[:Owns]-(p:Person)
    WHERE p.name = "Alex"
      AND a.is_blocked
    RETURN p.id AS person_id, a.id AS account_id;
    

Supondo que há menos pessoas com o nome Alex do que contas bloqueadas, recomendamos que você escreva essa consulta daqui para travessia de arestas.

Começar pelos nós de cardinalidade mais baixa é especialmente importante para travessia de caminhos de comprimento variável. O exemplo a seguir mostra a maneira recomendada de encontrar contas que são transferidas transitivamente de uma determinada conta em até três saltos.

GRAPH FinGraph
MATCH (:Account {id: 7})-[:Transfers]->{1,3}(a:Account)
RETURN a.id;

Especificar todos os rótulos por padrão

O Spanner Graph infere os nós qualificados e os rótulos de aresta se os rótulos forem omitidos. Recomendamos que você especifique rótulos para todos os nós e arestas sempre que possível, porque essa inferência nem sempre é possível e pode fazer com que mais rótulos do que o necessário sejam digitalizados.

Instrução MATCH única

O exemplo a seguir encontra contas vinculadas por no máximo três transferências da conta específica:

GRAPH FinGraph
MATCH (src:Account {id: 7})-[:Transfers]->{1,3}(dst:Account)
RETURN dst.id;

Em instruções MATCH

Especifique rótulos em nós e arestas quando eles se referem ao mesmo elemento, mas estão em instruções MATCH.

O exemplo a seguir mostra essa abordagem recomendada:

GRAPH FinGraph
MATCH (acct:Account {id: 7})-[:Transfers]->{1,3}(other_acct:Account)
RETURN acct, COUNT(DISTINCT other_acct) AS related_accts
GROUP BY acct

NEXT

MATCH (acct:Account)<-[:Owns]-(p:Person)
RETURN p.id AS person, acct.id AS acct, related_accts;

A seguir