2016-06-09 5 views
0

In einem allgemeinen Sinn, gibt es eine Best Practice zu verwenden, wenn Sie versuchen zu schätzen, wie lange die Einstellung von Beziehungen in Neo4j dauert?Schätzung der Zeit zum Festlegen von Beziehungen in Neo4j

Zum Beispiel habe ich die Daten-Import-Tool erfolgreich, und hier ist das, was ich in meiner 2.24GB Datenbank haben:

IMPORT DONE in 3m 8s 791ms. Imported: 7432663 nodes 0 relationships 119743432 properties

In Vorbereitung auf Beziehungen Einstellung, habe ich einige Indizes:

CREATE INDEX ON :ChessPlayer(player_id);
CREATE INDEX ON :Matches(player_id);

Dann lasse ich es krachen:

Dann begann ich zu realisieren, dass ich keine Ahnung habe, wie man überhaupt abschätzen kann, wie lange diese Einstellung dauern könnte, um diese Einstellungen vorzunehmen. Gibt es eine Berechnung "zurück von der Hüllkurve", um für diese Art von Ding mindestens eine Ballparkfigur zu bestimmen?

Ich verstehe, dass jeder Situation auf allen Ebenen unterschiedlich ist, einschließlich Software, Hardware und gewünschte Schema. Aber jede Diskussion wäre zweifellos nützlich und würde meine (und alle anderen, die das lesen) vertiefen.

PS: FWIW, ich Ubuntu 14.04 mit 16 GB RAM läuft und einem Intel Core i7-3630QM CPU @ 2.40GHz

Antwort

1

Das Problem hierbei ist, dass Sie nicht in Betracht Transaktionsgrößen nehmen Sie. In Ihrem Beispiel werden alle :HAD_MATCH Beziehungen in einer einzigen großen Transaktion erstellt. Eine Transaktion wird intern zuerst im Speicher aufgebaut und dann auf die Festplatte übertragen. Wenn die Transaktion zu groß ist, um in Ihren Heapspeicher zu passen, wird möglicherweise eine massive Leistungsverschlechterung aufgrund von Speicherbereinigungen oder sogar OutOfMemoryExceptions auftreten.

Normalerweise möchten Sie Transaktionsgrößen auf z. 10k - 100k atomare Operationen.

Die wahrscheinlich einfachste Transaktion Dosierung in diesem Fall ist die rock_n_roll Prozedur von neo4j-apoc. Dies verwendet eine Cipher-Anweisung, um die zu bearbeitenden Daten bereitzustellen, und eine zweite, die für jedes der Ergebnisse aus dem vorherigen im Batch-Modus ausgeführt wird. Beachten Sie, dass apoc erfordert Neo4j 3.x:

CALL apoc.periodic.rock_n_roll(
    "MATCH (p:Player),(m:Matches) WHERE p.player_id = m.player_id RETURN p,m", 
    "WITH {p} AS p, {m} AS m CREATE (p)-[:HAD_MATCH]->(m)", 
    20000) 

es einen Fehler in 3.0.0 und 3.0.1 war verursacht dies eher schlecht durchführen. Also das obige ist für Neo4j> = 3.0.2.

Wenn als Behelfslösung auf 3.0.0/3.0.1 Verwendung dieser sein:

CALL apoc.periodic.rock_n_roll(
    "MATCH (p:Player),(m:Matches) WHERE p.player_id = m.player_id RETURN p,m", 
    "CYPHER planner=rule WITH {p} AS p, {m} AS m CREATE (p)-[:HAD_MATCH]->(m)", 
    20000) 
+0

mich dumm - vergessen 'apoc.periodic.rock_n_roll' nach' CALL' zu setzen - fest jetzt basierend auf Änderungsanforderung . Danke dafür. –