2016-04-03 1 views
0

Ich versuche, Daten aus einer MySQL-Datenbank in Neo4j zu importieren, wobei CSV-Dateien als Vermittler verwendet werden. Ich folge dem basic example, kann es aber nicht ganz zum Laufen bringen. Ich importiere zwei Tabellen mit diesen Abfragen:Importieren von CSV-Beziehungen zu Neo4j

//Import projects. 
USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:/tmp/projects.csv" AS row 
CREATE (:project 
{ 
    project_id: row.fan, 
    project_name: row.project_name 
}); 

//Import people. 
USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:/tmp/persons.csv" AS row 
CREATE (:person 
{ 
    person_id: row.person_id, 
    person_name: row.person_name, 
}); 

//Create indicies. 
CREATE INDEX ON :project(project_id); 
CREATE INDEX ON :project(project_name); 
CREATE INDEX ON :person(person_id); 
CREATE INDEX ON :person(person_name); 

Dieser Teil funktioniert. Was ist funktioniert nicht, wenn ich versuche, die Beziehungen zu importieren:

//Create project-person relationships. 
USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:/tmp/project_persons.csv" AS row 
MATCH (project:project {project_id: row.project_id}) 
MATCH (person:person {person_id: row.person_id}) 
MERGE (person)-[:CONTRIBUTED]->(project); 

Die Konsole die Abfrage ohne Fehler akzeptiert, aber nie beendet. Es läuft seit Tagen bei 100% CPU, 25% RAM, aber vernachlässigbarer Festplattenverbrauch. In den Datenbankinformationen werden keine Beziehungen angezeigt.

Habe ich irgendwo einen Fehler gemacht, oder ist es wirklich so langsam? Die project_persons.csv Datei ist 13 Millionen Zeilen lang, aber sollte das periodische Commit nicht schon etwas auftauchen lassen?

Antwort

0
shouldn't the periodic commit make something show up by now? 

Nur für die LOAD - tun ein „erklären“ an der Vorderseite der CREATE und es wird Ihnen sagen, wie es das Update und die Anzahl der Datensätze zu strukturieren, sie zu verarbeiten erwartet. Ich stieß auf das gleiche Problem - Neo4j machte das gesamte Update als eine einzige Transaktion und nie abgeschlossen. Die Transaktion musste in 50K - 100K tx Chunks aufgeteilt werden, um alles zu erledigen.

Eine Möglichkeit, dies zu tun, besteht darin, die Beziehungsinformationen als eine Gruppe beschrifteter Knoten zu importieren und diese Knoten dann zu MATCH() für die Personen- und Projektknoten zu verwenden und die Beziehung nach Bedarf zu erstellen.

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:/tmp/project_persons.csv" AS row 
CREATE (:Relations {project_id: row.project_id, person_id: row.person_id}) 

verarbeiten dann die Datensätze in 50K Chargen:

MATCH (r:Relations) 
MATCH (prj:project {project_id: r.project_id}) 
MATCH (per:person {person_id: r.person_id}) 
WITH r, prj, per LIMIT 50000 
MERGE (per)-[:CONTRIBUTED]->(prj) 
DELETE r 

Führen Sie diese mehrmals, bis alle Beziehungen erstellt werden, und Sie sind gut zu gehen.

+0

Es funktioniert, aber das Importieren aller Daten ist mühsam, auch wenn ich das Limit erhöht habe. Und aus irgendeinem Grund habe ich 200k Relationen übrig, die nicht zusammengeführt oder gelöscht werden. – Rachie

+0

Einverstanden, langweilig zu sein. Was machst du, um die unerwünschten Beziehungen zu löschen? –

+0

Ich weiß nicht, was ich mit ihnen machen soll oder ob sie unerwünscht sind. – Rachie