COMPARATIVO BASE DE DATOS RELACIONALES Y BASE DE DATOS ORIENTADA A
GRAFOS
EDGAR DUVAN LEAL ROPERO WILMER ANDRES MANTILLA SUAREZ
UNIVERSIDAD DE PAMPLONA FACULTAD DE INGENIERIAS Y ARQUITECTURAS
INGENERIA DE SISTEMAS PAMPLONA, NORTE DE SANTANDER
SEPTIEMBRE 22 2014
TABLA DE CONTENIDO
1. INTRODUCCION ................................................................................................................... 4
4
2. MARCO TEORICO................................................................................................................ 5
3. BASE DE DATOS RELACIONAL RDBM ........................................................................... 6
3.1 Construcción de un modelo relacional .......................................................................... 6
3.2 CREACION UNA BASE DE DATOS MODELO RELACIONAL .................................... 7
4. LENGUAJE RELACIONAL SQL ......................................................................................... 8
Crear un esquema RDBM ......................................................................................................... 8
Crear un tabla RDBM ................................................................................................................ 8
Insersion de datos RDBM ......................................................................................................... 8
Actualizar RDBM ....................................................................................................................... 8
Restricciones RDBM ................................................................................................................. 9
Relaciones RDBM ..................................................................................................................... 9
5. NEO4J BASE DE DATOS ORIENTADA A GRAFOS ....................................................... 10
5.1 Rendimiento ................................................................................................................ 10
5.2 Flexibilidad ................................................................................................................... 10
5.3 Modelo orientados a grafos ........................................................................................ 11
5.4 Construcción de un modelo de grafos ........................................................................ 11
5.5 CREAR DE UN GRAFO NEO4J ................................................................................. 12
6. LENGUAJE PARA GRAFOS ............................................................................................ 13
6.1 CYPHER QUERY LANGUAGE (CQL) ........................................................................ 13
6.1.1 Crear un schema NEO4J .................................................................................... 13
6.1.2 Crear un Nodo NEO4J ........................................................................................ 13
6.2 CLAUSULAS EN CYPHER ......................................................................................... 14
7. ACTUALIZACION NEO4J .................................................................................................. 15
7.2 ELIMINACION CQL ..................................................................................................... 15
7.3 NEO4J RESTRICCIONES .......................................................................................... 15
7.3.1 UNIQUES PACIENTE ......................................................................................... 15
7.4 FUNCIONES ............................................................................................................... 15
7.4.1 RETORNAR UNA PROPIEDAD DEL NODO...................................................... 15
7.4.2 ASIGNAR POR DEFECTO HORA Y TIEMPO TIMESTAMP ............................. 15
7.5 RELACIONES ENTRE NODOS ................................................................................. 16
7.5.2 EL CONSULTORIO GENERA UNA CONSULTA AL PACIENTE .......................... 16
7.5.3 EL PACIENTE INGRESA AL CONSULTORIO EL CONSULTORIO GENERA LA
CONSULTA QUE EL MEDICO ATIENDE .............................................................................. 16
8. CONSULTAS NEO4J ........................................................................................................ 16
8.1 Listar los pacientes de codigo menor o igual a 555555555 ........................................ 16
8.2 Listar el medico con codigo 329 .................................................................................. 16
8.3 LISTAR LOS PACIENTES QUE HAN INGRESADO AL CONSULTORIO ................. 16
8.4 LISTAR LOS PACIENTES QUE HAN SIDO ATENDIDOS POR UN MEDICO .......... 16
9. CONCLUSIONES ................................................................................................................ 17
10. BIBLIOGRAFIA ................................................................................................................... 18
1. INTRODUCCION
Para hablar de Neo4j se empezara comentando la propia definición que se le da en internet,
relacionando el termino con una base de datos orientada a grafos escrita en Java, primamente
y para que este concepto se clarifique al referirnos se puede decir que la información se
almacena de forma relacionada formando un grafo dirigido entre los nodos y las relaciones
entre ellos. Esta base de datos muy fácilmente se puede manejar con múltiples lenguajes
como Java, PHP, Ruby, .Net, Python, Node, Scala, etc. Ya su vez se utiliza en redes sociales a
manera de ejemplo.
Lo que hace a esta base de datos ser interesante con respecto a las otras es que puede
simplificar de manera rápida el trabajo a la hora de que crea nodos y estos se relacionan entre
si ampliando el concepto de grafo, es importante mencionar que las relaciones en Neo4J son
unidireccionales; van de un nodo a otro. Pero no es necesario crear relaciones en el sentido
opuesto si no es necesario, ya que se pueden buscar las relaciones indicando el sentido de las
mismas. Para esto hay que considerar que la dirección se define desde el nodo que estamos
utilizando.
Cypher es el lenguaje utilizado para utiliza tanto los índices como los "traversals" para obtener
datos. En la documentación de esta base de datos se encontró el ejemplo de obtener todas las
películas rodadas en el año 1999 mediante un acceso al índice de propiedades de películas, y
luego mediante un "traversal" obtenemos las mascotas de los actores de dichas películas.
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.
2. MARCO TEORICO
Neo4j es una base de datos de grafos diseñada y construida para ser robusta y optimizada
para grafos en vez de tablas es un tipo de sistema de administración de bases de datos de
grafos. Esta herramienta permite diseñar grafos gráficamente. Permite almacenar billones de
nodos y aristas. Los nodos y aristas pueden contener propiedades y valores.Neo4j es más
enfocada a almacenar relaciones entre valores lo cual permite almacenar gran cantidad de
datos-
Hay varios lenguajes que interoperan con Neo4j: Cypher, Consola de Ruby, Gremlin, interface
REST, los cuales permiten realizar consultas tales como los nodos que cumplen con una
condición, los nodos relacionados con una arista, aristas conectados con un nodo, el camino de
acceso entre dos nodos (path) y aplicar funciones de mapeo y reducción. Para acelerar las
búsquedas Neo4j permite construir índices por valores de claves e incorpora Lucene para
construir índices invertidos.
Neo4j es un sistema de administración de bases de datos que garantiza las propiedades de
aislamiento, consistencia, atomicidad y permanencia de una transacción (Redmond et ál.,
2012).
3. BASE DE DATOS RELACIONAL RDBM
3.1 Construcción de un modelo relacional
El modelo relacional se basa en la noción matemática de relación. Codd y otros extendieron la
noción para aplicarla al diseño de bases de datos. Por ende, fueron capaces de sacar ventaja
del poder de la abstracción matemática y de la expresividad de la notación matemática para
desarrollar una estructura simple, pero poderosa para las bases de datos, Su idea fundamental
es el uso de "relaciones". Estas relaciones podrían considerarse en forma lógica como
conjuntos de datos llamados "tuplas". Esto es pensando en cada relación como si fuese una
tabla que está compuesta por registros (las filas de una tabla), que representarían las tuplas,
y campos (las columnas de una tabla). La información puede ser recuperada o almacenada
mediante "consultas" que ofrecen una amplia flexibilidad y poder para administrar la
información.
Ilustración 1 Modelo relacional Consulta Medica
3.2 CREACION UNA BASE DE DATOS MODELO RELACIONAL
Nuestro sistema gestor de base de datos elegido es posgrest,procedemos a crear una nueva
base de datos llamada entidad
Ilustración 2 Nueva Base de Datos RDBM
Ilustración 3 Base de datos Creada correctamente
4. LENGUAJE RELACIONAL SQL
El SQL: (lenguaje estructurado de consulta), es el lenguaje estándar ANSI/ISO de
definición, manipulación y control de bases de datos relacionales. Es un lenguaje
declarativo: sólo hay que indicar qué se quiere hacer
Crear un esquema RDBM
CREATE SCHEMA Persona;
Crear un tabla RDBM
CREATE TABLE "Persona"."paciente" (
"pac_codigo" varchar(20) COLLATE "default" NOT NULL,
"pac_nombre" varchar(30) COLLATE "default" NOT NULL,
"pac_apellido" varchar(30) COLLATE "default" NOT NULL,
"pac_regimen" varchar(20) COLLATE "default" NOT NULL,
"pac_sexo" varchar(10) COLLATE "default" NOT NULL
)
Insersion de datos RDBM
INSERT INTO "Persona"."paciente" VALUES ('10546', 'CARLOS', 'ALBERTO', 'SUBSIDIADO',
'MASCULINO');
INSERT INTO " Persona "."paciente" VALUES ('10547', 'PEDRO', 'ROCIO', 'contribuyente', 'masculino');
Actualizar RDBM
UPDATE "public"."paciente" SET "pac_regimen"='contribuyente' WHERE ("pac_codigo"='10546')
Eliminar RDBM
DELETE FROM "public"."paciente" WHERE ("pac_codigo"='10547')
Restricciones RDBM
ALTER TABLE "public"."paciente" ADD CHECK ((lower((pac_sexo)::text) ~~ '%masculino%'::text) OR
(lower((pac_sexo)::text) ~~ '%femenino%'::text));
ALTER TABLE "public"."paciente" ADD CHECK ((lower((pac_regimen)::text) ~~ '%contribuyente%'::text)
OR (lower((pac_regimen)::text) ~~ '%subsidiado%'::text));
Relaciones RDBM
ALTER TABLE "public"."paciente" ADD PRIMARY KEY ("pac_codigo");
CREATE TABLE "public"."consultorio" (
"con_codigo" varchar(20) COLLATE "default" NOT NULL,
"con_cama" varchar(30) COLLATE "default" NOT NULL,
"con_habitacion" varchar(30) COLLATE "default" NOT NULL,
"con_fecha" date DEFAULT ('now'::text)::date,
"con_hora" time(6) DEFAULT ('now'::text)::time with time zone,
"pac_codigo" varchar(20) COLLATE "default" NOT NULL
)
ALTER TABLE "public"."consultorio" ADD FOREIGN KEY ("pac_codigo") REFERENCES
"public"."paciente" ("pac_codigo") ON DELETE RESTRICT ON UPDATE CASCADE;
5. NEO4J BASE DE DATOS ORIENTADA A GRAFOS
5.1 Rendimiento
Las bases de datos relacionales, cuyos rendimientos se deterioran en las consultas intensivas
y con un procesamiento de datos muy alto; las bases de datos con grafos ofrecen un
rendimiento que tiende a permanecer constante, así como el crecimiento de los datos. Esto se
debe a que las consultas se realizan de manera gráfica, recorriendo entre las relaciones
(aristas)que posea la base. Como resultado, el tiempo de ejecución de esta consulta es
proporcional solo al tamaño de la parte grafica que tenga que recorrer para satisfacer esta
consulta, en lugar del tamaño global del grafo
El conjunto de datos se hace más grande, el rendimiento tiende a permanecer, esto es porque
las consultas se localizan en una porción del grafo dando como resultado que el tiempo de
ejecución de la consulta es directamente proporcional a la parte del grafo atravesado para
satisfacer esa consulta ya que no atraviesa el grafo en general
5.2 Flexibilidad
Al desarrollador de aplicaciones le interesa conectar los datos permitiendo una estructura
donde el esquema que surja del conjunto de interés pueda crecer sin ningún problema.
Las bases de datos orientadas a grafos abordan directamente este tema, porque su modelo de
datos se expresa y se acomoda a las necesidad es del negocio de tal manera que se permite
moverá mayor velocidad en el problema. Los grafos son aditivos, lo que significa que
se pueden añadir nuevos tipos de relaciones, y nuevos nodos y sub-grafos a una estructura ya
existente sin alterar las consultas y la funcionalidad de la aplicación. Y, en general, esto tiene
consecuencias positivas para el desarrollador debido a la flexibilidad del modelo con grafos, lo
que también tiene tendencia a realizar menos migraciones para poder reducirlos gastos de
mantenimiento y el riesgo que conlleva.
5.3 Modelo orientados a grafos
Ilustración 4 Modelo orientado a grafos Consulta Medica
5.4 Construcción de un modelo de grafos
Los grafos se construyen con nodos, relaciones y propiedades, Donde los nodos contienen a
las propiedades Y estas son almacenadas en pares key-values (clave-valor) los key son
cadenas y los valúes son arbitrarios o referentes al tipo de dato.
Conectar relacionar y conectar los nodos, estos siempre tiene una dirección y una etiqueta o
descripción (label) que añade semántica y claridad a la estructuración de los nodos
Al igual que los nodos, las relaciones también pueden tener propiedades. La posibilidad de
añadir propiedades a relaciones es particularmente útil para proporcionar metadatos
adicionales para el gráfico algoritmos, añadiendo semántica adicional a las relaciones
(incluyendo la calidad y Peso), y para limitar las consultas en tiempo de ejecución
5.5 CREAR DE UN GRAFO NEO4J
1.
En una instalación típica de Windows a continuación se nos abrirá el siguiente panel donde
se nos presenta la opción de comenzar a correr nuestro servidor local, por defecto trae
asignado una carpeta llamada default donde se almacenaran cada uno de los nodos
creado, vamos a cambiar de acuerdo a nuestro modelo a desarrollar
Ilustración 6 Crear una carpeta contenedora Entidad
Creamos una nueva carpeta llamada entidad la cual será la contenedora o por decirse
grafo que almacenara nuestros nodos y propiedades, continuación la seleccionaremos y
procedemos a inicializar el servidor
Ilustración 7 Inicialización del servidor
Ilustración 5 Ventana de administración NEO4J en Windows
6. LENGUAJE PARA GRAFOS
6.1 CYPHER QUERY LANGUAGE (CQL)
Cypher es un (pero compacto) de base de datos gráfica lenguaje de consulta expresivas sin
duda el idioma más fácil consulta gráfica para aprender, y es un gran base para aprender
acerca de los grafos. Cypher está diseñado para ser leído y entendido por los desarrolladores,
profesionales de bases de datos con facilidad, y accionistas de la empresa. Su facilidad de uso
se deriva del hecho que concuerda con la forma en que intuitivamente describimos gráficos
usando diagramas
6.1.1 Crear un schema NEO4J
Neo4j posee una noción de esquemas basado en los label. Una persona puede ser presentada
en un patrón como (person:Person), donde person es el label del nodo. De esta forma los
label funcionan de una manera similar al concepto de esquema
6.1.2 Crear un Nodo NEO4J
Los datos de grafos se almacenan en tuplas con múltiples atributos. Se pueden representan como grafos datos de mapas de rutas, redes sociales, datos de recursos y sus relaciones.
CREATE (paciente:Paciente{ pac_codigo:"1094270086",pac_nombre:"Mauricio",
pac_apellido:"Pedraza", pac_regimen:"subsidiado", pac_sexo:"masculino" })
CREATE (consultorio:Consultorio { con_codigo: '5555', con_cama: 'principal', con_habitacion: 'HBI001',
con_fecha: '01-08-2014',con_hora: '02:000',pac_codigo: '55'})
CREATE (medico:Medico{ med_codigo:329,med_nombre:"Jairo", med_apellio:"Varela",
med_telefono:3107546622 })
6.2 CLAUSULAS EN CYPHER
START: MATCH RETURN WHERE CREATE and CREATE UNIQUE DELETE SET FOREACH UNION WITH
7. ACTUALIZACION NEO4J
7.1 NODO PACIENTE
MATCH (paciente{ pac_codigo: "1094270086" }) SET paciente.pac_regimen = 'contributivo' RETURN
paciente
MATCH (consultorio{ con_codigo: '5555' }) SET consultorio.con_cama = '20' SET consultorio.pac_codigo
= ' 1094270086' RETURN consultorio
7.2 ELIMINACION CQL
MATCH (paciente:Paciente { pac_codigo:"1094270086"}) REMOVE paciente.pac_sexo RETURN paciente
MATCH (paciente:Paciente { pac_codigo:"1094270086"}) DELETE paciente
7.3 NEO4J RESTRICCIONES
7.3.1 UNIQUES PACIENTE
CREATE CONSTRAINT ON (paciente:Paciente) ASSERT paciente.pac_codigo IS UNIQUE
NODO REPETIDO ME DEVUELVE UN ERROR
CREATE (paciente:Paciente{ pac_codigo:"1094270086",pac_nombre:"Mauricio",
pac_apellido:"Pedraza", pac_regimen:"subsidiado", pac_sexo:"masculino" })
AL VIOLAR LA RESTRICCION MOSTRARA EL SIGUIENTE ERROR
Neo.ClientError.Schema.ConstraintViolation
7.4 FUNCIONES
7.4.1 RETORNAR UNA PROPIEDAD DEL NODO
MATCH (consultorio { con_codigo:"5555" })
RETURN consultorio.con_habitacion
7.4.2 ASIGNAR POR DEFECTO HORA Y TIEMPO TIMESTAMP
MERGE (consultorio:Consultorio { con_codigo: '5555'})
ON MATCH SET consultorio.con_fecha = timestamp(),consultorio.con_hora =timestamp()
RETURN consultorio
7.5 RELACIONES ENTRE NODOS
Al relacionar el campo pac_codigo del nodo consultorio con pac_codigo de paciente se hace
innecesario esta propiedad en consultorio, ya que al momento de relacionar se crear un nuevo
nodo que contiene ambas relaciones.
7.5.1 EL PACIENTE INGRESA AL CONSULTORIO
MATCH (paciente:Paciente),(consultorio:Consultorio) WHERE consultorio.con_codigo = '5555' AND paciente.pac_codigo = '1094270086' CREATE (paciente)–[ingresa:INGRESA{ing_cod:8,con_codigo: consultorio.con_codigo,pac_codigo: paciente.pac_codigo }]->(consultorio) RETURN ingresa
7.5.2 EL CONSULTORIO GENERA UNA CONSULTA AL PACIENTE
MATCH (paciente)-[ingresa: INGRESA]->(consultorio) WHERE ingresa.pac_codigo = '1094270086' AND ingresa.con_codigo = "5555" CREATE (consultorio)–[genera:GENERA{gen_cod: timestamp() }]->(consulta:CONSULTA{con_codigo:'5555',pac_codigo:ingresa.pac_codigo}) RETURN ingresa,genera,consulta
7.5.3 EL PACIENTE INGRESA AL CONSULTORIO EL CONSULTORIO GENERA LA
CONSULTA QUE EL MEDICO ATIENDE MATCH (consulta:CONSULTA),(medico) WHERE medico.med_codigo = 329 AND consulta.con_codigo ='5555' CREATE (consulta)<–[atiende:ATIENDE{ati_cod: timestamp()}]– (medico) RETURN consulta,atiende,medico
8. CONSULTAS NEO4J 8.1 Listar los pacientes de codigo menor o igual a 555555555 MATCH (paciente) WHERE paciente.pac_codigo <= '555555555' RETURN paciente.pac_codigo
8.2 Listar el medico con codigo 329 MATCH (medico) WHERE medico.med_codigo = 329 RETURN medico
8.3 LISTAR LOS PACIENTES QUE HAN INGRESADO AL CONSULTORIO MATCH (paciente)–[ingresa:INGRESA]->consultorio RETURN paciente,consultorio
8.4 LISTAR LOS PACIENTES QUE HAN SIDO ATENDIDOS POR UN MEDICO MATCH (paciente)–[ingresa]-> (consultorio) – [genera] -> (consulta) <- [atiende] –(medico) RETURN paciente
9. CONCLUSIONES Se a podido concluir como funciona Neo4j, la creación de un grafo y el lenguaje Cypher el cual se basa principalmente en SQL, lo cual resulta familiar al trabajar y se hace simple la sintaxis en cuanto se va ejecutando, las consultas ya se pueden ir realizando a manera que se trabaja y de acuerdo a las necesidades que se vengan presentando. Neo4j a manera de ejemplo y para simplificar almacena dos cosas tanto nodos, como
relaciones. Un nodo puede ser un usuario y a relacionan vendría siendo cuando al usuario le
gusta el estado de otro, esto se logra teniendo una base de datos, a la cual se le debe indicar
el directorio donde van a estar contenidos todos los archivos, si este no existe pues se crea y
este es una base, si existe lee los datos encontrados ahí.
El rendimiento Neo4j es altamente dependiente de almacenamiento en caché, esto limita
mucho a Neo4j pero a la vez ayuda para que sea una base de datos altamente funcional y muy
utilizada por diferentes empresas y negocios por la agilidad de la búsqueda de la información,
también porque es de uso libre.
10. BIBLIOGRAFIA
Robinson, I., Webber, J., & Efrem, E. (2013). Graph databases. Sebastopol, Calif.:
O’Reilly Media.
50 Shades of Graph: How Graph Databases Are Transforming Online Dating. (n.d.).
Forbes. Retrieved February 16, 2014.
Guía de referencia: http://docs.neo4j.org/chunked/milestone/preface.html´
Guía de neo4j: http://docs.neo4j.org/refcard/2.1/
Recursos de aprendizaje http://www.neo4j.org/learn
Charla de Michael Huger - Neo4j for Java Developers: https://www.youtube.com/watch?v=FCp68iGo0pY