Ich habe ein Objekt und ich muss einen Überblick über alle Änderungen behalten. Wie würde ich dies unter Verwendung neo4j implementieren?Wie implementiere ich Revisionen mit neo4j?
Antwort
Wie bei einem RDBMS hängt dies von den Anforderungen Ihrer Domäne und Datenabfrage ab.
Benötigt Ihre Anwendung regelmäßig Zugriff auf alle Versionen des Objekts oder in der Regel nur auf die neuesten, mit den älteren Versionen verfügbar über die aktuelle? Ein Beispiel dafür könnten Seiten auf Wikipedia sein. Wie als Beispiel, lassen Sie uns sagen, dass wir eine Seite, die 3. auf Version Wir könnten dann dieses Modell wie folgt:
(pages)-[:PAGE]->(V3)-[:PREV]->(V2)-[:PREV]->(V1)
^ ^
| |
category current
node version of page
Hier wird nur die aktuelle Version zu sehen ist Teil der Hauptstruktur zu bilden, aber sie können Ich möchte, dass alle Versionen einen Teil dieser Struktur bilden. In diesem Fall könnten Sie Beziehung Eigenschaften verwenden, um die Version anzuzeigen, und alle Seiten Versionen verknüpfen haben aus der Kategorie Knoten:
(V1)
^
|
[:PAGE(v=1)]
|
(pages)-[:PAGE(v=2)]->(V2)
|
[:PAGE(v=3)]
|
v
(V3)
Hier können Sie sofort auf eine bestimmte Version der Seite durchqueren, indem Sie einfach unter Angabe der Version in was du interessiert bist.
Eine dritte Option könnte sein, dass Sie möchten, dass alle älteren Versionen vollständig von der Hauptstruktur getrennt sind. Dazu können Sie mehrere Kategorieknoten verwenden, einen für (current_pages)
und einen weiteren für (old_pages)
. Da jede Seite durch eine neue Version ersetzt wird, wird sie von der früheren Kategorie getrennt und stattdessen mit dieser verlinkt. Dies würde eher ein "Archiv" -Typ von System bilden, wo die älteren Versionen sogar in eine separate Datenbankinstanz verschoben werden könnten.
So haben Sie diese drei Optionen, plus mehr, an die ich nicht gedacht habe! Neo4j ermöglicht Ihnen eine große Flexibilität mit dieser Art von Design und es gibt absolut keine "richtige" Antwort. Wenn Sie jedoch keine davon inspirieren, posten Sie etwas mehr Informationen über Ihre Domain, damit die Antwort besser auf Ihre Bedürfnisse zugeschnitten werden kann.
Cheers, Nige
Sie könnten auch von der anderen Seite nähern:
(pages)-[:VERSION]->(V1)-[:VERSION]->(V2)-[:VERSION]->(V3)
^ ^
| |
category current
node version of page
Vorteil: Wenn Sie eine neue Version erstellen, fügen Sie es nur am Ende der Kette, kein muss es zwischen der (Seite) und der aktuellen Version "einfügen".
Nachteil: Sie können nicht einfach alte Versionen wegwerfen, es sei denn, Sie rekonstruieren die Kette. Aber das ist wahrscheinlich keine häufige Operation.
- 1. Wie implementiere ich JDatePicker
- 2. Wie implementiere ich IEnumerable?
- 3. Wie implementiere ich `prepareForReuse`?
- 4. Wie implementiere ich jquery.sound.js?
- 5. Wie implementiere ich IValidatableObject?
- 6. Wie implementiere ich Polymorphie mit std :: shared_ptr?
- 7. Wie implementiere ich Reader mit freien Monaden?
- 8. Wie implementiere ich einen Comparator mit Generics?
- 9. Wie implementiere ich einen Sprachwechsler?
- 10. Wie implementiere ich eine Delegiertenfabrik?
- 11. Wie implementiere ich bedingtes CSS?
- 12. Wie beschneide ich alte Revisionen in Subversion?
- 13. Wie Revisionshistorie anzeigen wie Revisionen
- 14. Wie implementiere ich die erweiterte Suche mit Operatoren mit pg_search?
- 15. Wie implementiere ich FAQ zu Bot Framework?
- 16. Wie implementiere ich facebook ähnliche Funktionen?
- 17. Wie implementiere ich jQuery Sifr Plugin richtig?
- 18. Wie implementiere ich Zip-Funktionalität in VBA?
- 19. Wie implementiere ich andere Layouts als defaultLayout
- 20. Wie implementiere ich Voice-Chat in Kakao?
- 21. Wie implementiere ich Versandtabellen in Perl?
- 22. Wie implementiere ich Doinbackground Callback-Methode
- 23. Wie implementiere ich die Fehlerbehandlung in Grails?
- 24. Wie implementiere ich das Copy-Merkmal?
- 25. Wie implementiere ich dieses Ähnlichkeitsmaß in Python?
- 26. Wie implementiere ich acts_as_follower in Kommentaren?
- 27. Wie implementiere ich Caching auf unveränderliche Weise?
- 28. Wie implementiere ich virtuelle Methoden in Implementierungsdateien?
- 29. Wie implementiere ich einen personalisierten Event-Stream?
- 30. Wie implementiere ich RingtonePreference in PreferenceFragmentCompat?
Danke, das hat mich auf den richtigen Weg gebracht. Ich denke, ich werde die beiden Ansätze miteinander kombinieren, da ich für einige Zugriffsarten immer die aktuelle Version benötige (dh ich werde eine '[: CURRENT]' Art von Beziehung erstellen, um das zu beschleunigen), aber für andere muss ich Abfrage einer bestimmten Version, also werde ich der Beziehung eine Versionseigenschaft hinzufügen. –
@AaronDigulla Ich möchte ein ähnliches Szenario erstellen. Ich habe zwei Fragen: 1) Nehmen wir an, dass ich einige versionierte Knoten eines "Car" speichern möchte und dass ich einen Index auf das Feld "carId" (UUID) gesetzt habe. Ist es kein Problem, 3 versionierte Autos zu bekommen, die genau das gleiche indizierte Feld haben (möglicher Konflikt mit einer Abfrage wie "Retrieve the Car 32"?)? 2) Mit Ihrer Lösung "[: CURRENT]" stelle ich mir vor, dass Sie bei jeder neuen Version die vorherige '[: CURRENT]' - Beziehung unterbrechen müssen, um auf die neue 'Car' - Version zu zeigen, und diese mit einer anderen symbolisiert' [: PREVIOUS] 'Beziehung zum vorherigen' Auto'? – Mik378
Für Ihre erste Frage würde ich überlegen, ob die UUID ein unveränderliches Element darstellt, d. H. Eine Kombination aus Auto + Version.Jede Revision würde dann eine neue UUID erstellen, und diese könnten dann verkettet werden, um den Versionsverlauf darzustellen. Für Ihre zweite Frage: Ja - die Beziehungen müssten für jede neue Version, die angezeigt wird, gebrochen und neu erstellt werden (ähnlich wie beim Einfügen eines Elements in eine verknüpfte Liste). –