2016-04-03 53 views
0

我想從文件中引入neo4j中的大量數據。我使用node.js代碼,簡單的JavaScript,沒有太多複雜性。從Node.js引入Neo4j中的巨大數據時出錯

事情是我有386213行或'節點'來介紹,但是當執行(和等待3個小時)我只看到一半更多。我認爲一些查詢是迷路了,但我不知道爲什麼...

我正在使用npm node-neo4j軟件包進行連接。

這裏我的Node.js代碼:

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; 

    } 

回答

0

製作386213個單獨的Cypher REST查詢(在單獨的事務)可能是創造這樣一個大量節點的最慢的可能途徑。

至少有3更好的方法(在提高性能的順序):

  1. 通過發送作爲參數包含用於多個節點的數據的陣列創建在一個時間的多個節點。 [['a', 1],['b', 2],['c', 3],['d', 4],['e', 5],['f', 6],['g', 7],['h', 8]],並使用此查詢:例如,您可以通過發送此數組參數創建8個節點

    UNWIND {data} AS d 
    CREATE (:Song {id: d[0], num_id: d[0]}) 
    
  2. 可以使用LOAD CSV子句創建的節點。由於輸入文件似乎用空格分隔節點的屬性值,這可能爲你工作:

    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. 爲了更好的性能,您可以使用Import tool,這是用於初始化一個命令行工具一個新的數據庫。

+0

WOW!第二種方式殺了我!非常感謝。我花了30個小時嘗試它,只執行3條線需要12秒!!!!!! –

+0

絕對真棒 –