2016-11-18 2 views
0

Ich mache einige Sachen mit meiner Universität und ich wurde gebeten, ein System zu erstellen, das komplette Bäume mit Millionen von Knoten (1 oder 2 Millionen mindestens) erstellt . Ich habe versucht, den Baum mit einem laden CSV mit einem periodischen Commit zu erstellen und es funktionierte gut mit der Erstellung von nur Nodes (70000 ms auf einem Allzweck-Notebook: P). Als ich das gleiche mit den Edges versuchte, skalierte es auch nicht.Erstellen/Verwalten von Millionen Vertex-Baum in Neo4j 3.0.4

Using periodic commit LOAD CSV WITH HEADERS FROM 'file:///Archi.csv' AS line 
Merge (:Vertex {name:line.from})<-[:EDGE {attr1: toFloat(line.attr1), attr2:toFloat(line.attr2), attr3: toFloat(line.attr3), attr4: toFloat(line.attr4), attr5: toFloat(line.attr5)}]-(:Vertex {name:line.to}) 

Ich muss garantieren, dass ein Baum in nicht mehr als 5 Minuten erzeugt wird.

Gibt es eine schnellere Methode, die solche Leistungen zurückgeben kann?

P.S. : Die Aufgabe erwartet nicht, Neo4j zu verwenden, aber nur eine Datenbank (entweder SQL oder NoSQL), aber ich fand diese NoSQL Graph DB heraus und ich dachte, wäre nett, mit Neo4j zu implementieren, da die Diagrammdatenstruktur kostenlos gegeben wird.

P.P.S: Ich bin mit Cypher

Antwort

1

Ich glaube, Sie wieder auf MERGE in der Entwicklerdokumentation lesen, sollten Sie sicherstellen, dass genau zu verstehen, was es tut.

Ein paar Dinge, insbesondere zu beachten ...

Wenn das Muster ist nicht vorhanden fusionieren, werden alle Elemente des Musters zusammengeführt werden, die in doppelter Ausführung zur Folge haben könnte: Vertex-Knoten erstellt werden. Wenn Ihre: Scheitelpunkte bereits in der Datenbank vorhanden sein sollten und noch keine Beziehungen vorhanden sind und Sie sicher sind, dass sich in der CSV keine Beziehung wiederholt, empfehle ich Ihnen dringend, auf den Start- und Endknoten zu VERGLEICHEN ERSTELLEN Sie die Beziehung zwischen ihnen anstelle der MERGE. Denken Sie daran, dass das Ausführen einer MERGE mit einer Beziehung mit vielen Attributen bedeutet, dass zuerst versucht wird, eine Übereinstimmung zu finden. Wenn also die Anzahl der Beziehungen zwischen den Knoten zunimmt, wird die Anzahl der Vergleiche immer höher. CREATE ist eine bessere Wahl, wenn Sie wissen, dass keine Beziehung dupliziert wird, und wenn Sie sicher sind, dass diese Beziehungen noch nicht existieren.

Ich fordere Sie auch dringend, einen Index zu erstellen: Vertex (Name), wie das wird erheblich helfen, auf Endknoten übereinstimmen.

+0

Als erstes, danke für die Hilfe. Ich habe eine Frage, die dich vielleicht zum Lachen bringen wird .-. : Wie funktionieren Schemaindizes und wie können sie meine Abfragen verbessern? –

+0

Hier ist der [Schemaabschnitt] (https://neo4j.com/docs/developer-manual/current/cypher/#cypher-schema) in der Entwicklerdokumentation. Normalerweise erstellen Sie entweder eine eindeutige Integritätsregel oder einen Schemaindex für eine Eigenschaft von Knoten mit bestimmten Beschriftungen, um die Leistung beim Suchen von Knoten mit dieser Beschriftung durch diese Eigenschaft zu verbessern. Durch Erstellen eines Indexes für: Vertex (Name), Suchen nach: Vertex-Knoten nach Name (z. B. wenn Sie mit diesen Knoten eine Beziehung herstellen, um eine Beziehung zwischen ihnen herzustellen) verwenden Sie den Index unter der Haube, um die Suche schnell durchzuführen. Andernfalls muss alles gescannt werden: Vertex-Knoten nach der Eigenschaft name. – InverseFalcon

+0

Was ist mit der Super-Importeur-Methode? Die Dokumentation besagt, dass dieses Tool für riesige Datasets benötigt wird, die als CSV strukturiert sind, aber ich kann dieses Tool nicht finden. Das Tool befindet sich in "path/to/neo4j/bin/neo4j-import", sagt das Dokument, aber ich kann es nicht nennen. Ich benutze neo4j 3.0.4 –

Verwandte Themen