Tengo un objeto y necesito mantener un historial de todos los cambios realizados en él. ¿Cómo implementaría esto usando neo4j?¿Cómo implemento las revisiones con neo4j?
Respuesta
Al igual que con un RDBMS, dependerá de su dominio y los requisitos de consulta de datos.
¿Su aplicación requiere acceso regular a todas las versiones del objeto o, por lo general, solo a la más reciente, con las versiones anteriores disponibles a través de la actual? Un ejemplo de esto podría ser páginas en Wikipedia. Como en el ejemplo, supongamos que tenemos una página que se encuentra en la versión 3. Entonces, podríamos modelar esto de la siguiente manera:
(pages)-[:PAGE]->(V3)-[:PREV]->(V2)-[:PREV]->(V1)
^ ^
| |
category current
node version of page
Aquí, sólo la versión actual se puede ver a formar parte de la estructura principal, pero es posible que deseamos permitir que todas las versiones formen parte de esa estructura. En este caso, se puede utilizar las propiedades de relación para indicar la versión y tienen todas las versiones de enlace de página de la categoría de nodo:
(V1)
^
|
[:PAGE(v=1)]
|
(pages)-[:PAGE(v=2)]->(V2)
|
[:PAGE(v=3)]
|
v
(V3)
Aquí, se puede recorrer de inmediato a una versión particular de la página simplemente especificando la versión en cuál estás interesado
Una tercera opción podría ser que desee que todas las versiones anteriores estén completamente separadas de la estructura principal. Para esto, puede usar varios nodos de categoría, uno para (current_pages)
y otro para (old_pages)
. Como cada página es reemplazada por una nueva versión, se desvincula de la categoría anterior y en su lugar se vincula a la última. Esto formaría más un tipo de sistema de "archivo" en el que las versiones anteriores podrían incluso moverse a una instancia de base de datos separada.
¡Así que tienes estas tres opciones, además de más de las que no he pensado! Neo4j te permite una gran flexibilidad con este tipo de diseño y no hay absolutamente ninguna respuesta "correcta". Sin embargo, si ninguno de estos te inspira, publica un poco más de información sobre tu dominio para que la respuesta se pueda adaptar más a tus necesidades.
Saludos, Nige
También puede acercarse a ella desde el otro lado:
(pages)-[:VERSION]->(V1)-[:VERSION]->(V2)-[:VERSION]->(V3)
^ ^
| |
category current
node version of page
ventaja: cuando se crea una nueva versión, que acaba de añadir al final de la cadena, sin necesita "insertarlo" entre la (página) y la versión actual.
desventaja: no puede tirar las versiones antiguas, a menos que reconstruya la cadena. Pero esta probablemente no sea una operación frecuente.
- 1. svn proyectos claros con todas las revisiones
- 2. ¿Cómo ver todas las revisiones en TortoiseSVN?
- 3. ¿Cómo elimino las revisiones antiguas en Subversion?
- 4. revisar las revisiones en postgresql
- 5. Utilice neo4j con R
- 6. ¿Cómo implemento las referencias desnormalizadas en RavenDB?
- 7. ¿Cómo se compara FlockDB con neo4j?
- 8. Cómo determinar las estadísticas de cambio entre las revisiones
- 9. ¿Con qué frecuencia se deberían hacer las revisiones del código?
- 10. Conexión a neo4j con ColdFusion
- 11. Agregando comentarios a las revisiones de SVN
- 12. ¿Cómo implemento IEnumerable?
- 13. Revisiones repetidas de parámetros en las funciones
- 14. Cómo se muestra el historial de revisiones como Revisiones
- 15. Las revisiones de manipulación dentro de Oracle
- 16. ¿Cómo implemento MVCC?
- 17. ¿Cuáles son las ventajas de usar Spring Data neo4j sobre simplemente usar neo4j directamente?
- 18. ¿Cómo implemento las columnas ChangeTime y ChangeUser usando NHibernate?
- 19. ¿Cómo implemento las tablas de envío en Perl?
- 20. cómo saber rápidamente qué archivos difieren en las revisiones mercuriales
- 21. ¿Cómo obtengo una lista de las actualizaciones y revisiones instaladas?
- 22. ¿Cómo configurar neo4j con dBpedia ontop de ruby-on-rails?
- 23. Modelando un árbol ordenado con neo4j
- 24. ¿Cómo implemento las aplicaciones de Windows escritas en MonoDevelop?
- 25. ¿Cómo implemento las aplicaciones en ejecución como modo de administrador?
- 26. Neo4j y django modelos
- 27. ¿Cómo diseñar una base de datos con historial de revisiones?
- 28. ¿Cómo soltar la base de datos incrustada neo4j con java?
- 29. ¿Cómo minimizo el número de cambios entre las revisiones con una nueva salida de doxygen?
- 30. ¿Cómo puedo volver a buscar las revisiones de una rama recién especificada con git-svn
Gracias, eso me puso en el camino correcto. Creo que mezclaré los dos enfoques porque para algunos tipos de acceso, siempre necesito la versión actual (es decir, crearé un tipo de relación '[: CURRENT]' para acelerar eso) pero para otros, necesito consultar una versión específica, así que agregaré una propiedad de versión a la relación. –
@ AaronDigulla Quiero construir un escenario similar. Tengo dos preguntas: 1) supongamos que quiero almacenar algún nodo versionado de un 'Coche' y que tengo un índice colocado en el campo' carId' (UUID). ¿No es un problema terminar con 3 'Car' versionados, teniendo exactamente el mismo campo indexado (conflicto potencial con una consulta como" Retrieve the Car 32 "?)? 2) Con su solución '[: CURRENT]', me imagino que en cada nueva versión, debe romper la relación anterior '[: CURRENT]' para apuntar a la nueva 'Car'version, y esta apuntando con otra' [: PREVIOUS] 'relación en el' Coche' anterior? – Mik378
Para su primera pregunta, consideraría hacer que el UUID represente un elemento inmutable, es decir, una combinación de automóvil + versión.Cada revisión crearía entonces un nuevo UUID y estos podrían ser encadenados para representar el historial de versiones. Para su segunda pregunta: sí, las relaciones deberían romperse y reconstruirse para cada nueva versión que aparezca (de manera similar a insertar un elemento en una lista vinculada). –