Está en la página 1de 15

Uso de bases de datos NoSQL

PEC3

Instrucciones
Para poder realizar la práctica, el alumno debe usar la máquina virtual proporcionada que se
encuentra en el área de recursos y consultar el manual de usuario proporcionado:
● Máquina virtual Linux Mint suministrada.
● Documento “Máquina virtual Linux Mint (Manual)”

Ejercicio 1: Neo4j (30%)

Considera el documento que se encuentra en los materiales del curso “Diseño de una base
de datos para analizar la actividad de usuarios en Twitter” que describe la implementación de
una base de datos en Neo4j. También se necesitará la máquina virtual de LinuxMint (que
encontraréis en los recursos del aula) que contiene una instalación de Neo4j que tiene
cargada la base de datos descrita anteriormente. El manual para utilizar e instalar la
máquina virtual también está en los recursos del aula.

Se pide proporcionar las siguientes consultas en Cypher y una captura de pantalla con los
resultados que se obtienen para las siguientes operaciones:

Consulta 1 (10%)
Obtén el número de nodos etiquetados con cada etiqueta de nodo y el número de nodos
relacionados mediante la etiqueta “HAS_WRITEN”. Utiliza una sentencia en Cypher para
cada etiqueta/nodo.

Consulta 2 (20%)

Identifica las localizaciones desde las que se han escrito más tweets (relación
IS_WRITEN_FROM). Para cada una de ellas hay que mostrar su nombre y el número de
tweets escritos desde allí. Nos interesa sólo mostrar las localizaciones con más de 150
tweets.

PEC3 – Bases de datos NoSQL 19/12/2022 pág 1


Consulta 3 (10%)
Muestra los 5 usuarios relevantes con más seguidores. Nos interesa conocer el nombre del
usuario, su identificador y el número de seguidores, todo ello ordenado descendentemente
por número de seguidores.

Consulta 4 (20%)
Ahora que sabemos que el usuario relevante más popular es “Ismael Pe”, nos interesa
conocer los 20 primeros caracteres del texto de su tweet más retwiteado y el número de tuits
que lo han retwitteado.

Consulta 5 (25%)
Obtener el número total de seguidores, ya sean de segundo o tercer nivel, de los usuarios
relevantes que tienen un perfil de inglés. Mostrar únicamente los 5 usuarios relevantes con
más seguidores. Se desea visualizar de éstos el nombre del usuario relevante y el número
de seguidores.

Consulta 6 (15%)
Calculad el número medio de relaciones de salida que tienen los nodos de tipo TwitterUser
de la base de datos, es decir, el número medio de orden de salida de sus nodos. Nota: esta
consulta puede tardar un poco.

PEC3 – Bases de datos NoSQL 19/12/2022 pág 2


Ejercicio 2: Neo4j (30%)
Para la realización de este ejercicio se seguirán las instrucciones del caso de estudio
ubicado en la siguiente URL: https://neo4j.com/developer/guide-importing-data-and-etl/ . Este
caso se aborda también en el documento de ejercicios titulado “Transformación de una base
de datos relacional a un modelo en grafo” pero a un nivel más superficial. Se recomienda
leer dicho documento antes de realizar este ejercicio pero también leer con atención la
página web, ya que se introducen conceptos y buenas prácticas a seguir en un entorno de
producción.

En vuestra propuesta de solución, se pide proporcionar:

- Las consultas cypher en texto,


- Una captura de pantalla de las consultas cypher con los resultados

La versión community de Neo4j, que estamos utilizando, tiene algunas limitaciones. Una de
ellas es no poder crear más de una base de datos, por lo tanto, tendrán que convivir en el
mismo espacio los nodos de esta base de datos con los de Twitter.

2.1 Carga de datos (no puntúa):


Carga de datos. A continuación, se añaden las instrucciones (queries) para crear nuevos
grafos en neo4j. Se propone ejecutar las sentencias una a una para una mejor comprensión
de las mismas. El ejercicio no puntúa, pero es fundamental para una correcta ejecución del
resto del ejercicio. Para cada uno de los tipos de nodos y relaciones, se indica el título que
se utiliza en la web de referencia para que sea más fácil trazar su origen.

CREAR NODOS

Create orders
LOAD CSV WITH HEADERS FROM
'https://gist.githubusercontent.com/jexp/054bc6baf36604061bf407aa8c
d08608/raw/8bdd36dfc88381995e6823ff3f419b5a0cb8ac4f/orders.csv' AS
row
MERGE (order:Order {orderID: row.OrderID})
ON CREATE SET order.shipName = row.ShipName;

Que retornará:
0 rows available after 1781 ms, consumed after another 0 ms
Added 830 nodes, Set 1660 properties, Added 830 labels

Create products
LOAD CSV WITH HEADERS FROM

PEC3 – Bases de datos NoSQL 19/12/2022 pág 3


'https://gist.githubusercontent.com/jexp/054bc6baf36604061bf407aa8c
d08608/raw/8bdd36dfc88381995e6823ff3f419b5a0cb8ac4f/products.csv'
AS row
MERGE (product:Product {productID: row.ProductID})
ON CREATE SET product.productName = row.ProductName,
product.unitPrice = toFloat(row.UnitPrice);

Que retornará:
0 rows available after 332 ms, consumed after another 0 ms
Added 77 nodes, Set 231 properties, Added 77 labels

Create suppliers
LOAD CSV WITH HEADERS FROM
'https://gist.githubusercontent.com/jexp/054bc6baf36604061bf407aa8c
d08608/raw/8bdd36dfc88381995e6823ff3f419b5a0cb8ac4f/suppliers.csv'
AS row
MERGE (supplier:Supplier {supplierID: row.SupplierID})
ON CREATE SET supplier.companyName = row.CompanyName;

Que retornará:
0 rows available after 258 ms, consumed after another 0 ms
Added 29 nodes, Set 58 properties, Added 29 labels

Create employees
LOAD CSV WITH HEADERS FROM
'https://gist.githubusercontent.com/jexp/054bc6baf36604061bf407aa8c
d08608/raw/8bdd36dfc88381995e6823ff3f419b5a0cb8ac4f/employees.csv'
AS row
MERGE (e:Employee {employeeID:row.EmployeeID})
ON CREATE SET e.firstName = row.FirstName, e.lastName =
row.LastName, e.title = row.Title;

Que retornará:
0 rows available after 244 ms, consumed after another 0 ms
Added 9 nodes, Set 36 properties, Added 9 labels

Create categories
LOAD CSV WITH HEADERS FROM
'https://gist.githubusercontent.com/jexp/054bc6baf36604061bf407aa8c
d08608/raw/8bdd36dfc88381995e6823ff3f419b5a0cb8ac4f/categories.csv'
AS row
MERGE (c:Category {categoryID: row.CategoryID})
ON CREATE SET c.categoryName = row.CategoryName, c.description =
row.Description;

Que retornará:

PEC3 – Bases de datos NoSQL 19/12/2022 pág 4


0 rows available after 232 ms, consumed after another 0 ms
Added 8 nodes, Set 24 properties, Added 8 labels

CREAR RELACIONES

Create relationships between orders and products


LOAD CSV WITH HEADERS FROM
'https://gist.githubusercontent.com/jexp/054bc6baf36604061bf407aa8c
d08608/raw/8bdd36dfc88381995e6823ff3f419b5a0cb8ac4f/orders.csv' AS
row
MATCH (order:Order {orderID: row.OrderID})
MATCH (product:Product {productID: row.ProductID})
MERGE (order)-[op:CONTAINS]->(product)
ON CREATE SET op.unitPrice = toFloat(row.UnitPrice), op.quantity =
toFloat(row.Quantity);

Que retornará:
0 rows available after 1832 ms, consumed after another 0 ms
Created 2155 relationships, Set 4310 properties

Create relationships between orders and employees


LOAD CSV WITH HEADERS FROM
'https://gist.githubusercontent.com/jexp/054bc6baf36604061bf407aa8c
d08608/raw/8bdd36dfc88381995e6823ff3f419b5a0cb8ac4f/orders.csv' AS
row
MATCH (order:Order {orderID: row.OrderID})
MATCH (employee:Employee {employeeID: row.EmployeeID})
MERGE (employee)-[:SOLD]->(order);

Que retornará:
0 rows available after 1285 ms, consumed after another 0 ms
Created 830 relationships

Create relationships between products and suppliers


LOAD CSV WITH HEADERS FROM
'https://gist.githubusercontent.com/jexp/054bc6baf36604061bf407aa8c
d08608/raw/8bdd36dfc88381995e6823ff3f419b5a0cb8ac4f/products.csv
' AS row
MATCH (product:Product {productID: row.ProductID})
MATCH (supplier:Supplier {supplierID: row.SupplierID})
MERGE (supplier)-[:SUPPLIES]->(product);

Que retornará:
0 rows available after 131 ms, consumed after another 0 ms
Created 77 relationships

PEC3 – Bases de datos NoSQL 19/12/2022 pág 5


Create relationships between products and categories
LOAD CSV WITH HEADERS FROM
'https://gist.githubusercontent.com/jexp/054bc6baf36604061bf407aa8c
d08608/raw/8bdd36dfc88381995e6823ff3f419b5a0cb8ac4f/products.csv
' AS row
MATCH (product:Product {productID: row.ProductID})
MATCH (category:Category {categoryID: row.CategoryID})
MERGE (product)-[:PART_OF]->(category);

Que retornará:
0 rows available after 264 ms, consumed after another 0 ms
Created 77 relationships

Create relationships between employees (reporting hierarchy)


LOAD CSV WITH HEADERS FROM
'https://gist.githubusercontent.com/jexp/054bc6baf36604061bf407aa8c
d08608/raw/8bdd36dfc88381995e6823ff3f419b5a0cb8ac4f/employees.csv'
AS row
MATCH (employee:Employee {employeeID: row.EmployeeID})
MATCH (manager:Employee {employeeID: row.ReportsTo})
MERGE (employee)-[:REPORTS_TO]->(manager);

Que retornará:
0 rows available after 86 ms, consumed after another 0 ms
Created 8 relationships

Visualizar (y entender) el modelo de datos en grafo obtenido (CALL


db.schema.visualization())

PEC3 – Bases de datos NoSQL 19/12/2022 pág 6


2.2 Aspectos conceptuales (15%):
Explicar brevemente la funcionalidad implementada de la línea de la sentencia de creación
de nodos de tipo Categoría:

ON CREATE SET c.categoryName = row.CategoryName,


c.description = row.Description;

2.3 Consultas avanzadas (60%):


Se pide proporcionar las siguientes consultas en Cypher y una captura de pantalla con los
resultados que se obtienen:

Consulta 1 (20%)
Encontrar los empleados que han vendido más de 120 pedidos. Listar nombre, apellido de
los empleados y número de pedidos vendidos. Ordenar los empleados listando en primer
lugar los que han vendido más.

Consulta 2 (20%)
Listar, en una misma consulta, el número de productos de la categoría ‘Seafood’, el número
de productos de la categoría ‘Beverage’ y el número total de productos en las dos
categorías.

Consulta 3 (30%)
Obtener el tercer y cuarto mejores vendedores de productos de la compañía “Leka Trading”.
Los mejores vendedores son aquellos que han vendido más productos de “Leka Trading”.
Listar sólo el nombre y apellido de los vendedores y el número de unidades vendidas por
vendedor.

Consulta 4 (30%)
Fijémonos en los Suppliers "Pavlova, Ltd." y "Tokyo Traders". ¿Cuál de los dos han
vendido más pedidos con productos de las categorías "Seafood" o "Meat/Poultry"?
La consulta debe retornar una frase del tipo 'X are the best seller', donde X es el proveedor
(supplier) que vende más.

NOTA: Las sentencias condicionales de Cypher, y en particular el CASE, os pueden ayudar


a realizar este ejercicio.

PEC3 – Bases de datos NoSQL 19/12/2022 pág 7


2.4 Restricciones de integridad en Neo4j (25%):
Un problema de las BBDD NoSQL es que, en general, no garantizan la integridad de los
datos. Sin embargo, en neo4j existen mecanismos para garantizar la unicidad de nodos en
función de una de sus propiedades, es decir, que todos los nodos de un tipo deben tener
valores distintos para la propiedad definida como única. Por ejemplo, esto permitiría prohibir
crear un nodo de tipo Producto si ya existe otro nodo de tipo Producto con el mismo valor en
el atributo productName.

Se pide adjuntar las consultas de creación y de comprobación, para demostrar que:


a) Por defecto, se pueden crear diferentes copias de productos (nodos de tipo Product)
con los mismos valores en todos sus atributos, es decir, se podrían crear dos nodos
idénticos.
b) Es posible configurar neo4j para que garantice que todos los nodos de tipo producto
tienen un nombre de producto (productName) distinto.

PEC3 – Bases de datos NoSQL 19/12/2022 pág 8


Ejercicio 3: MongoDB (20 %)

Considera la base de datos descrita en el material titulado “Diseño de una base de datos
para una app de mensajería instantánea” que se encuentra en los materiales del curso.

Inicia el servicio de MongoDB y accede a los datos. Para realizar esta tarea, lee el manual
de la máquina virtual que encontrarás en los recursos de la asignatura.

También se necesitará la máquina virtual LinuxMint que contiene una instalación de


MongoDB y la base de datos ya cargada. Para este ejercicio no es necesario cargar ningún
dato adicional.

Inicia el servicio de MongoDB y accede a los datos con los siguientes comandos:

sudo systemctl start mongodb

Deja pasar unos segundos para que el servicio arranque y después ejecuta:

mongo

Y finalmente deberás entrar en la base de datos en cuestión:

use mensajeria

Para más información, lee el manual de la máquina virtual que encontrarás en los recursos
de la asignatura.

Se pide proporcionar las sentencias (texto) para el shell de MongoDB y los resultados que se
obtienen (haciendo una captura de pantalla) para las siguientes operaciones:

Consulta 1 (20%)
A partir de la información almacenada en la colección “Usuarios_grupos” se quiere conocer el
nombre del usuario y sus apellidos de aquellos usuarios de más de 40 años que pertenecen
exactamente a 4 grupos.

PEC3 – Bases de datos NoSQL 19/12/2022 pág 9


Consulta 2 (25%)
Encontrar todos los usuarios de la colección “Usuarios_individuales” que sean de Barcelona
y que se hayan creado en el año 2016. Mostrar únicamente los atributos nombre, apellidos,
edad y teléfono. Ordenar el resultado por la edad de forma descendente

Consulta 3 (25%)
Encontrar todos los grupos que tengan miembros de Barcelona y que además no tengan
ninguno de Madrid. Mostrar el nombre del grupo.

Consulta 4 (30%)
Eliminar todos los contactos del usuario “Susana Lacasa Hacha” de Barcelona (colección
“Contactos_usuarios”). Mostrar primero la existencia del usuario y sus contactos y luego el
resultado final después de eliminarlos.

PEC3 – Bases de datos NoSQL 19/12/2022 pág 10


Ejercicio 4: MongoDB (20%)
Para cargar los datos necesarios para este ejercicio deberéis crear una carpeta llamada
sakila (en minúsculas) dentro de vuestra carpeta Documentos, quedando de la siguiente
manera:

Dentro de la carpeta creada (sakila) copiar y pegar los archivos sin comprimir
proporcionados junto con el enunciado (los podéis descargar directamente desde el campus
en la máquina virtual para facilitar el proceso):
● Sakila_actors.bson
● Sakila_actors.metadata.json
● Sakila_customers.bson
● Sakila_customers.metadata.json
● Sakila_films.bson
● Sakila_films.metadata.json

El contenido de la carpeta debe ser:

PEC3 – Bases de datos NoSQL 19/12/2022 pág 11


Después de haber arrancado el servicio de MongoDB, desde el terminal de comandos hay
que ejecutar el siguiente comando en el intérprete de comandos para cargar la base de
datos:
mongorestore --db=sakila --drop /home/student/Documentos/sakila

Una vez hecho, ya nos podemos conectar a mongoDB y comprobar que los datos se han
cargado correctamente. Desde un terminal de comandos (o desde Robo3T) podemos
ejecutar:

mongo

En teoría, la base de datos ya debería estar accesible:

PEC3 – Bases de datos NoSQL 19/12/2022 pág 12


Ya estamos en la base de datos recién cargada y ya podemos hacer las consultas.

Finalmente, recordad que no es necesario repetir los pasos para cargar la base de
datos de nuevo porque los datos ya se encuentran cargados y al volver a realizar la
carga perderéis los cambios realizados. En otras palabras, si volvéis a ejecutar el
comando mongorestore la base de datos volverá a restaurarse y perderéis todos los
cambios realizados.

Consulta 1 (20%)
Obtén todos los actores que se apelliden DAVIS (recordad que MongoDB es sensible a
mayúsculas y minúsculas, por lo que Davis no es lo mismo que DAVIS). El formato del JSON
debe facilitar la lectura.

PEC3 – Bases de datos NoSQL 19/12/2022 pág 13


Consulta 2 (20%)
Recuento de películas que contienen la palabra GOLDFINGER en el título. La consulta debe
retornar un número.

Consulta 3 (25%)
Para esta consulta recordad que MongoDB es sensible a mayúsculas y minúsculas, y los
campos pueden estar descritos de diferentes maneras en las distintas colecciones y
documentos.

De la colección Sakila_films, muestra solamente el título de todas las películas en las que
ha participado la actriz JENNIFER DAVIS.

Consulta 4 (35%)
Obtén el título y el recuento de actores de la película en la que participan más actores. La
consulta debe retornar un solo documento con solamente los campos detallados.

PEC3 – Bases de datos NoSQL 19/12/2022 pág 14


Criterios de valoración
El ejercicio 1 tiene un peso del 30%, el ejercicio 2 del 30% y los ejercicios 3 y 4 un 20% ambos.
Se valorará, en cada ejercicio, la validez de la solución y la claridad de la argumentación.

Formato y fecha de entrega


Tenéis que enviar la PEC3 al buzón de Entrega y registro de EC disponible en el aula (apartado
Evaluación). El formato del archivo que contiene vuestra solución puede ser .pdf,. odt, .doc y
.docx. Para otras opciones, por favor, contactar previamente con vuestro profesor colaborador. El
nombre del fichero debe contener el código de la asignatura, vuestro apellido y vuestro nombre,
así como el número de actividad (PEC3). Por ejemplo apellido1_nombre_nosql_pec3.pdf

La fecha límite para entregar la PEC3 es el 23 de enero del 2023.

Propiedad intelectual
Al presentar una práctica o PEC que haga uso de recursos ajenos, se tiene que presentar junto
con ella un documento en que se detallen todos ellos, especificando el nombre de cada recurso,
su autor, el lugar donde se obtuvo y su estatus legal: si la obra está protegida por el copyright o
se acoge a alguna otra licencia de uso (Creative Commons, licencia GNU, GPL etc.). El
estudiante tendrá que asegurarse que la licencia que sea no impide específicamente su uso en el
marco de la práctica o PEC. En caso de no encontrar la información correspondiente tendrá que
asumir que la obra está protegida por el copyright. Será necesario, además, adjuntar los ficheros
originales cuando las obras utilizadas sean digitales, y su código fuente, si así corresponde.

PEC3 – Bases de datos NoSQL 19/12/2022 pág 15

También podría gustarte