En los casos en los que es necesario modelar las relaciones entre entidades, es habitual recurrir un sistema de grafos. El funcionamiento de este tipo de elementos es muy simple. Su estructura se compone de entidades, representadas como nodos, y aristas, que plasman el tipo de relación entre esos nodos.

Por ejemplo, este grafo representa la relación entre cinco amigos, sus intereses y las ciudades donde viven.
La utilización de grafos es especialmente potente cuando las relaciones entre objetos son algo que queremos explotar. Por ejemplo, podemos analizar las interacciones de clientes con productos y obtener las burbujas de interacción. De esa forma, podríamos ver que usuarios con propiedad “A” no suelen interaccionar con productos “B”.
¿Qué son las bases de datos de grafos?
A la hora de trabajar con grafos, las bases de datos convencionales de formato tabular presentan grandes limitaciones. Dado que la principal característica de los grafos son las conexiones existentes entre los nodos, es necesario recurrir a bases de datos especializadas para almacenar de forma correcta este tipo de datos. Entre las bases de datos de grafos más extendidas, destaca Neo4j.
Cómo funciona Neo4j: Ejemplo práctico
A continuación, exploraremos algunos ejemplos de cómo funciona Neo4j. Para ello, usaremos unos datos de ejemplo que se pueden generar con la siguiente query:
// Create People
CREATE (alicia:Person {name: 'alicia', age: 30})
CREATE (juan:Person {name: 'juan', age: 25})
CREATE (carolina:Person {name: 'carolina', age: 27})
CREATE (david:Person {name: 'david', age: 35})
CREATE (eva:Person {name: 'eva', age: 22})
// Create Friendships
CREATE
(alicia)-[:FRIEND {type:'Close Friend'}]->(juan),
(juan)-[:FRIEND {type:'Friend'}]->(alicia),
(alicia)-[:FRIEND]->(carolina),
(carolina)-[:FRIEND]->(alicia),
(juan)-[:FRIEND]->(david),
(david)-[:FRIEND]->(juan),
(carolina)-[:FRIEND]->(eva),
(eva)-[:FRIEND]->(carolina)
// Add Interests
CREATE (musica:Interest {name: 'Musica'})
CREATE (deportes:Interest {name: 'Deportes'})
CREATE (tecnologia:Interest {name: 'Tecnologia'})
CREATE (arte:Interest {name: 'Arte'})
// Add topic interest
CREATE
(alicia)-[:INTERESTED_IN]->(musica),
(alicia)-[:INTERESTED_IN]->(tecnologia),
(juan)-[:INTERESTED_IN]->(deportes),
(juan)-[:INTERESTED_IN]->(tecnologia),
(carolina)-[:INTERESTED_IN]->(arte),
(carolina)-[:INTERESTED_IN]->(musica),
(david)-[:INTERESTED_IN]->(deportes),
(eva)-[:INTERESTED_IN]->(musica)
//Add cities
CREATE (granada:City {name: 'Granada'})
CREATE (toledo:City {name: 'Toledo'})
CREATE (barcelona:City {name: 'Barcelona'})
CREATE
(alicia)-[:LIVES_IN]->(granada),
(juan)-[:LIVES_IN]->(toledo),
(carolina)-[:LIVES_IN]->(granada),
(david)-[:LIVES_IN]->(barcelona),
(eva)-[:LIVES_IN]->(toledo)
Al observar la forma resultante de este grafo, veremos que es la misma que la del grafo de ejemplo mostrado en la imagen de la parte inicial del post.
Si intentamos recrear el grafo anterior en SQL, necesitamos de una tabla por tipo de nodo y por tipo de relación. Además, tendríamos que aplicar muchísimos joins en cada búsqueda, cosa que es poco eficiente en bases de datos tabulares. Por este motivo, cuando se ha de trabajar con grafos es mejor usar una BBDD especializada en ellos.
¿Qué es y cómo se usa Cypher?
Cypher es el lenguaje utilizado en Neo4j para lanzar queries, pues el formato de los datos es complejo para representarlo en SQL. En caso de que quisiéramos trabajar así con este tipo de datos, todo serían JOINS, por lo que usar SQL no tiene mucho sentido. Para eso, existe Cypher, un lenguaje de query que funciona a base de coincidencia de patrones. Su funcionamiento es tan sencillo que solo hay que definir el patrón a buscar y Cypher examina todo aquello que siga ese exacto patrón.
Por ejemplo, podemos hacer queries básicas, como listar todas las personas creadas anteriormente:
MATCH (p:Person) RETURN p

En el caso de que quisiéramos conocer todas las ciudades que se llaman Barcelona, podemos lanzar:
MATCH (c:City {name:'Barcelona'}) RETURN c

Por otro lado, también es posible hacer preguntas más complejas, como por ejemplo, ¿quién es amigo de la gente que vive en Granada?
MATCH e=((c:City{name:'Granada'})-[:LIVES_IN]-(p:Person)-[:FRIEND]-(p2:Person)) RETURN e

Sin embargo, estas queries no son muy complejas ni tampoco dan mucha información sobre las relaciones entre los objetos. Esto se debe a que es más típico explorar ciertas métricas que obtenemos a parte de dichos objetos, como puede ser su PageRank, centralidad de intermediación o centralidad de cercanía, etc.
Bases de datos de grafos: Casos de uso
Los grafos son una herramienta matemática fundamental para resolver una amplia variedad de problemas. En el área del Big Data, la teoría de grafos se usa en el análisis de sistemas complejos y se puede aplicar al ámbito empresarial de diversas formas.
Un caso de uso de las bases de datos de grafos es la optimización de rutas en el sector de la logística o el transporte. Como ya abordamos en Grafos, encontrando el camino óptimo, con la teoría de grafos es posible crear un sistema que encuentre cuál es la ruta óptima desde un punto inicial hasta un punto final.
Otro ejemplo de aplicación de la teoría de grafos es en marketing, especialmente en las redes sociales y otras plataformas de comunicación online. En este área, entender y conocer lo máximo posible al consumidor es clave. Por eso, contar con bases de datos especializadas en trabajar con grafos con las que analizar las relaciones y conexiones existentes entre usuarios, puede suponer una gran ventaja competitiva.
Sin embargo, logística, transporte y marketing no son los únicos sectores donde la integración de bases de datos de grafos tiene cada vez más sentido. En Damavis, ya hemos trabajado en numerosos proyectos en cuya arquitectura está presente este tipo de BBDD no relacional. Si quieres conocer más detalles sobre qué otras implementaciones pueden ayudarte a trabajar mejor con tus datos, te recomendamos visitar los diferentes servicios que ofrecemos.
Conclusión
En conclusión, los datos en forma de grafo requieren de bases de datos especiales para trabajar con ellos. En este sentido, las bases de datos de grafos permiten analizar la estructura y relaciones de una forma simple, lo cual resultaría extremadamente complicado en bases de datos tabulares clásicas. En este post, hemos visto algunos ejemplos de cómo lanzar queries en Cypher con Neo4j para analizar las relaciones entre distintos objetos.
Si este artículo te ha parecido interesante, te animamos a visitar la categoría Data Engineering para ver otros posts similares a este y a compartirlo en redes. ¡Hasta pronto!