Se ha desarrollado una librería Java que utilizará Neo4j como acceso datos (BD embebida, funcionará en local).
La librería consta de 3 partes bien diferenciadas:
-Servicio
-Wrappers
-DAO
El DAO centraliza todos los métodos que actúan directamente contra la BD. Métodos de CRUD de nodos, relaciones e índices.
El servicio será el interfaz principal que el desarrollador de la aplicación utilizará. Consta de métodos de creación del grafo a partir del modelo de datos GedcomX, y métodos de búsqueda de nodos/relaciones. Los tipos de búsquedas que se podrán invocar serán 3:
-Búsquedas predeterminadas (queries cypher guardadas)
-Búsquedas sobre los atributos (utilizarán los índices de Neo4j)
-Búsquedas dinámicas (traversal de Neo4j)
Por último, los wrappers son objectos que nos ayudan a interactuar con los nodos del grafo. Tienen todos los métodos que podemos invocar sobre cada tipo de nodo: modificación de atributos, validación, resolución de relaciones con otros nodos, eliminación controlada de nodos y dependencias, etc. Los wrappers no mantienen el estado, y dependen de la API de Neo4j para todas las operaciones. Esto penaliza ligeramente el rendimiento, pero será inapreciable ya que suponemos que Neo4j utiliza algún tipo de cache. A cambio, facilita muchísimo la manipulación de los nodos, la seguridad y consistencia de los nodos. Los wrappers también facilitan la creación de nodos a partir de un objecto GedcomX y la creación posterior de objectos GedcomX a partir de los datos del grafo.
El modelo de datos utilizado es el gedcomx adaptado a grafos:
https://github.com/FamilySearch/gedcomx/blob/master/specifications/conceptual-model-specification.md
Modelo de nodos.
https://docs.google.com/file/d/0B6umBbeGBIAtb0xYM3FhNGw2QTQ/edit?usp=sharing
Se han utilizado las dependencias siguientes:
-Reflections: utilizada para cargar en runtime todos los tipos de wrappers implementados. Ésto nos permite añadir nuevos wrappers de una manera más simple.
-Guice: Un Spring lightweight . Inyección de dependencias e interceptores. Ayuda a controlar la instanciación e independencia de los diferentes módulos de la librería. Mejora el diseño.
No hay comentarios:
Publicar un comentario