2014-04-28 23 views
7

Ich versuche, eine Datenbank in Neo4j mit einer Struktur, die sieben verschiedene Arten von Knoten, insgesamt rund 4-5000 Knoten und zwischen ihnen etwa 40000 Beziehungen enthält. Der CYPHER Code ich zur Zeit ist, dass ich zum ersten Mal der Knoten mit dem Code erstellen:Erstellen von Knoten und Beziehungen zur gleichen Zeit in Neo4j

Create (node1:type {name:'example1', type:'example2'}) 

um 4000 von diesem Beispiel mit einzigartigen Knoten.

Dann habe ich bekam Beziehungen als solche genannt:

Create 
(node1)-[:r]-(node51), 
(node2)-[:r]-(node5), 
(node3)-[:r]-(node2); 

Rund 40.000 solcher einzigartigen Beziehungen.

Mit kleineren Graphen war dies überhaupt kein Problem. Mit dieser Option wird die ausführende Abfrage jedoch nicht mehr geladen.

Irgendwelche Vorschläge, wie ich diese Art von Abfrage arbeiten kann? Oder was sollte ich stattdessen tun?

bearbeiten. Was ich versuche zu erstellen, ist eine große Grafik über ein Produkt, mit seinen Releases, Release-Versionen, Features usw., genauso wie das Movie-Beispiel erstellt wird.

Das Produkt hat etwa 6 Releases insgesamt, jedes Release hat etwa 20 Releaseversion. Insgesamt gibt es 371 Features und von dort 371 Features gibt es auch 438 Featureversionen. Jede Release-Version (120 insgesamt) hat dann jeweils etwa 2-300 Featureversionen. Diese Featureversionen sind ihrem Feature zugeordnet, das Abhängigkeiten zu ein bisschen von allem in der Datenbank hat. Ich habe auch HW Abhängigkeiten wie die mögliche hw involed diese Merkmale auf, Mitteilungen usw. so basicaly im mit Chiffre-Code wie auszuführen:

Create (Product1:Product {name:'ABC', type:'Product'}) 
Create (Release1:Release {name:'12A', type:'Release'}) 
Create (Release2:Release {name:'13A, type:'release'}) 
Create (ReleaseVersion1:ReleaseVersion {name:'12.0.1, type:'ReleaseVersion'}) 
Create (ReleaseVersion2:ReleaseVersion {name:'12.0.2, type:'ReleaseVersion'})  

und unter denen ich sie aufgebaut haben sich mit der

Create (Product1)<-[:Is_Version_Of]-(Release1), 
(Product1)<-[:Is_Version_Of]-(Release2), 
(Release2)<-[:Is_Version_Of]-(ReleaseVersion21),   

den ganzen Weg hinunter auf Funktionen, und dann habe ich auch Abhängigkeiten zwischen ihnen wie hinzugefügt:

(Feature1)-[:Requires]->(Feature239), 
(Feature239)-[:Requires]->(Feature51);  

da ich aus vielen verschiedenen Excel-Sheets-all diese Informationen e finden musste tc, ich habe den Code auf diese Art und Weise erstellt, indem ich dachte, ich könnte ihn einfach in einer Massencypherabfrage zusammenstellen und auf dem/browser auf dem localhost ausführen. es funktionierte wirklich gut, solange ich nicht mehr als 4-5000 Abfragen gleichzeitig verwendete. Dann hat es die gesamte Datenbank in ungefähr 5-10 Sekunden am Maximum erstellt, aber jetzt, wenn ich versuche, 45000 Abfragen zur gleichen Zeit zu laufen, läuft es seit fast 24 Stunden, und lädt immer noch und sagt "Ausführen der Abfrage. .. ". Ich frage mich, ob es auf jeden Fall die Zeit, die es braucht, verbessern kann, wird die Datenbank schließlich erstellt werden? Oder kann ich einige intelligentere Indizes oder andere Dinge tun, um die Leistung zu verbessern? weil übrigens meine Chiffre jetzt geschrieben wird, kann ich sie nicht in Stücke teilen, da alles in der Datenbank eine Art Verbindung zum Produkt hat. Muss ich den Code neu schreiben oder gibt es einen reibungslosen Weg?

Antwort

11

können Sie mehrere Knoten und Beziehungen mit einer einzigen Anweisung erstellen verzahnt erstellen, wie folgt aus:

create (a { name: "foo" })-[:HELLO]->(b {name : "bar"}), 
     (c {name: "Baz"})-[:GOODBYE]->(d {name:"Quux"}); 

Also das ist ein Ansatz, anstatt jeden Knoten einzeln mit einer einzigen Anweisung erstellen, dann jede Beziehung zu einem einzigen Erklärung.

Sie können auch mehrere Beziehungen von Objekten erstellen Sie zunächst durch Anpassung, dann erstellen:

match (a {name: "foo"}), (d {name:"Quux"}) create (a)-[:BLAH]->(d); 

Natürlich können Sie mehrere Spiel-Klauseln haben könnte, und mehrere Klauseln dort erstellen.

Sie könnten versuchen, einen bestimmten Knotentyp zu finden und dann alle erforderlichen Beziehungen von diesem Knotentyp zu erstellen. Sie haben genügend Beziehungen, die viele Abfragen erfordern. Stellen Sie sicher, dass Sie die Eigenschaft indexiert haben, die Sie für die Übereinstimmung mit den Knoten verwenden. Wenn deine DB groß wird, ist das wichtig, um schnell nach Dingen zu suchen, von denen du versuchst neue Beziehungen zu erstellen.

Sie haben nicht angegeben, welche Abfrage ausgeführt wird, die nicht "stopping loading" ist. Aktualisieren Sie Ihre Frage mit Einzelheiten, und lassen Sie uns wissen, was Sie versucht haben, und vielleicht ist es möglich zu helfen.

+0

Danke! Dies sollte als Antwort angenommen werden. – troig

+0

Brauchen wir hier keine Klammern? (a) - [: BLAH] -> (b) – orestiss

+0

Ja. Die Antwort wurde 2014 geschrieben, als Sie sie nicht brauchten. – FrobberOfBits

0

Wenn Sie die Neo4j 2.1-Vorabversionen verwenden können, sollten Sie die neuen Funktionen LOAD CSV und PERIODIC COMMIT verwenden. Sie sind genau für diesen Anwendungsfall konzipiert.

LOAD CSV können Sie die Struktur Ihrer Daten mit einem oder mehreren Cypher-Mustern beschreiben, während Sie die Werte in CSV bereitstellen, um eine Duplizierung zu vermeiden.

PERIODIC COMMIT kann dazu beitragen, große Importe zuverlässiger zu machen und auch die Leistung zu verbessern, indem die benötigte Speichermenge reduziert wird.

+0

Das scheint eine sehr interessante Sache zu sein, meine einzige Frage ist, ob ich Beziehungen zwischen zum Beispiel Features und Features und verschiedene Arten von Beziehungen zwischen ihnen verwenden kann, weil in dieser Datenbank gibt es die gleichen Arten von Knoten mit vielleicht zehn verschiedenen Beziehungen zu dieser Art von Knoten. Daher kann ich zum Beispiel nicht verwenden: 'CREATE (p) - [: PLAYED {Rolle: csvLine.Role}] -> (M)' Oder kann ich ein bisschen meiner Datenbank rechtzeitig ausführen? weil das wahrscheinlich mein aktuelles Thema ist, kann ich es nicht auf kleinere Stücke aufteilen. – ErikOstergren

+0

Beziehungstypen, Beschriftungen und Eigenschaftsnamen müssen in den Abfragen wörtlich angegeben werden - die Beziehungstypen können nicht aus einer CSV-Datei stammen. Stattdessen würden Sie normalerweise eine CSV-Datei und eine Abfrage pro Typ verwenden. – Andres

Verwandte Themen