Prácticas recomendadas para ajustar las consultas de grafo de Spanner

En este documento, se describen las prácticas recomendadas para ajustar la consulta de gráficos de Spanner de rendimiento, lo que incluye las siguientes optimizaciones:

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

Comienza desde nodos de menor cardinalidad

Escribe el salto de directorio de modo que comience con los nodos de menor cardinalidad. 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 del borde frontal:

    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;
    

Si suponemos que hay menos personas con el nombre Alex que cuentas bloqueadas, te recomendamos que escribas esta consulta más adelante recorrido perimetral.

Comenzar desde nodos de menor cardinalidad es muy importante de un salto de directorio de longitud variable. En el siguiente ejemplo, se muestra la forma recomendada para encontrar cuentas que se transfieran transitivamente desde una cuenta determinada dentro de tres saltos.

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 etiquetas perimetrales aptos si las etiquetas de recurso. Recomendamos que especifiques etiquetas para todos los nodos y aristas cuando sea posible, ya que esta inferencia no siempre será posible y podría harán que se analicen más etiquetas de las necesarias.

Sentencia MATCH única

En el siguiente ejemplo, se encuentran 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 declaraciones MATCH

Especificar etiquetas en los nodos y en las aristas cuando se refieran al mismo elemento, pero en las 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?