Saltar al contenido

\"The most beautiful thing we can experience is the mysterious. It is the source of all true art and sciense\" Albert Einstein

Haciendo querys sobre grafos en Neo4j con Cypher

cypher_small
Cypher es el lenguaje de consultas que utiliza Neo4j para actuar sobre los datos que administra. Cypher está actualmente en desarrollo así que, para obtener mayor estabilidad en la utilización de Neo4j es mejor utilizar las API desarrolladas para interactuar con este.

Para hacer querys con cypher hay que tener en cuenta los siguientes aspectos fundamentales:

  • Tipo de query: Podemos dividir los tipos de query en querys de lectura y querys de escritura. Algunas veces, para escribir sobre la base de datos es necesario hacer lecturas, por lo cual nuestros querys pueden ser también una combinación de querys de lectura y escritura.
  • Inicio del query: El inicio de un query depende de que tipo de query sea. En caso de que sea un query de solo escritura, lo único que se puede hacer es utilizar como inicio una clausula create o create unique para crear nuevos nodos. En cualquier otro caso (un query de lectura o uno hibrido) se deberá empezar con una clausula start la cual identificará el punto de partida en el analisis hecho sobre el grafo cuando se aplican los patrones sobre ellos.
  • Patrones: Son formaciones de caminos sobre el grafo que se pueden dar de acuerdo a relaciones y nodos especificos. Estos caminos tienen un punto (o varios puntos) de partida (tomados en la aplicación de la clausula start y tienen límites (o boundaries), los cuales pueden o no ser explicitos (estar definidos por un identificador). Los patrones empiezan con la clausula match seguida del patron a aplicar sobre la base de datos.
  • Retorno: Al realizar una transacción sobre la base de datos, cuando se lee el grafo se debe usar la clausula return para devolver los valores que se han consultado desde la base de datos.
  • Separación de un query de lectura y uno de escritura: Con la clausula with se hace una separación de la transacción en una parte de lectura y una de escritura.

Veamos estos aspectos con un par de ejemplos siguiendo un grafo formulado en el manual de Neo4j 2.0.0:

 ejemplo2

Obtener los conocidos de los conocidos de David:

start david=node(*) //Comienzo en un nodo identificado con el identificador "david"
match david-[conocidoDavid:KNOWS]->()->[conocidoDeConocidoDeDavid:KNOWS]->conocidoDeConocido //Patron
where david.name = "David" //Selecciona como comienzo solo aquel nodo cuya propiedad "name" sea igual a "David"
return conocidoDeConocido //Clausula de retorno

El query anterior da como resultado los nodos que tienen una relación de salida desde Anders, relación llamada “KNOWS”. Este query es uno de solo lectura. El “*” identifica a todos los nodos, así que la funcion node(*) devuelve todos los nodos en el grafo.

Obtener las relaciones de entrada al nodo cuya propiedad “name” es igual a Ceasar.

start ceasar=node(*)
match ()-[rel]->ceasar //El identificador de la relacion es "rel"
where ceasar.name = "Ceasar"
return rel

Crea un nodo con propiedad “name” igual a “Maria”.

create (n {name:"Maria"}) //Clausula de creacion, el identificador del nodo creado es "n"

Crea una relacion KNOWS con el nodo creado en el query anterior hacia el nodo cuya propiedad “name” es igual a “David”.

start maria=node(*), david=node(*)
match maria, david
where maria.name = "Maria" and david.name = "David"
with maria, david
create maria-[r:KNOWS]->david
return r

Para obtener más información, puede consultar el manual de referencia de Neo4j para cypher (tenga en cuenta la version utilizada de Neo4j).

Para tener una referencia de las clausulas, funciones, operadores existentes, entre otras características de cypher (1.9.3) puede dirigirse aquí.

Anuncios

Neo4j: Instalación

images

NoSQL, una “nueva” forma de pensar una base de datos.

Las bases de datos NoSQL son aquellas bases de datos que, en escencia, difieren de las bases de datos relacionales a las que tanto nos hemos acostumbrado. Dichas diferencias son, en suma, resumidas por modelos diferentes de bases de datos que no obedecen a los postulados del algebra relacional propuesta por Codd.

Entre las bases de datos NoSQL encontramos las bases de datos orientadas a grafos cuya base formal está sustentada en, por supuesto, la teoría de grafos. Hay varios motores de bases de datos que gestionan bases de datos orientadas a grafos, entre ellos está Neo4j.

Para instalar Neoj4 debe, en primer lugar, descargar la versión compatible con su sistema operativo:

La versión que se encuentra en los enlaces es la 1.9.3 que es, a la fecha, la versión estable de Neo4j. Además, las versiones de los enlaces son Community, las versiones ligeras y soportadas por y para la comunidad.

Después de descargar Neo4j, lo único que se debe hacer es extraerlo en el directorio que se quiera.

Para ejecutar Neo4j, se debe iniciar el servicio. Para iniciar el servicio se debe ejecutar:

/bin/Neo4j (Windows)
/bin/neo4j (Linux)

Uno de los colaboradores de Colombia Lacrosse quien está formando el deporte en Uganda

Kevin Dugan | Fields of Growth

Social media outlets came to life this weekend with messages of women’s empowerment as Friday, March 8, served as International Women’s Day. It seems appropriate that the same week the world is celebrating women, that Fields of Growth and the Uganda Lacrosse Union sponsored the first ever HS Girls Championship Tournament.

From very humble beginnings, FoG and the ULU are starting to make some really nice progress – I’d actually dare to say it is beyond nice progress, it is pretty remarkable that 6 girls teams just competed in a lacrosse tournament in East Africa. Thank you to all who have been supporting our efforts – especially all the female HS and College lacrosse players that have helped inspire this movement in Uganda.

“Nothing happens if not first a dream.” – Carl Sandburg

Ver la entrada original

Solucionar problema de plugin java en debian

Navegador web

Chrome

Java

Java

Como ya sabemos, se ha hecho un fork del desarrollo de java y sobre java a causa de la compra de Sun por parte de Oracle: Uno para el desarrollo privativo y el otro para el desarrollo libre. A causa de esto, la versión java para trabajar. Ya que somos amantes del software libre (y es más fácil instalar el jdk libre) en esta ocasión vengo a mostrar la instalación del plugin para los navegadores que tenemos en nuestra máquina debian. Logueado como root, hemos de ejecutar lo siguiente:

aptitude install icedtea-7-plugin

Probado en chrome, sin embargo este es el plugin para cualquier navegador. Espero les sea de gran ayuda.

Los números de 2012

Los duendes de las estadísticas de WordPress.com prepararon un informe sobre el año 2012 de este blog.

Aquí hay un extracto:

600 personas llegaron a la cima del monte Everest in 2012. Este blog tiene 2.400 visitas en 2012. Si cada persona que ha llegado a la cima del monte Everest visitara este blog, se habría tardado 4 años en obtener esas visitas.

Haz click para ver el reporte completo.

Manejo del import en python

En construcción 😉

Python: Conjuntos y diccionarios

Conjuntos

Python provee el tipo de dato set (conjunto) el cual se compone de una lista no ordenada de datos en la cual no hay ningún dato repetido. La forma de creación de un conjunto en python es la siguiente:

conjunto = set(["un", "conjunto", "hecho", "en", "python", 2.7])

Como un conjunto es una lista de elementos no repetidos, entonces, al ejecutar la función set(), ella eliminará elementos repetidos si los hay:

conjunto = set(['a', 'b', 'c', 'c', 'b', 'a'])

El conjunto en el anterior código será, entonces, el siguiente:

set(['a', 'c', 'b'])

Los conjuntos también pueden ser cadenas de caracteres, entendiendo
sus elementos como cada caracter de la cadena, así:

conjunto = set("hola mundo!")

El conjunto representativo será:

set(['a', ' ', 'd', 'h', 'm', 'l', 'o', 'n', '!', 'u'])

Operaciones sobre conjuntos

Sean a y b conjuntos. Hay 4 operaciones básicas sobre los conjuntos y estas son:

  • a – b: Elementos en a que no estén en b
  • a | b: Elementos en a o en b
  • a & b: Elementos en a y que a su vez estan en b
  • a ^ b: Elementos en a o en b que no están en ambos

El resultado de la operación entre conjuntos es, por supuesto, un conjunto.

La lista de operaciones, como se podrán dar cuenta los que sepan algo acerca de teoría de conjuntos, son las mismas operaciones que en dicha teoría, es decir:

  • a – b: Diferencia
  • a | b: Union
  • a & b: Intersección
  • a ^ b: Diferencia simétrica

Diccionarios

Un diccionario es una colección de parejas key:value (clave:valor), donde key representa la palabra clave del diccionario y value representa su valor. Haciendo una analogía a los diccionarios reales, podríamos hablar de un diccionario de español-ingles: imaginemos que en la primera mitad del diccionario se encuentra la pareja key:value donde key es una palabra en español y value es su representación en el idioma ingles.

Los valores que puede contener un diccionario son aquellos que representen un tipo de dato inmutable, por lo cual las listas no pueden hacer parte de un diccionario. Las formas de escribir un diccionario en python son la siguientes:

diccionario1 = {'a':1, 'b':2, 'c':3}
diccionario2 = dict([('a', 1), ('b', 2), ('c', 3)])
diccionario3 = dict(a=1, b=2, c=3)

Otra forma muy útil de hacer diccionarios es utilizar las listas por comprensión, así:

diccionario4 = dict([(x, x**2) for x in range(1,5)])
#Diccionario con parejas x,x2 como clave y valor, respectivamente

Los diccionarios son tipos de datos que en otros lenguajes son llamados “array asociativos” donde la forma de accesar por índice es con la key del array. La forma de accesar a un valor de nuestro diccionario es la siguiente:

diccionario = {'a':1, 'b':2, 'c':3}
print diccionario['a'] #Escribe 1, que es el valor asociado a la clave 'a' 

Por último, me gustaría anotar el hecho de que podemos obtener las keys de nuestro diccionario con la función keys() lo que retorna una lista con las keys del diccionario, así:

diccionario = {'a':1, 'b':2, 'c':3}

for i in diccionario.keys():
    print i

#En el for se escribe el nombre de cada una de las keys asociadas a "diccionario"

Para continuar, explicaré el manejo del import en python , para la inclusión de proyectos de terceros o inclusive módulos del proyecto python ya desarrollados.