Prácticas recomendadas para ajustar las consultas de Spanner Graph

En este documento, se describen las prácticas recomendadas para ajustar el rendimiento de las consultas de Spanner Graph, que incluyen las siguientes optimizaciones:

  • Evita un análisis completo de la tabla de entrada en busca de nodos y bordes.
  • Reduce la cantidad de datos que la consulta debe leer del almacenamiento.
  • Reduce el tamaño de los datos intermedios.

Comienza desde los nodos de cardinalidad más baja

Escribe la travesía de ruta para que comience con los nodos de cardinalidad más bajos. Este enfoque mantiene el conjunto de resultados intermedios pequeño y acelera la ejecución de la consulta.

Por ejemplo, las siguientes consultas tienen la misma semántica:

  • Recorrido de borde hacia adelante:

    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;
    
  • Recorrido de borde inverso:

    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;
    

Suponiendo que haya menos personas con el nombre Alex que cuentas bloqueadas, te recomendamos que escribas esta consulta en el recorrido de borde hacia adelante.

Comenzar desde nodos de cardinalidad inferior es especialmente importante para el recorrido de ruta de acceso de longitud variable. En el siguiente ejemplo, se muestra la forma recomendada de encontrar cuentas que estén dentro de tres transferencias de una cuenta determinada.

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

Especifica todas las etiquetas de forma predeterminada

Spanner Graph infiere los nodos y las etiquetas de borde que cumplen con los requisitos si se omiten las etiquetas. Te recomendamos que especifiques etiquetas para todos los nodos y bordes siempre que sea posible, ya que es posible que esta inferencia no siempre sea posible y que pueda hacer que se analicen más etiquetas de las necesarias.

Sentencia MATCH única

En el siguiente ejemplo, se encuentran las cuentas vinculadas por un máximo de 3 transferencias desde la cuenta determinada:

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

En varias declaraciones MATCH

Especifica etiquetas en los nodos y los bordes cuando se refieren al mismo elemento, pero se encuentran en sentencias MATCH.

En el siguiente ejemplo, se muestra este enfoque recomendado:

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;

¿Qué sigue?