2016-04-03 1 views
0

Ich versuche, eine große Menge an Daten in Neo4j aus einer Datei einzuführen. Ich benutze node.js code, einfaches JavaScript mit wenig Komplexität.Fehler beim Einführen riesiger Daten in Neo4j von Node.js

Die Sache ist, dass ich 386213 Zeilen oder "Knoten" einzuführen habe, aber wenn ausgeführt (und 3 Stunden warten), sehe ich nur die Hälfte mehr. Ich denke, einige der Abfragen sind in der Art und Weise verloren, aber ich weiß nicht warum ...

Ich benutze npm node-neo4j-Paket für die Verbindung und das.

Hier mein node.js Code:

var neo4j = require('neo4j'); 
    var readline = require("readline"); 
    var fs = require("fs") 

    var db = new neo4j.GraphDatabase('http://neo4j:[email protected]:7474'); 

    var rl = readline.createInterface({ 
     input: fs.createReadStream('C:/Users/RRamos/Documents/Projects/test-neo4j/Files/kaggle_songs.txt') 
    }); 

    var i=1; 

    rl.on('line', function (line) { 
     var str = line.split(" "); 
     db.cypher({ 
      query: "CREATE (:Song {id: '{line1}', num_id: {line2}})", 
      params: { 
      line1: str[0], 
      line2: str[1], 
      }, 
     }, callback); 
     console.log(i + " " + "CREATE (:Song {id: '"+str[0]+"', num_id: "+str[1]+"})"); 
     i = i+1; 
    }); 


    function callback(err, results){ 
     if(err) throw err; 

    } 

Antwort

0

macht 386.213 separate Cypher REST-Abfragen (in separaten Transaktionen) ist wahrscheinlich die langsamste Art und Weise, eine so große Anzahl von Knoten zu erstellen.

Es gibt mindestens 3 bessere Möglichkeiten (in der Reihenfolge zunehmender Leistung):

  1. mehrere Knoten zu einem Zeitpunkt erzeugen, indem als Parameter ein Array Senden der Daten für mehrere Knoten enthält. Zum Beispiel können Sie 8 Knoten erstellen, indem Sie diese Array-Parameter zu senden: [['a', 1],['b', 2],['c', 3],['d', 4],['e', 5],['f', 6],['g', 7],['h', 8]], und mit dieser Abfrage:

    UNWIND {data} AS d 
    CREATE (:Song {id: d[0], num_id: d[0]}) 
    
  2. Sie die LOAD CSV Klausel, um die Knoten erstellen können. Da die Eingabedatei einen Raum zu verwenden scheint Werte Knoten Eigentum zu trennen, diese könnte Arbeit für Sie:

    LOAD CSV FROM 'file:///C:/Users/RRamos/Documents/Projects/test-neo4j/Files/kaggle_songs.txt' AS line 
    FIELDTERMINATOR ' ' 
    CREATE (:Song {id: line[0], num_id: line[1]}) 
    
  3. Für eine noch bessere Leistung, könnten Sie die Import tool verwenden, die für die Initialisierung ein Kommandozeilen-Tool ist eine neue DB.

+0

WOW! Dieser zweite Weg hat mich umgebracht !!!! Ich danke dir sehr. Ich verbrachte 30 Stunden damit, es auszuprobieren, und NUR das Ausführen dieser 3 Zeilen dauert 12 Sekunden !!!!!! –

+0

ABSOLUT FANTASTISCH –