domingo, 21 de abril de 2013

Librería de persistencia de GedcomX en grafo

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