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