2016-07-13 11 views
0

Ich habe Neo4j Community Edition 3.0.3 unter Ubuntu 14.04 auf einem lokalen Linux-Server installiert und erfolgreich installiert. Jetzt greife ich über meinen Windows-Browser auf den Port 7474 auf diesem Server zu.neo4j Dateneinfügung braucht Zeit

Jetzt habe ich eine CSV-Datei in folgendem Format Kundenauftragsdaten:

Customer_id, Item_id, Order_Date 

Es hat 90000 Zeilen, und beide customer_id und item_id sind die Knoten. Insgesamt (30000 customer_ids + 30000 item_ids) Knoten und 90000 Beziehungen (order_date als Name des Entfernungsattributs). Ich lief die unter Abfrage der Daten aus csv meiner Graph-Datenbank einzufügen:

LOAD CSV WITH HEADERS FROM "file:///test.csv" AS line 
MERGE (n:MyNode {Name:line.Customer}) 
MERGE (m:MyNode {Name:line.Item}) 
MERGE (n) -[:TO {dist:line.OrderDate}]-> (m) 

ich es links zu laufen, und nach etwa 7 bis 8 Stunden, es war immer noch läuft. Meine Frage ist, mache ich etwas falsch? Ist meine Anfrage nicht optimiert? oder ist das Ding üblich? Ich bin neu in Neo4j und Cypher. Bitte helfen Sie mir dabei.

+1

Haben Sie Index auf: MyNode (Name)? –

+0

Nein. Ich habe die Datei gerade in den Importordner gestellt und diese Abfrage ausgeführt. Nichts anderes.Wird die Indexhilfe erstellt? Ich muss darüber lesen, da ich nicht weiß, wie hier indexiert wird. –

Antwort

2

Erstellen Sie eine Eindeutigkeitsbedingung

Sie eine Eindeutigkeitsbedingung auf MyNode.Name schaffen sollte:

CREATE CONSTRAINT ON (m:MyNode) ASSERT m.Name IS UNIQUE; 

Neben der Datenintegrität/Einzigartigkeit MyNode Durchsetzung, die einen Index für MyNode.Name schaffen wird die wird die Lookups auf den MERGE Aussagen beschleunigen. Es gibt ein bisschen mehr Informationen in der indexes and performance section here.

periodische begehen Mit

Da Neo4j eine Transaktionsdatenbank ist, werden die Ergebnisse der Abfrage im Speicher und die gesamte Abfrage aufgebaut wird sofort verpflichtet. Abhängig von der Größe der Daten/Ressourcen, die auf Ihrem Computer verfügbar sind, können Sie die periodic commit functionality in LOAD CSV verwenden, um zu vermeiden, dass die gesamte Anweisung im Speicher erstellt wird. Starten Sie einfach Ihre Anfrage mit USING PERIODIC COMMIT. Dadurch werden die Ergebnisse in regelmäßigen Abständen gespeichert und Speicherressourcen freigegeben, während Sie Ihre CSV-Datei durchlaufen.

Vermeidung der eifrigen

Ein Problem mit Ihrer Anfrage ist also ein eager operation enthält. Dies wird die periodische Festschreibungsfunktionalität behindern, und die Transaktion wird ungeachtet dessen in den Speicher eingebaut. Um den eifrigen Betrieb zu vermeiden Sie zwei Durchgänge durch die CSV-Datei verwenden können:

Sobald die Knoten zu erstellen:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///test.csv" AS line 
MERGE (n:MyNode {Name:line.Customer}) 
MERGE (m:MyNode {Name:line.Item}) 

Dann wieder die Beziehungen zu erstellen:

LOAD CSV WITH HEADERS FROM "file:///test.csv" AS line 
MATCH (n:MyNode {Name:line.Customer}) 
MATCH (m:MyNode {Name:line.Item}) 
MERGE (n) -[:TO {dist:line.OrderDate}]-> (m) 

Siehe diese twoposts für mehr Informationen über die eifrige Operation.

Zumindest müssen Sie die Eindeutigkeitseinschränkung erstellen - das sollte ausreichen, um die Leistung Ihrer LOAD CSV Anweisung zu erhöhen.

+0

Ich verwendete Eindeutigkeitseinschränkung und verwendete dann 2 verschiedene Abfragen, um Daten einzufügen. Dauerte nur 11 Sekunden für jede der Knoten und Beziehung Abfragen. Es hat wirklich geholfen. Vielen Dank :) Ich glaube, dass Eindeutigkeitsbeschränkung der Spielwechsler war. –