2016-03-27 1 views
1

Ich bin gerade in Graph-Datenbanken und brauche Beratung.Neo4j Modellierung Beratung mit Eigenschaften in Beziehungen

In diesem Beispiel habe ich einen Knoten "Person" und einen Knoten "Project" mit zwei Beziehungen zwischen den beiden. Die beiden Beziehungen sind:

  • Ein geplantes Datum, das das projizierte beendet Datum ist
  • A geprüft Datum, das die tatsächliche fertige Datum ist

Sowohl von der Person für das Projekt sind.

Speziell Bezug nehmend auf die Verwendung der Beziehungseigenschaft, um den "Datumswert" des Ereignisses zu halten. Sind das Nachteile oder eine bessere Möglichkeit, dies in einem Diagramm zu modellieren?

Eine einfache mock up ist unten: enter image description here

Antwort

3

Es ist einfacher Daten in Form von Unix Epoch Zeitstempel zu halten (als lange Ganzzahl gespeichert ist), und nicht als Julian stammt. Neo4j hat kein eingebautes Datum/Uhrzeit-Format.

Zeitstempel und kann verwendet werden, um Berechnungen an den Daten durchzuführen, um Dinge wie zu finden - wie viele Tage hinter dem Zeitplan ist das Projekt auf dem aktuellen Datum basiert.

Die timestamp() Funktion in Cypher bietet eine Möglichkeit, die aktuelle Unix-Zeit innerhalb von Neo4j zu erhalten.

Jede Beziehung in Neo4J nimmt intern 34 Bytes an Daten auf, wobei der tatsächliche Inhalt der Beziehung ausgeschlossen wird. Es kann effizienter sein, sowohl geplante als auch verifizierte Vervollständigungen als Eigenschaften in einer einzelnen Beziehung zu speichern, anstatt sie als zwei Beziehungen zu speichern.

Eine Beziehung muss nicht gleichzeitig das geplante Datum und das überprüfte Datum haben (die Vorteile von NoSQL). Sie können das bestätigte Datum später mit dem Schlüsselwort SET hinzufügen.

Nur um Ihnen ein Beispiel zu geben.

Verwenden Sie die folgende Cypher-Anweisung zum Erstellen.

Create (p:Person {name:'Bill'})-[r:Works_On {scheduledcompletion: 1461801600}]->(pro:Project {name:'Jabberwakie'}) 

Verwenden Sie die folgende Cypher-Anweisung, um das überprüfte Datum auf die aktuelle Uhrzeit zu setzen.

Match (p:Person {name:'Bill'})-[r:Works_On]->(pro:Project {name:'Jabberwakie'}) set r.verifiedcompletion=timestamp() 

verwenden Sie die folgende Anweisung Cypher eine Art Berechnung durchzuführen, in diesem Fall einen Booleschen Wert zurück, wenn das Projekt hinter dem Zeitplan ist oder nicht.

Match (p:Person {name:'Bill'})-[r:Works_On]->(pro:Project {name:'Jabberwakie'}) return case when r.scheduledcompletion > r.verifiedcompletion then true else false end as behindschedule 
+0

Ich schätze wirklich die gründliche Erklärung, danke. Untersucht auch das von Ihnen vorgeschlagene Datumsformat. –

+0

Gern geschehen. Ich hoffe, es hilft :) – Anomaly211

0

denken auch über projizierte beendet Datum und tatsächlichen Fertig Datum im Knoten Projekt bei Speichern, wenn diese Eigenschaft auf das gesamte Vorhaben und das gleiche für alle Personen mit sich bringen ist.

Dies wird Ihnen helfen, doppelte Daten zu vermeiden und die Abfrage von Projekten nach Eigenschaften schneller zu machen, da Sie nicht nach Beziehungen suchen müssen. In Fällen, in denen Ihr Modell entworfen wurde, um unterschiedliche Daten für verschiedene Personen zu haben, zusätzlich zum Speichern von Datensätzen in Beziehungen, ist es immer noch sinnvoll, in Projektknoten kombinierte Informationen für das gesamte Projekt zu speichern.Dadurch wird das Modell klarer und einige Abfragen schneller ausgeführt.

+0

Tut mir leid, ich habe keine vollständige Erklärung gegeben, aber dieses Modell hätte mehrere Personen, die dasselbe Projekt mit jeweils eigenen geplanten und verifizierten Daten durchführen. Deshalb habe ich versucht, die Daten in die Beziehung zu bringen. Das heißt, würden Sie es anders machen? –