Práticas recomendadas para otimizar as consultas do Spanner Graph

Este documento descreve as práticas recomendadas para otimizar o desempenho das consultas do Spanner Graph, que incluem as seguintes otimizações:

  • Evite uma análise completa da tabela de entrada para nós e arestas.
  • Reduzir a quantidade de dados que a consulta tem de ler do armazenamento.
  • Reduza o tamanho dos dados intermédios.

Comece por nós de cardinalidade inferior

Escreva o percurso do caminho para que comece pelos nós de cardinalidade inferior. Esta abordagem mantém o conjunto de resultados intermédios pequeno e acelera a execução da consulta.

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

  • Deslocamento de arestas para a frente:

    GRAPH FinGraph
    MATCH (p:Person {name:"Alex"})-[:Owns]->(a:Account {is_blocked: true})
    RETURN p.id AS person_id, a.id AS account_id;
    
  • Inversão da travessia de arestas:

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

Partindo do princípio de que existem menos pessoas com o nome Alex do que contas bloqueadas, recomendamos que escreva esta consulta na travessia de arestas para a frente.

Começar por nós de cardinalidade inferior é especialmente importante para a travessia de caminhos de comprimento variável. O exemplo seguinte mostra a forma recomendada de encontrar contas que estão a três transferências de uma determinada conta.

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

Especificar todas as etiquetas por predefinição

O gráfico do Spanner infere os nós e as etiquetas de arestas elegíveis se as etiquetas forem omitidas. Recomendamos que especifique etiquetas para todos os nós e arestas, sempre que possível, porque esta inferência pode nem sempre ser possível e pode fazer com que sejam analisadas mais etiquetas do que o necessário.

Declaração MATCH única

O exemplo seguinte encontra contas associadas por, no máximo, 3 transferências da conta especificada:

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

Em declarações CORRESP

Especifique etiquetas em nós e arestas quando se referem ao mesmo elemento, mas estão em declarações MATCH.

O exemplo seguinte mostra esta 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;

O que se segue?