2016-12-05 63 views
0

我試圖插入到與traceroute相關的Neo4j數據。我有大約55K獨特的節點和跟蹤路由約80K。我使用Python和neo4jrestclient與db進行通信。與路由跟蹤文件的語法如下:如何將大量數據插入Neo4j

83.212.7.42 ;; ;; 83.212.7.41 ;; 62.217.100.63 ;; 83.97.88.69 ;; 62.40.112.215 ;; 62.40.98.150

我的代碼是:

from neo4jrestclient.client import GraphDatabase 
from neo4jrestclient import client 


db = GraphDatabase("...") 

node = db.labels.create("ipNode") 



with open("traceroutes") as input: 

for line in input: 
    l= zip(line.split(';;')) 
    i=len(l) 
    try: 
     prev=l[0][0] 
     queryProbe = 'MERGE (a:ipNode7 {ip:"' + prev + '"})' 
     db.query(queryProbe, returns=(client.Node, str, client.Node)) 
     for counter in range(1,i-1): 
      next = l[counter][0] 
      queryMergeNode = 'MERGE (b:ipNode7 {ip:"' + next + '"})' 
      db.query(queryMergeNode, returns=(client.Node, str, client.Node)) 
      queryUpdateRelationship= 'MATCH (a:ipNode7 {ip:"' + prev + '"}),(b:ipNode7 {ip:"' + next + '"}) WHERE NOT (a)-[:precede]-(b) WITH a,b CREATE (a)-[:precede]->(b)' 
      db.query(queryUpdateRelationship, returns=(client.Node, str, client.Node)) 
      prev=next 
    except Exception: 
     print "error" 

的問題是,越來越20K節點正確插入後,插入速度迅速減慢,我不能放其他東西。

回答

0

你對ipNode7(ip)有獨特的約束嗎?如果你不這樣做,那麼數據庫將被迫在具有該標籤的所有節點上對具有給定ip的那些節點運行標籤掃描。由此產生的行爲與您所遇到的行爲非常相似,隨着該標籤節點數量的增加,插入速度急劇下降。

+0

喜歡的東西: UQ = '創建約束ON(A:ipNode7)ASSERT a.ip是獨一無二的' db.query(UQ,返回=(client.Node,STR,client.Node)) 這足以把前一次打開(「traceroutes」)作爲輸入:? – RamsesXVII

+0

我認爲它應該與其他查詢分開,你只需要爲db創建一次約束,那麼它將在db的生命週期中自動使用。 – InverseFalcon