2016-03-31 1 views
2

Ich versuche, eine große Menge von Daten von CSV zu Neo4j mit Neo4j-Rest Java-API zu importieren. out of memory Ausnahmen zu vermeiden, verwende ich regelmäßig zu begehen, so dass eine Probe Java-Code wäre:Wie Transaktion Rollback in Neo4j behandeln, während große Daten von CSV mit periodischen Commit laden

// just to let you know what classes I am using 
    import org.neo4j.rest.graphdb.query.CypherTransaction; 
    import org.neo4j.rest.graphdb.query.CypherTransaction.Statement; 
    import org.neo4j.rest.graphdb.query.CypherTransaction.Result; 
    import org.neo4j.rest.graphdb.query.CypherTransaction.ResultType; 

private static final String CREATE_USER = 
    " USING PERIODIC COMMIT 10000 LOAD CSV WITH HEADERS FROM " + 
       "\"URL\" AS line WITH line\n" + 
       " CREATE (u:USER{id:toInt(line.customer_key)})"; 

//create USER Node 
Statement userStatement = new Statement(CREATE_USER, null, ResultType.rest, false); 

CypherTransaction periodicCommitTransaction = new CypherTransaction(dbPath, CypherTransaction.ResultType.rest); 
      periodicCommitTransaction.addAll(userStatement); 
      periodicCommitTransaction.commit(); 

Nun meine Frage ist, wie soll ich Transaktion Rollbacks in regelmäßigen Commits behandeln? Ich weiß, dass die periodischen Commit-Anweisungen nicht in einer offenen Transaktion ausgeführt werden können, und sie sollten direkt nach dem Senden der Anforderung festgeschrieben werden. Dies bedeutet, dass es keine Möglichkeit gibt, ein Rollback durchzuführen, wenn etwas schief geht. Ich denke, das ist ein häufiges Problem bei Batch-Einfügungen, also wie sollte ich mit solchen Rollbacks umgehen? Soll ich meine db in neo4j ablegen und versuchen, den ganzen Prozess von Anfang an zu starten? Irgendwelche Gedanken?

+0

Verwendung einen Parameter für URL –

+0

ja ich es in meinem echten Code verwenden :-) Ich kann es nur verändern es hier im Code zu setzen. Danke Michael. – Lina

Antwort

1

Korrekt, PERIODIC COMMIT schreibt standardmäßig alle x-Zeilen ein.

Das einzige, was Sie tun können, ist Ihr „in-flight“ Knoten mit einem bestimmten Label wie :Importing und entfernen Sie das Etikett zu kennzeichnen, wenn der Import erfolgreich war, oder entfernen Sie alle Knoten und ihre Beziehungen, wenn etwas gescheitert. Sie müssen es jedoch Batch.

MATCH (n:Importing) 
WITH n LIMIT 10000 
DETACH DELETE n 
RETURN count(*); 
+0

Danke Michael, nun, ich muss alles fallen lassen! In diesem Fall denke ich, ich muss sie nicht wirklich mit irgendeinem Label kennzeichnen. Ich benutze immer noch neo 2.2.5, also arbeitet DETACH noch nicht hier. verwenden: MATCH n MIT n LIMIT 10000 OPTIONAL MATCH n- [r] -() DELETE n, r Noch eine Frage. {WITH n LIMIT 10000} -> Funktioniert das als Stapel? Ich meine, wenn ich 1000000 Knoten habe, dann wird dies 100 mal ausgeführt? – Lina