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

Neste documento, descrevemos as práticas recomendadas para ajustar consultas do gráfico do Spanner. desempenho do produto, que incluem as seguintes otimizações:

  • Evite fazer uma varredura completa na tabela de entrada em busca de nós e bordas.
  • Reduzir a quantidade de dados que a consulta precisa ler do armazenamento.
  • Reduzir o tamanho dos dados intermediários.

Iniciar nos nós de cardinalidade inferior

Escreva a travessia de caminhos de modo que comece com os nós de menor cardinalidade. 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:

  • Travessia 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 tamanho variável. O exemplo a seguir mostra a maneira recomendada para encontrar contas que são transferidas transitivamente de uma determinada conta dentro 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 gráfico do Spanner infere os nós de qualificação e os rótulos de borda se rótulos são omitidos. Recomendamos que você especifique rótulos para todos os nós e bordas sempre que possível, porque essa inferência nem sempre é possível fazer com que mais rótulos do que o necessário sejam verificados.

Instrução MATCH única

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

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

Em instruções MATCH

Especificam rótulos em nós e bordas quando se referirem ao mesmo elemento, mas 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