Prácticas recomendadas para optimizar las consultas de gráficos de Spanner

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

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

Empezar por los nodos de menor cardinalidad

Escribe el recorrido de la ruta de forma que empiece por los nodos de menor cardinalidad. Este enfoque mantiene el conjunto de resultados intermedio pequeño y acelera la ejecución de las consultas.

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

  • Recorrido de los bordes hacia delante:

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

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

Si hay menos personas con el nombre Alex que cuentas bloqueadas, te recomendamos que escribas esta consulta en el recorrido de borde hacia delante.

Empezar por nodos de cardinalidad inferior es especialmente importante para el recorrido de rutas de longitud variable. En el siguiente ejemplo se muestra la forma recomendada de encontrar cuentas que estén a tres transferencias de una cuenta determinada.

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

Especificar todas las etiquetas de forma predeterminada

Spanner Graph infiere los nodos y las etiquetas de aristas que cumplen los requisitos si se omiten las etiquetas. Te recomendamos que especifiques etiquetas para todos los nodos y aristas siempre que sea posible, ya que esta inferencia no siempre se puede realizar y puede provocar que se analicen más etiquetas de las necesarias.

Una sola instrucción MATCH

En el siguiente ejemplo se buscan cuentas vinculadas por un máximo de 3 transferencias desde la cuenta indicada:

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

En las instrucciones MATCH

Especifica etiquetas en nodos y aristas cuando hagan referencia al mismo elemento, pero estén en MATCH diferentes.

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;

Siguientes pasos