2016-06-02 3 views
0

Dies ist meine erste Frage in Stackoverflow.Importieren Sie eine große (7 Millionen Zeilen) CSV-Datei in Neo4j schneller

Ich möchte eine 7 Millionen Zeilen Datei in Neo4j-Datenbank importieren.

Jede Zeile enthält Informationen über einen Knoten, einen Zeitwert (die sich bereits in der Datenbank befinden). Für jede Zeile müsste ich einen vorhandenen Knoten und einen vorhandenen Zeitwert in der Datenbank finden, dann eine Beziehung zwischen ihnen erstellen und Werte entsprechend hinzufügen.

Ich möchte einige Hinweise zur Verbesserung der Importgeschwindigkeit. Das Schema lautet:

Ich brauche 24 Stunden für den Import rund 2 Millionen Zeilen. (1/3 davon) Ich würde erwarten, 50 ähnliche Dateien zu importieren, also denke ich, dass ich besseren Code brauchen würde, um die Geschwindigkeit zu erhöhen. Der zugewiesene Speicher ist 1 GB (Standardeinstellung) und die Festplatte ist SSD.

Vielen Dank!

USING PERIODIC COMMIT 1000 
LOAD CSV WITH HEADERS FROM "file:///../../Python/MAR15.csv" AS row WITH row 
WHERE row.LinkRef IS NOT NULL 
WITH row, toInt(SUBSTRING(row.Date, 0, 4)) AS y 
MATCH (year:Year {value: y}) 
WITH row, year, toInt(SUBSTRING(row.Date, 5, 2)) AS m 
MATCH (year)-[:CONTAINS]->(month:Month {value: m}) 
WITH row, month, toInt(SUBSTRING(row.Date, 8, 2)) AS d 
MATCH (month)-[:CONTAINS]->(day:Day {value: d}) 
WITH row, day, toInt(row.TimePeriod) AS t 
MATCH (day)-[:CONTAINS]->(timeperiod:Timeperiod {value: t}) 
##96 period per day, each period is 15 minutes 
WITH row, timeperiod 
MATCH(segment:SEGMENT {LinkRef: row.LinkRef}) 


CREATE (segment)-[trafficdata:TrafficData { 
    AverageJT: row.AverageJT, 
    AverageSpeed: row.AverageSpeed, 
    Flow: row.Flow, 
    DataQuality: row.DataQuality 
    }]->(timeperiod) 
SET segment.LinkLength = row.LinkLength; 
+0

was hast du angeschaut? Wenn Sie diese gesehen haben, dann fügen Sie sie bitte zu Ihrer Frage hinzu? vielleicht interessant? http://jexp.de/blog/2013/05/on-importing-data-in-neo4j-blog-series/ Außerdem: http://stackoverflow.com/questions/34487313/import-data-froma-a- large-csv-or-stream-von-daten zu neo4j-efficient-in-ruby. Außerdem: - Raten: https://www.google.co.uk/url?sa=t&rct=j&q=&esrc=s&source=web&cd=8&cad=rja&uact=8&ved=0ahUKEwiS2tn3nYrNAhXqIsAKHfsvD8QQtwIISDAH&url=https%3A%2F%2Fwww.youtube.com % 2Fwatch% 3Fv% 3DdCM7fRb49Ts & usg = AFQjCNHj37KJGDXPx9GIeLQqh5C2kCT_Ow & sig2 = UXG6yAMBF94jryPSw1lFyA & bvm = bv.123664746, d.ZGg –

+0

Das sind ungefähr 23 Datensätze pro Sekunde? Ist interessant (enttäuschend)? Ich hoffe, dass jemand helfen kann, das zu verbessern? Ich würde hoffen, dass zwischen 1 bis 2 Größenordnungen beschleunigen? –

+0

Hallo Ryan, danke für deinen Vorschlag. Für das Video im 2. Link. Ich habe gelernt, Einschränkungen für eindeutige LinkRef zu erstellen. Es ist jetzt viel schneller. CREATE CONSTRAINT ON (Segment: SEGMENT) ASSERT segment.LinkRef ist einzigartig –

Antwort

1

Wie Ryan vorgeschlagen, verbesserte ich die Abfragegeschwindigkeit durch diesen Code:

CREATE CONSTRAINT ON (segment:SEGMENT) ASSERT segment.LinkRef IS UNIQUE 

Da jedes Segment eine eindeutige Kennung (LinkRef) hat, das System in der Lage ist, das Spiel führen Überprüfung viel schneller . Das System kann mehr als 10.000 Eingaben pro Minute verarbeiten, nachdem diese Einschränkung hinzugefügt wurde.

Verwandte Themen