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:
- Está manejando su consulta haciendo una comparación entre cada
Gene
instancia y cadaChromosome
instancia. Si su base de datos tieneG
genes yC
cromosomas, entonces la complejidad de la consulta esO(GC)
. Por ejemplo, si estamos trabajando con el genoma humano, hay 46 cromosomas y tal vez 25000 genes, entonces el DB tendría que hacer1150000
comparaciones -
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íamosO(G)
(o25000
) “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 primeraMATCH
cláusula a ejecutar primero, evitando el producto cartesiano. El segundoMATCH
(yWHERE
) utiliza los resultados de la primeraMATCH
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 usarOPTIONAL MATCH
- si quieres
MATCH
tanto unGene
y unChromosome
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)