Práticas recomendadas para consultas de gráficos

Este documento descreve as práticas recomendadas para otimizar as consultas de gráficos do BigQuery.

Iniciar a travessia de caminho de nós de baixa cardinalidade

Para manter os conjuntos de resultados intermediários pequenos e acelerar a execução de consultas, crie consultas de gráficos para que a travessia de caminho comece em nós de cardinalidade mais baixa, independentemente da direção da travessia. As instruções MATCH a seguir usam filtros de propriedade para reduzir o número de nós iniciais possíveis em vez de calcular todas as correspondências e depois filtrar:

MATCH (p:Person {id: 10})-[own:Owns]->(a:Account)
MATCH (a:Account WHERE balance > 10)<-[own:Owns]-(p:Person)

Isso é especialmente importante para consultas de caminho quantificado:

MATCH (p:Person {id: 10})-[own:Owns]->{1,3}(a:Account)

Usar a sintaxe ANY ou ANY SHORTEST para verificações de conectividade

Consultas de caminho quantificado podem retornar caminhos duplicados entre nós de origem e destino. Se o objetivo for verificar a conectividade e você não precisar de todos os caminhos possíveis, use ANY ou ANY SHORTEST para reduzir cálculos redundantes e melhorar a eficiência da pesquisa de caminho. Por exemplo, a instrução MATCH a seguir usa ANY SHORTEST para manter apenas um caminho entre cada par de nós:

MATCH ANY SHORTEST (a1:Account)-[t:Transfers]->{1,3}(a2:Account)

Usar a travessia de caminho direcional

Os esquemas de gráficos do BigQuery são direcionais, o que significa que cada aresta tem um nó de origem e um nó de destino. Embora a sintaxe de consulta de gráficos permita a travessia de caminho em qualquer direção (por exemplo, -[edge]-), nós recomendamos usar a travessia de caminho direcional (por exemplo, -[edge]-> ou <-[edge]-) para melhorar a performance. A travessia de caminho em qualquer direção pode causar perda de performance.

A instrução MATCH a seguir usa a travessia de caminho em qualquer direção:

-- Avoid.
MATCH (a1:Account {id: 7})-[t:Transfers]-(a2:Account)

Em vez disso, combine duas travessias direcionais com UNION ALL:

MATCH (a1:Account {id: 7})-[t:Transfers]->(a2:Account)
...
UNION ALL
...
MATCH (a1:Account  {id: 7})<-[t:Transfers]-(a2:Account)

Especificar rótulos explicitamente

Se os rótulos de nós ou arestas forem omitidos em uma consulta, o BigQuery Graph vai enumerar todos os rótulos de nós e arestas qualificados. Essa enumeração pode fazer com que mais rótulos sejam verificados do que o necessário. Para evitar isso, especifique rótulos para todos os nós e arestas na consulta sempre que possível.

Por exemplo, a consulta a seguir especifica os rótulos Account e Transfers:

GRAPH graph_db.FinGraph
MATCH (a1:Account)-[t:Transfers]->(a2:Account)
RETURN COUNT(*) AS num_transfers;

Evite omitir rótulos, porque isso pode verificar outros relacionamentos desnecessários entre nós. Na consulta a seguir, a1 pode representar uma conta ou uma pessoa, e t pode representar uma transferência ou uma propriedade de conta.

GRAPH graph_db.FinGraph
MATCH (a1)-[t]->(a2)
RETURN COUNT(*) AS num_transfers;

Preferir uma única instrução MATCH

O BigQuery Graph permite incluir várias instruções MATCH em uma única consulta de gráfico. Essas instruções são conectadas por variáveis multideclaradas que representam o mesmo nó ou aresta. No entanto, o uso de várias instruções MATCH pode diminuir os benefícios de cardinalidade entre as instruções. Quando possível, use uma única instrução MATCH para melhorar a performance.

Por exemplo, as consultas a seguir são equivalentes, mas a primeira tem uma performance melhor porque usa uma única instrução MATCH:

-- Preferred syntax.
GRAPH graph_db.FinGraph
MATCH
  (p:Person {id: 1})-[o:Owns]->
  (a:Account)-[t:Transfers]->(a2:Account)
RETURN o.account_id, t.amount;
-- Avoid this syntax.
GRAPH graph_db.FinGraph
MATCH (p:Person {id: 1})-[o:Owns]->(a:Account)
MATCH (a:Account)-[t:Transfers]->(a2:Account)
RETURN o.account_id, t.amount;

Limitar arestas percorridas de nós de alta cardinalidade

Ao consultar gráficos, alguns nós podem ter um número significativamente maior de arestas de entrada ou saída em comparação com outros nós. Esses nós de alta cardinalidade às vezes são chamados de supernós ou nós de hub. Os supernós podem causar problemas de performance porque as travessias por eles podem envolver o processamento de grandes quantidades de dados, o que leva à distorção de dados e a longos tempos de execução.

Para otimizar uma consulta de um gráfico com supernós, use a ROW_NUMBER() função em uma FILTER cláusula ou WHERE cláusula em MATCH para limitar o número de arestas que a consulta percorre de ou para um nó. Essa técnica é particularmente útil quando você não precisa de uma enumeração completa de todas as conexões de ou para um supernó.

Por exemplo, se algumas contas em FinGraph tiverem um grande número de transações, você poderá usar ROW_NUMBER() para limitar o número de arestas Transfers a serem consideradas para cada Account e evitar uma consulta ineficiente:

GRAPH graph_db.FinGraph
MATCH (a1:Account)-[e1:Transfers WHERE e1 IN {
  GRAPH graph_db.FinGraph
  -- Sample 5 edges per source node
  MATCH -[selected_e:Transfers]->
    FILTER ROW_NUMBER() OVER (
      PARTITION BY SOURCE_NODE_ID(selected_e)) < 5
    RETURN selected_e
}]->{1,3}(a2:Account)
RETURN COUNT(*) AS cnt;

Amostrar nós ou arestas intermediárias em consultas de vários saltos

Também é possível melhorar a eficiência da consulta usando ROW_NUMBER() para amostrar nós intermediários em consultas de vários saltos. Essa técnica melhora a eficiência limitando o número de caminhos que a consulta considera para cada nó intermediário. Para fazer isso, divida uma consulta de vários saltos em várias instruções MATCH separadas por NEXT e aplique ROW_NUMBER() no ponto médio em que você precisa amostrar:

GRAPH graph_db.FinGraph
MATCH (a1:Account)-[e1:Transfers]->(a2:Account)
-- Sample 5 destination nodes per a1 source node
FILTER ROW_NUMBER() OVER (PARTITION BY ELEMENT_ID(a1)) < 5
RETURN a1, a2
NEXT
MATCH (a2)-[e2:Transfers]->(a3:Account)
RETURN a1.id AS src_id, a2.id AS mid_id, a3.id AS dst_id;

A seguir