2013-03-15 15 views
5

Ho provato l'esempio dato here dopo alcune piccole modifiche - principalmente ho aggiunto una clausola where senza una corrispondenza - a scopo sperimentale.Neo4j query Cypher prestazione lenta

Sul mio sistema (1.9.M04 - java 6u43 - Ubuntu 12.04 - AMD Phenom II -X6 1090T) la semplice interrogazione

Con solo 1 nodo nel database (anche incorporato) ha preso 262 ms. Ovviamente qualcosa sta andando storto. Quale potrebbe essere il problema ?

Grazie

public void test() 
    { 
     GraphDatabaseService db = g = new GraphDatabaseFactory().newEmbeddedDatabase("./neo4j1test"); 

     long id; 
     Transaction tx = db.beginTx(); 
     try 
     { 
      Node refNode = db.createNode(); 
      id = refNode.getId(); 
      refNode.setProperty("name", "reference node"); 
      tx.success(); 
     } 
     finally 
     { 
      tx.finish(); 
     } 


     ExecutionEngine engine = new ExecutionEngine(db); 
     ExecutionResult result = engine.execute("start n=node("+id+") where (n.name = \"reference node\") return n.name"); 
     long time = System.currentTimeMillis(); 
     result = engine.execute("start n=node("+id+") where (n.name = \"reference node\") return n.name"); 
     time = (System.currentTimeMillis() - time); 
     System.out.println("Time taken : " + time + " ms."); 
    } 
+0

forse è solo l'overhead Neo4j bootstrap, si dovrebbe cercare di ripetere la query più volte, in questo caso credo che il tempo di esecuzione dovrebbe essere significativamente inferiore . – remigio

+0

prima prova a riscaldare le cache. eseguire questo comando alcune volte: 'start n = node (*) return count (n); start r = rel (*) return count (r)'. secondo, come si misura il tempo? è il tempo dato dall'output cifrato o semplicemente il tempo prima e dopo la specifica linea di codice? nel secondo caso la latenza potrebbe essere tra la tua app e il server – ulkas

+0

Ok ecco come si comporta - Già ho misurato il tempo della seconda esecuzione della query solo (aspettandosi che la prima esecuzione inizializzasse la cache interna ecc ..). Ma qui è diverso. è la terza esecuzione in poi ci vuole molto meno tempo. Non riesco a ottenere ciò che è speciale della 3a esecuzione per la stessa query. remigio grazie per il suggerimento, ulkas, lo sto usando in modalità incorporata – Shilu

risposta

0

Probabilmente si desidera indicizzare il tuo proprietà name (vedi indexing). Dopo di che, si potrebbe query come questa:

START n=node:your_index_name("name:the_indexed_name") RETURN n; 

ricerca diretta su nodi attraverso l'indice sarà molto più veloce di filtraggio tramite una clausola WHERE.

+0

sì, lo so. la query è solo a scopo sperimentale - per vedere come si comporta. – Shilu

+0

Ciao @tstorms, ho un problema simile con neo4j. Ho creato un nodo con indice e l'ho collegato con le relazioni. Ora, quando ho cercato di ottenere il conteggio reciproco, si sta comportando molto lentamente. La mia richiesta ha richiesto circa 2-3 secondi per recuperare circa 150 record da neo4j. –

Problemi correlati