2013-03-15 6 views
5

Ich versuchte das Beispiel gegeben here nach einigen kleineren Änderungen - hauptsächlich habe ich eine Where-Klausel ohne eine Übereinstimmung - für den experimentellen Zweck.Neo4j Chiffre Abfrage langsame Leistung

Auf meinem System (1.9.M04 - java 6u43 - ubuntu 12.04 - AMD Phenom II 1090T -X6) die einfache Abfrage

Mit nur 1 Knoten in der Datenbank (embedded auch) nahm 262 ms. Offensichtlich geht etwas schief. Was könnte das Problem sein?

Dank

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

es ist nur die Neo4j Bootstrapping Overhead Vielleicht sollten Sie versuchen, die Abfrage mehrmals zu wiederholen, in diesem Fall denke ich, die Ausführungszeit deutlich niedriger sein sollte . – remigio

+0

versuchen Sie zuerst, die Caches aufzuwärmen. führe diesen Befehl einige Male aus: 'start n = node (*) return count (n); starte r = rel (*) return count (r)'. Zweitens, wie misst man die Zeit? Ist es die Zeit, die durch die Ausgabe der Chiffre oder einfach die Zeit vor und nach der spezifischen Codezeile angegeben wird? Im zweiten Fall könnte die Latenz zwischen Ihrer App und dem Server liegen. – ulkas

+0

Ok, wie verhält es sich? - Ich habe die Zeit der zweiten Abfrage nur gemessen (die erste Ausführung würde das interne Caching etc. initialisieren). Aber hier ist es anders. es ist die dritte Ausführung, es dauert wesentlich weniger Zeit. Ich bekomme nicht das Besondere an der 3. Ausführung für dieselbe Abfrage. Remigio Danke für den Tipp, Ulkas, ich verwende es im Embedded-Modus – Shilu

Antwort

0

Sie wollen wahrscheinlich Ihren Namen Eigenschaft Index (siehe indexing). Danach könnte man wie folgt abfragen:

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

Lookup up Knoten über den Index wird viel schneller sein als Filterung über eine WHERE-Klausel.

+0

ja ich weiß das. Die Abfrage dient nur zu Versuchszwecken - um zu sehen, wie sie sich verhält. – Shilu

+0

Hallo @tstorms, ich habe ähnliches Problem mit neo4j. Ich habe einen Knoten mit Index erstellt und ihn mit Relationen verbunden. Jetzt, als ich versuchte, gegenseitiges Zählen zu bekommen, läuft es sehr langsam. Meine Abfrage dauerte fast 2-3 Sekunden, um etwa 150 Datensätze von neo4j zu holen. –