2016-12-05 11 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)に固有の制約がありますか?そうしないと、dbは、指定されたipを持つノードのラベルを持つすべてのノードでラベルスキャンを強制的に実行します。結果として生じる挙動は、あなたが遭遇しているものと非常に似ています。挿入速度は、ラベルのノード数が増えるにつれて大幅に減少します。

+0

ような何か: UQ =は 'CONSTRAINT ON(:ipNode7)CREATE ASSERTのa.ipを一意である' db.query(UQ、=(client.Node、STR、client.Node)を返す) それが十分ですopen( "traceroutes")を入力する前に一度入れる: – RamsesXVII

+0

私はそれがあなたの他のクエリとは別のものでなければならないと思う、あなたはdbのために一度制約を作成する必要がある、そしてそれはdbの寿命の間自動的に使用されます。 – InverseFalcon

関連する問題