Saltar al contenido

¿Por qué neo4j advierte: “Esta consulta crea un producto cartesiano entre patrones desconectados”?

Hacemos una revisión completa cada enunciado de nuestra página web con la meta de mostrarte siempre información con la mayor veracidad y actual.

Solución:

El navegador te dice que:

  1. Está manejando su consulta haciendo una comparación entre cada Gene instancia y cada Chromosome instancia. Si su base de datos tiene G genes y C cromosomas, entonces la complejidad de la consulta es O(GC). Por ejemplo, si estamos trabajando con el genoma humano, hay 46 cromosomas y tal vez 25000 genes, entonces el DB tendría que hacer 1150000 comparaciones
  2. Es posible que pueda mejorar la complejidad (y el rendimiento) modificando su consulta. Por ejemplo, si creamos un índice en :Gene(chromosomeID)y modificó la consulta para que inicialmente coincidiéramos solo en el nodo con la cardinalidad más pequeña (los 46 cromosomas), solo haríamos O(G) (o 25000) “comparaciones”, ¡y esas comparaciones en realidad serían búsquedas rápidas en el índice! Este enfoque debería ser mucho más rápido.

    Una vez que hemos creado el índice, podemos usar esta consulta:

    MATCH (c:Chromosome)
    WITH c
    MATCH (g:Gene) 
    WHERE g.chromosomeID = c.chromosomeID
    CREATE (g)-[:PART_OF]->(c);
    

    utiliza un WITH cláusula para obligar a la primera MATCH cláusula a ejecutar primero, evitando el producto cartesiano. El segundo MATCH (y WHERE) utiliza los resultados de la primera MATCH cláusula y el índice para obtener rápidamente los genes exactos que pertenecen a cada cromosoma.

[UPDATE]

los WITH La cláusula fue útil cuando esta respuesta se escribió originalmente. El planificador Cypher en versiones más nuevas de neo4j (como 4.0.3) ahora genera el mismo plan incluso si el WITH se omite, y sin crear un producto cartesiano. Siempre puede PERFIL ambas versiones de su consulta para ver el efecto con/sin el WITH.

Como logisima menciona en los comentarios, esto es solo una advertencia. Hacer coincidir un producto cartesiano es lento. En su caso, debería estar bien ya que desea conectarse previamente desconectado Gene y Chromosome nodos y conoce el tamaño del producto cartesiano. No hay demasiados cromosomas y un pequeño número de genes. Si tú pudieras MATCH por ejemplo, genes en proteínas, la consulta podría fallar.

Creo que la advertencia está destinada a otras consultas problemáticas:

  • si tu MATCH un producto cartesiano pero no sabes si hay una relación que podrías usar OPTIONAL MATCH
  • si quieres MATCH tanto un Gene y un Chromosome sin ninguna relación, debe dividir la consulta

En caso de que su consulta tarde demasiado o no finalice, aquí hay otra pregunta que brinda algunos consejos sobre cómo optimizar los productos cartesianos: Cómo optimizar las consultas Neo4j Cypher con coincidencias de múltiples nodos (producto cartesiano)

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *