2016-07-25 7 views
0

Ich habe ein paar Daten, die ich in neo4j einfügen möchte.Neo4j Import Job von CSV mit Vorfahren als die Beziehung

Zunächst habe ich ein Skript erstellt, um alle Beziehungen und Knoten als eine cql-Datei zu erstellen, die für kleinere Datenmengen gut funktionierte, aber als mein Datensatz wuchs, stürzte mein System ab.

Denken Sie daran, dass ich die neo4j-Shell verwendete, um alle Daten einzugeben.

Ich weiß, dass ich die Daten mit dem Batch-Importer Batch einfügen kann, aber mein gesamter Datensatz hat nur eine Tabelle mit Ancestries, die ich verwendet habe, um die Beziehungen zu erstellen.

Zum Beispiel 1 => 1.2, 1.2.1, 1.2.2, 1.3 und so weiter. Ich konvertierte die Daten in eine .csv und importierte sie und es funktionierte wirklich schön und schnell konnte ich alle bekommen Knoten, aber wie gehe ich dazu über, die Beziehungen in neo4j mit nur einer Tabelle, die ID, Name und Abstammung enthält zu erstellen?

+0

ich Sie uns weitere Informationen zu Ihrem Skript erstellen geben denken müssen ... jetzt nur wir eine Fuzzy-Idee wie Ihre Graph DB aussieht. Wenn Sie nur eine einzige Tabelle mit ein paar Daten benötigen, muss ich fragen, ob neo4j das richtige Werkzeug dafür ist. Ich wundere mich auch, wenn Sie verwirren, wie die Daten in der Datenbank mit der Ausgabe, die Sie von einer Abfrage möchten, gespeichert werden. Die Ausgabe kann wie eine einzelne Tabelle aussehen, wird aber als Knoten und Beziehungen in der Datenbank gespeichert. – InverseFalcon

+0

Ja Entschuldigung, wenn ich alle verwirrt habe. Mein Skript durchläuft einfach jeden Datensatz und erstellt einen Knoten und eine Beziehung dafür. Ich habe das mit einer Vorfahrenbeziehung gehandhabt, die es einfach gemacht hat, denn wenn ich ein Kind habe, weiß ich, dass es dem Elternteil gehört. Ich weiß, dass die Werte als Knoten und Beziehungen in der Neo4j db gespeichert werden, da es für mich mit kleineren Datenmengen sehr gut funktionierte, aber sobald ich es für kleinere Datasets verwendete, benutzte ich dasselbe Skript für meine gesamte db und am Ende es hängt. Meine DB hat alle Beziehungen und Komponenten in einer einzigen Tabelle mit ID, Name, Abstammung (Eltern) als Spalten. – user3831375

+1

Eine Stapeleinfügung würde besser funktionieren (wenn Sie aus CSV importieren, können Sie die periodische Festschreibungsfunktionalität verwenden, um die Vorgänge erheblich zu beschleunigen) ... und wenn das nicht funktioniert, müssen Sie nur Segmente gleichzeitig angehen . Können Sie Ihr Skript zur Beschreibung hinzufügen? – InverseFalcon

Antwort

1

Für eine große Datenmenge, müssen Sie USING PERIODIC COMMIT mit LOAD CSV kombinieren:

CREATE CONSTRAINT ON (n:Data) ASSERT n.id IS UNIQUE 

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///data.csv" AS line 
CREATE (n:Data {id: line.id, name: line.name}) 

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///data.csv" AS line 
MATCH (n:Data {id: line.id}), (a:Data {id: line.ancestry}) 
MERGE (n)-[:HAS_ANCESTOR]->(a) 
+0

Danke das ist sehr nah. Weißt du, wie lange die zweite Anweisung laufen sollte? Ich habe es jetzt für ungefähr 5 Minuten laufen lassen. – user3831375

+0

Es hängt davon ab, wie viele Zeilen es in Ihrer CSV-Datei gibt, und wenn Sie tatsächlich eine eindeutige Einschränkung für die 'id'-Eigenschaft erstellt haben, wird' MATCH 'schnell sein (mit dem Index anstelle eines vollständigen Knoten-Scans): [' CREATE CONSTRAINT ON (n: Daten) ASSERT n.ID IST EINZIGARTIG] (http://neo4j.com/docs/developer-manual/3.0/#query-constraints-unique-nodes). –

+0

Danke funktioniert wie Charme! Es geht nur eine Schicht tief, wissen Sie, wie ich das beheben kann? Ich habe die erste Elternteil- und Kindbeziehung, die als has_ancestor aber den Rest zeigt nicht zeigt. Weißt du, warum das so sein könnte? – user3831375