2016-05-16 11 views
1

Ich habe das Import-Tool verwendet, um ~ 1 Million Knoten einzulesen. Jetzt ist es Zeit für Beziehungen. (Leider sieht es so aus, als müssten Beziehungen in einem CSV explizit vorherbestimmt werden, wenn Sie das Import-Werkzeug verwenden wollen.)'Java Heap Space' Fehler mit Neo4j - wenn zunehmende Speicherzuweisung fehlschlägt

Zuerst habe ich einen Index auf die Knoten gesetzt .

Als nächstes schrieb ich das, was ich frage mich, ist mein Problem - auch mit einem Index, diese Aussage könnte zu viele kartesischen Produkte verursacht ?:

USING PERIODIC COMMIT 500 
LOAD CSV WITH HEADERS FROM 
'file:///home/monica/...relationship.csv' AS line 
MATCH (p1:Player {player_id: line.player1_id}), (p2:Player {player_id: line.player2_id}) 
MERGE (p1)-[:VERSUS]-(p2) 

Anscheinend ist die USING PERIODIC COMMIT 500 nicht helfen, wie ich meine Fehlermeldung anzeigt,

Java heap space 

googeln um, ich gelernt, dass es helfen könnte meine Speichereinstellungen in der Neo4j-wrapper.conf Datei zu ändern, also habe ich die Einstellungen den ganzen Weg bis zu 4 GB (ich habe ein System mit acht GB):

wrapper.java.initmemory=4096 
wrapper.java.maxmemory=4096 

Immer noch der gleiche Fehler.

Jetzt bin ich fest. Ich kann nicht an andere Strategien denken, neben:

1) die Anweisung umschreiben
2) ein System mit mehr RAM verwenden?
3) Finden Sie eine andere Möglichkeit, dies in Chargen zu tun?

Jeder Rat wäre toll. Danke an die neo4j SO Community im Voraus.

Antwort

1

Haben Sie einen Index oder eine eindeutige Einschränkung auf :Player(player_id)? Wenn der erste, löschen Sie den Index und fügen Sie stattdessen eine eindeutige Einschränkung hinzu. Andernfalls ist es möglich, mehrere Player-Knoten die gleiche player_id teilen - die kartesische Produkte verursachen könnte, vorausgesetzt, Sie haben 10 Mal die gleichen Spieler, dies würde in 100 Kombinationen für jede Zeile Ihres CSV enden.

Sobald Sie sicher sind, dass es keine solche Duplizierung gibt, ist die nächste Sache zu überprüfen EagerPipe. Wenn die Abfrage-Plan (ohne PERIODIC COMMIT)

EXPLAIN LOAD CSV WITH HEADERS FROM 
'file:///home/monica/...relationship.csv' AS line 
MATCH (b1:Player {player_id: line.player1_id}), (p2:Player {player_id:  line.player2_id}) 
MERGE (p1)-[:VERSUS]-(p2) 

zeigt etwas mit eager dann PERIODIC COMMIT nicht angewendet wird, siehe http://www.markhneedham.com/blog/2014/10/23/neo4j-cypher-avoiding-the-eager/ für weitere Einzelheiten.

Die Fälle, in denen dies passieren könnte, werden mit einer neueren Neo4j-Version immer weniger.

Update

Ich habe gerade realisiert, dass Sie b1 im Spiel und in der Zusammenführung ein p1 verwenden - so letztere existiert nicht und wird als neuer Knoten während merge erstellt.

Können Sie bitte versuchen:

USING PERIODIC COMMIT 500 
LOAD CSV WITH HEADERS FROM 
'file:///home/monica/...relationship.csv' AS line 
MATCH (p1:Player {player_id: line.player1_id}) 
MATCH (p2:Player {player_id: line.player2_id}) 
MERGE (p1)-[:VERSUS]-(p2) 
+0

ich, wie Sie sagen haben; Ich entfernte den Index, fügte eine eindeutige Einschränkung hinzu und überprüfte dann den Abfrageplan. In der Tat ... da ist ein "eifriges" Lauern! Jetzt muss ich die Dokumentation lesen und sehen, wie ich das umgehen kann. Danke, dass Sie mich in diese Richtung weisen. –

+0

Der Link zu Mark Needhams Blog empfiehlt, bei einer Iteration von 'LOAD CSV' zu viel zu vermeiden. In meinem Fall mache ich nur eine Sache in einer Iteration von 'LOAD CSV' ... –

+0

In welcher neo4j-Version bist du? –

Verwandte Themen