Ho un grafico con un nodo che ha molte relazioni in uscita. Il tempo necessario per aggiungere nuove relazioni in uscita si riduce quando aggiungo più relazioni. Il degrado sembra essere dovuto al tempo impiegato per verificare che la relazione non sia già esistente (sto usando MERGE per aggiungere le relazioni).Come posso ottimizzare una query MERGE Neo4j su un nodo con molte relazioni?
I nodi di destinazione delle relazioni hanno pochissime relazioni. Esiste un modo per forzare Neo4j a verificare l'esistenza della relazione dal nodo di destinazione anziché dal nodo di origine?
Ecco lo script di test per riprodurre il problema. Crea un nodo con ID 0 seguito da 1000 nodi connessi al nodo 0 dalla relazione HAS
. All'aggiunta dei nodi, il tempo di esecuzione aumenta in modo lineare.
CREATE CONSTRAINT ON (n:Node) ASSERT n.id IS UNIQUE
UNWIND RANGE(1,1000) AS i
MERGE (from:Node { id: 0 })
MERGE (to:Node { id: i})
MERGE (from)-[:HAS]->to
Aggiunto 1001 etichette, create 1001 nodi, impostare le proprietà 1001, creati 1000 relazioni, istruzione eseguita nel 3496 ms.
UNWIND RANGE(1001,2000) AS i
MERGE (from:Node { id: 0 })
MERGE (to:Node { id: i})
MERGE (from)-[:HAS]->to
Aggiunto 1000 etichette, creato 1000 nodi, impostare le proprietà 1000, ha creato 1000 relazioni, istruzione eseguita nel 7030 ms.
UNWIND RANGE(2001,3000) AS i
MERGE (from:Node { id: 0 })
MERGE (to:Node { id: i})
MERGE (from)-[:HAS]->to
Aggiunto 1000 etichette, creato 1000 nodi, impostare le proprietà 1000, ha creato 1000 relazioni, istruzione eseguita in 10489 ms.
UNWIND RANGE(3001,4000) AS i
MERGE (from:Node { id: 0 })
MERGE (to:Node { id: i})
MERGE (from)-[:HAS]->to
Aggiunto 1000 etichette, creato 1000 nodi, impostare le proprietà 1000, ha creato 1000 relazioni, istruzione eseguita in 14390 ms.
Se si utilizza CREATE
invece di MERGE
, le prestazioni sono decisamente migliori. Non posso usare CREATE
perché voglio assicurarmi che le relazioni siano uniche.
UNWIND RANGE(4001,5000) AS i
MERGE (from:Node { id: 0 })
MERGE (to:Node { id: i})
CREATE (from)-[:HAS]->to
Aggiunto 1000 etichette, create 1000 nodi, impostare le proprietà 1000, creati 1000 relazioni, istruzione eseguita in 413 ms.
Nota: Testato con Neo4j v2.2.2
Grazie, sembra molto promettente. Farò dei test e ti farò sapere come va. – Dave
Ha funzionato? In tal caso, si prega di accettare :) –
Ho provato questo e ci ha dato enormi guadagni in termini di prestazioni. In attesa di quando il pianificatore di query può effettuare automaticamente questa ottimizzazione. Grazie ancora Michael :) – Dave