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;