domingo, 21 de abril de 2013

Capa de presentación

Para la capa de presentación utilizaremos la librería js d3:
http://d3js.org/

Mediante dicha librería y una interfaz REST de nuestros métodos de manipulación y búsqueda sobre los datos del graf, podremos realizar la capa de presentación de un modo ágil y rápido.

Bastará con adaptar nuestros datos de nodos y relaciones a un formato JSON predeterminado por d3 e implementar el web service REST con todos los métodos necesarios. Nos podrán ayudar:
-GSON (transformación de objetos a formato JSON)
-Spring RESTful services (una opción para crear el WS REST)

La aplicación mostrará en todo momento el grafo, mientras nos permite realizar otras operaciones:
-Permitirá ejecutar los 3 tipos de búsquedas descritos en la entrada anterior, mediante varios formularios. Los nodos y/o relaciones devueltos serán resaltados.
-Al pinchar sobre un nodo, podremos ver todas sus propiedades y se abrirá un menú para ejecutar cambios sobre el mismo, por ejemplo crear/eliminar alguna dependencia o atributo.
-Sería muy interesante disponer de herramientas de visualización del grafo. Por ejemplo, resaltar u ocultar un determinado tipo de relación o nodo.

El modelo de datos GedcomX es bastante completo y complejo. Por ello, creemos que sería necesario mostrar al usuario una versión simplificada del mismo. Tenemos varias opciones, y conforme vaya conociendo la librería d3 podrían aparecer nuevas opciones o descartar otras:
-Resaltar los nodos más importantes y sus relaciones: Persons y Relationships.
-Ocultar nodos menos importantes.
-Mostrar una capa de abstracción sobre el grafo original. El nodo Person sería un "supernodo". Al pinchar sobre Person, veríamos el detalle del subgrafo Person (Names, Identifiers, Facts...).


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.