2016-12-05 9 views
0

Я пытаюсь вставить данные Neo4j, связанные с traceroute. У меня около 55K уникальных узлов, а трассировки - около 80K. Я использую Python и neo4jrestclient для связи с db. Файл с traceroutes имеет следующий синтаксис:Как вставить огромный объем данных в 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

Что-то вроде: ид = 'CREATE CONSTRAINT ON (а: ipNode7) ASSERT a.ip УНИКАЛЬНА' db.query (ид, возвращает = (client.Node, ул client.Node)) Достаточно положить один раз до этого с открытым («traceroutes») в качестве входных данных :? – RamsesXVII

+0

Я думаю, что он должен быть отделен от ваших других запросов, вам нужно только создать ограничение один раз для db, затем оно будет автоматически использовано для жизни db. – InverseFalcon