martes, 29 de enero de 2013

Introducción a Neo4j

Neo4j es un sistema de base de datos en grafo. Algunas de las ventajas que propone este paradigma son:

  • Escalabilidad
  • Alto rendimiento
  • Lenguaje de consultas "human friendly"

Los grafos se componen de nodos y relaciones. Ambos tienen propiedades. Las consultas sobre el grafo se basan en "traversals" que serían los caminos que unen los distintos nodos. Por último, para realizar búsquedas sobre nodos y relaciones, Neo4j utiliza índices sobre sus propiedades.

Cypher, el lenguaje formal utilizado para hacer las consultas, utiliza tanto los índices como los "traversals" para obtener datos.

Por ejemplo, obtenemos todas las películas rodadas el año 1999 mediante un acceso al índice de propiedades de películas, y luego mediante un "traversal" obtenermos las mascotas de los actores de dichas películas.

Cypher es un lenguaje bastante intuitivo y potente, y permite un grado de abstracción mayor que el SQL. De hecho, anunciar la consulta con lenguaje natural es una buena manera de empezar a realizar la query.

Mascotas de los actores que trabajaron en películas rodadas en 1999

La consulta final sería algo parecido a:


START movie=node:node_auto_index(year="1999") 
MATCH movie<-[:ACTS_IN]-actor-[:OWNS]->mascota 
RETURN mascota;


Uno de nuestras tareas será identificar qué elementos representamos como propiedades y qué elementos representamos como nodos. Por ejemplo: un nodo persona puede tener una propiedad "oficio" con valor "albañil", pero también podemos tener un nodo "albañil" y una relación -[:OFICIO]-> entre la persona y el nodo de "albañil". Ésto tendrá impacto en el rendimiento y en las consultas.

Neo4j está desarrollado en Java y se puede utilizado mediante su API y como componente externo, mediante una interfaz REST. Neo4j utiliza el sistema de ficheros para guardar todos su datos, que pueden ser fácilmente exportados e importados de una aplicación a otra.

Neo4j ha desarrollado un servidor que permite hacer operaciones básicas con los grafos, como exportar/importar, visualizar, manipular, ejecutar consultas en una consola, etc. Éste será el primer paso antes de implantarlo en un sistema propio.

Existe un proyecto de Spring que facilita la implementación de la capa de datos con Neo4j. Habrá que estudiarlo, no nos interesa comprometernos demasiado con un determinado framework. La solución debe ser reutilizable e independiente. Cuando lleguemos a la fase de definir el alcance de la implementación de nuestra librería gedcom-neo4j lo estudiaremos.

Enlaces útiles:
Neo4j
Documentación
Cheatsheet
Proyecto Spring
Blog
Videos




jueves, 24 de enero de 2013

Ficheros de ejemplo

Tenemos ficheros de ejemplo GEDCOM5.5 en el siguiente enlace:
http://www.geditcom.com/gedcom.html

Mediante la librería gedcom5-conversion, utilizando como el fichero de entrada "TGC551.ged" (descargado del anterior enlace), obtenemos el fichero GEDCOMX:
Fichero

Esto de momento nos sirve para familiarizarnos con la arquitectura GEDCOMX con un ejemplo bastante completo.

Falta comprobar cómo funcionan los links a las fuentes del fichero 5.5 y cómo se utilizarían en el fichero X.

sábado, 19 de enero de 2013

Primeros pasos con las librerías GEDCOM

Para empezar a utilizar las librerías Gedcom y GedcomX sólo tenemos que crear un proyecto Maven y configurar los siguientes repositorios:


<repositories>
<repository>
<id>gedcomx-release-repo</id>
<name>GEDCOM X Release Repository</name>
<url>https://repository-gedcom.forge.cloudbees.com/release/</url>
</repository>
<repository>
<id>gedcomx-snapshot-repo</id>
<name>GEDCOM X Snapshot Repository</name>
<url>https://repository-gedcom.forge.cloudbees.com/snapshot/</url>
</repository>
</repositories>

Y tenemos que añadir la dependendia:


<dependency>
<groupId>org.gedcomx</groupId>
<artifactId>gedcom5-conversion</artifactId>
<version>${gedcom5-conversion.version}</version>
</dependency>

Esta dependencia incluye todas las librerías que necesitamos. Las que utilizaremos directamente son:
  • gedcom-fileformat-java
  • Gedcom
  • gedcom5-conversion
Las primeras pruebas que he realizado incluyen los casos que detallo a continuación:

Lectura de fichero Gedcom5.5 (Gedcom)
El proyecto Gedcom y el proyecto Gedcom5-conversion incluyen varios ficheros de test .ged que he utilizado. Ademas, he encontrado ficheros de stress que nos ayudarán a comprobar todos los tags del estándar. El resultado de leer los ficheros es un modelo de datos que consiste en:
Personas
Familias
Fuentes
Repositorios

Escritura de fichero Gedcom5.5 (Gedcom)
Teniendo el fichero leído, comprobamos la escritura. He apreciado varios cambios de orden en los tags, pero ahora mismo no sé decir si eso provocaría inconsistencias.

Lectura/escritura de fichero GedcomX (gedcom-fileformat-java)
Este proceso sólo tiene una peculiaridad, que es el modelo conceptual. En GedcomX sólo existen:
Personas
Relaciones
Agentes
Fuentes
Todos estos tipos serían lo que llamamos "entidades Gedcom X". Además, tenemos los atributos, tanto globales como de cada entidad en particular (pares clave-valor). El proceso de lectura y escritura de fichero .gedx es bastante simple y no se aprecia ninguna inconsistencia en los datos de salida. El fichero .gedx se puede abrir como un fichero .jar. 
Será importante encontrar ficheros .gedx de stress. 

Paso de Gedcom5.5 a GedcomX (Gedcom y gedcom5-conversion)
Leemos el fichero Gedcom5.5 y lo mapeamos con el modelo de datos GedcomX. El resultado son las entidades GedcomX descritas anteriormente. 

Paso de GedcomX a Gedcom5.5
Este caso NO ESTÁ IMPLEMENTADO en el proyecto gedcom5-converson. Sólo existen mapeadores de modelo 5.5 a X y no a la inversa. Esto nos obliga a tomar una decisión:
  1. Fork del proyecto gedcom5-conversión. Ampliación de funcionalidad creando clases de mapping de entidades X a 5.5 realizando ingeniería inversa del código ya existente.
  2. El proyecto adopta el formato GedcomX como estándar de facto, PERMITIRÁ importar ficheros Gedcom5.5 como funcionalidad "legacy". NO permitirá exportar datos genealógicos en formato 5.5.
  3. Se utilizará el modelo de datos Gedcom que propone el parser Gedcom. NO se utilizará el modelo de datos GedcomX, ni el formato GedcomX de ficheros XML. Sólo se leerán y escribirán ficheros 5.5.

miércoles, 16 de enero de 2013

Introducción a GEDCOM

Una buena introducción al formato GEDCOM la tenemos en la Wikipedia:
http://en.wikipedia.org/wiki/GEDCOM
Y aquí la especificación 5.5:
http://homepages.rootsweb.ancestry.com/~pmcbride/gedcom/55gctoc.htm

Por otra parte, Family Search está desarrollando un nuevo estándar de almacenamiento de datos genealógicos, llamado GEDCOM X:
http://www.gedcomx.org/
El proyecto GEDCOM X consta de varias especificaciones. Entre ellas:
-Modelo conceptual
-Serialización y deserialización en XML
-Fichero GEDCOM X (un .jar con metainformación y ficheros XML)

Los distintos proyectos Family Search están publicados en github. Los más importantes para nosotros son:
https://github.com/FamilySearch/gedcomx - Define el modelo de datos y el estándar XML
https://github.com/FamilySearch/gedcomx-fileformat-java - API JAVA para la lectura y escritura de ficheros GEDCOM X

Ya que el sistema debe leer ficheros GEDCOM 5.5, Family Search desarrolla 2 librerías para el trabajo con dichos ficheros:
https://github.com/FamilySearch/Gedcom - Parser 5.5 (basado en el parser open source de Dallan Quass)
https://github.com/FamilySearch/gedcom5-conversion - Conversión de 5.5 a X

Estas 2 librerías podrán y deberán ser extendidas (github fork) para abarcar el máximo de tags 5.5 (estudiar tags GDS). Podemos ver en el siguiente enlace cual sería la equivalencia de tags 5.5 y tags XML de X seguida en el proyecto gedcom5-conversion:
http://www.gedcomx.org/Legacy-GEDCOM-Migration-Path.html


Alcance del proyecto

El primer paso será realizar un documento (versionado en github) con el ALCANCE del proyecto.

La primera versión nace de los distintos emails y de la reunión de inicio que hemos mantenido los directores y yo. La redacción será enteramente mía. Después de la primera versión, será interesante que tanto yo como los directores vayamos opinando sobre el mismo, para añadir o eliminar cualquier punto que acordemos.

Para ello propongo que el fichero sea fácilmente editable (texto plano), que se estructure como índice simple y que los directores tengan acceso al repo de github para su edición, si lo creen necesario.

https://github.com/aserrallerios/gengraph-documentation/