Este proyecto implementa una red social utilizando Neo4j como base de datos gráfica y Django como backend. Se ha generado un conjunto de nodos y relaciones a través de un script de generación de CSV, y se han implementado diversos endpoints en el backend para crear, consultar, actualizar y eliminar nodos y relaciones.
- Sergio Orellana - 221122
- Andre Marroquin - 22266
- Joaquin Campos - 22155
Se creó un script en Python que genera archivos CSV para poblar la base de datos con los siguientes elementos:
-
User (Usuario)
Label:Usuario
Propiedades:- id: Integer
- nombre: String
- email: String
- fecha_registro: Fecha
- intereses: Lista de Strings
-
User:Influencer:Verified (Usuario:Influencers:Verificados)
Labels:Usuario,Influencers,Verificados
Propiedades: (mismas que User) -
User:Influencer (Usuario:Influencers)
Labels:Usuario,Influencers
Propiedades: (mismas que User) -
Post
Label:Post
Propiedades:- id: Integer
- contenido: String
- fecha_publicacion: Fecha
- likes: Integer
- privado: Boolean
-
Comment (Comentario)
Label:Comment
Propiedades:- id: Integer
- contenido: String
- fecha_comentario: Fecha
- likes: Integer
- privado: Boolean
-
Reel
Label:Reel
Propiedades:- id: Integer
- duracion: Float
- fecha_publicacion: Fecha
- likes: Integer
- hashtags: Lista de Strings
-
Group (Grupo)
Label:Group
Propiedades:- id: Integer
- nombre: String
- descripcion: String
- privado: Boolean
- miembros: Integer
-
Mentions (Menciona)
Entre: User → User
Propiedades:- fecha_mencion: Fecha
- tipo_mencion: String
- notificado: Boolean
-
Friends_with (Amistad)
Entre: User → User
Propiedades:- desde: Fecha
- nivel_confianza: Integer
- tipo_amistad: String
-
Follows (Sigue)
Entre:- Usuarios normales siguen a Usuarios Verificados o Influencers (verificados o no)
- Influencers no verificados pueden seguir entre sí y a verificados
Propiedades: - desde: Fecha
- interaccion_frecuencia: String
- razon: String
-
Posted (Publicó)
Entre: User → Post
Propiedades:- fecha_posteo: Fecha
- visibilidad: String
- ubicacion: String
-
Likes (Me gusta)
Entre: User → (Post, Comment, Reel)
Propiedades:- fecha_like: Fecha
- tipo: String
- desde_movil: Boolean
- (Para Comment y Reel se puede incluir la propiedad "editado": Boolean)
-
Commented_on (Comentó)
Entre:- User → Post
- User → Reel
Propiedades: - fecha_comentario: Fecha
- tipo: String
- editado: Boolean
- (En el caso de Post, también se puede incluir "categoría": String)
-
Watched (Vio)
Entre: User → Reel
Propiedades:- fecha_vista: Fecha
- duracion_vista: Float
- completo: Boolean
-
Created (Creó)
Entre: User → Reel
Propiedades:- fecha_creacion: Fecha
- visibilidad: String
- ubicacion: String
-
Member_of (Miembro de)
Entre: User → Group
Propiedades:- desde: Fecha
- rol: String
- activo: Boolean
-
Belongs_to (Pertenece a)
Entre:- Post → User
- Comment → User
Propiedades: - fecha_creacion: Fecha
- privado: Boolean
- categoria: String
Nota: Algunos nodos (como Reel y Group) solo participan en relaciones, por lo que no tienen una relación Belongs_to.
El script generateCSV.py genera todos estos nodos y relaciones con sus propiedades, y además especifica el tipo de cada propiedad (por ejemplo, "Integer", "String", "Fecha", "Boolean", "Lista de Strings") y el nombre del nodo (etiqueta) para posteriormente hacer la inserción en AuraDB.
El proyecto cuenta con un backend en Django que expone múltiples endpoints para interactuar con la base de datos Neo4j. A continuación, se describen los principales endpoints y lo que hacen:
- Crear Nodo con Una Sola Label
Método: POST
Endpoint:/api/create-node-single-label/
Descripción: Crea un nodo asignándole únicamente una etiqueta.
Entrada: Un JSON con el campolabel. - Crear Nodo con Múltiples Labels
Método: POST
Endpoint:/api/create-node-multiple-labels/
Descripción: Crea un nodo asignándole dos o más etiquetas.
Entrada: Un JSON con el campolabels(lista de etiquetas). - Crear Nodo con Propiedades
Método: POST
Endpoint:/api/create-node-with-properties/
Descripción: Crea un nodo asignándole propiedades; se valida que se provean al menos 5 propiedades.
Entrada: Un JSON que incluyelabelyproperties(por ejemplo,nombre,email,edad,fecha_registro,intereses, etc.).
Nota: Se convierte la cadena de fecha a un valor de tipo Date en Neo4j (usando la funcióndate()).
- Buscar Nodos Dinámicamente
Método: POST
Endpoint:/api/search-nodes/
Descripción: Permite realizar consultas dinámicas de nodos basadas en etiquetas y filtros. Los filtros pueden especificar operadores como=,<,<=,>,>=,INyCONTAINS. Además, se pueden filtrar por fechas y valores en listas.
Entrada: Un JSON que incluyelabels,filtersylimit. - Consultas Agregadas de Datos
Método: POST
Endpoint:/api/get-aggregated-data/
Descripción: Realiza consultas agregadas (COUNT, AVG, MAX, MIN, SUM) sobre una propiedad numérica de los nodos de un determinado label.
Entrada: Un JSON que incluyelabelyproperty.
- Actualizar Propiedades de Múltiples Nodos
Método: PUT
Endpoint:/api/update-multiple-nodes-properties/
Descripción: Permite agregar o actualizar propiedades en múltiples nodos. El usuario indica una lista de IDs (valor de la propiedadid) y el label, junto con las propiedades a actualizar.
Entrada: Un JSON connode_ids,labelyproperties. - Eliminar Propiedades de Múltiples Nodos
Método: PUT
Endpoint:/api/remove-multiple-nodes-properties/
Descripción: Permite eliminar (remover) una o más propiedades de múltiples nodos, especificando el label y una lista de IDs de los nodos.
Entrada: Un JSON connode_ids,labelyproperties(lista de nombres de propiedades a eliminar). - Eliminar Nodos (Con Verificación)
Método: DELETE
Endpoint:/api/delete-multiple-nodes/
Descripción: Permite eliminar uno o más nodos, pero primero verifica que cada nodo no tenga relaciones. Si un nodo tiene relaciones, se informa que no puede eliminarse.
Entrada: Un JSON conlabelynode_ids.
- Crear Relación con Propiedades
Método: POST
Endpoint:/api/create-relationship/
Descripción: Crea una relación entre dos nodos ya existentes (identificados por su label y valor de la propiedadid), asignando propiedades a la relación.
Entrada: Un JSON que incluyelabel1,node1_id,label2,node2_id,rel_typeyproperties. - Actualizar Propiedades de Múltiples Relaciones
Método: PUT
Endpoint:/api/update-bulk-relationships/
Descripción: Permite actualizar (o crear) propiedades en múltiples relaciones a la vez, mediante un arreglo de objetos que especifican los nodos involucrados, el tipo de relación y las propiedades a asignar.
Entrada: Un JSON con un arreglo en el camporelationships. - Eliminar Propiedades de Múltiples Relaciones
Método: PUT
Endpoint:/api/remove-bulk-relationships/
Descripción: Permite eliminar una o más propiedades de múltiples relaciones a la vez.
Entrada: Un JSON con un arreglo en el camporelationshipsdonde cada objeto incluyelabel1,node1_id,label2,node2_id,rel_typeyproperties(lista de propiedades a eliminar). - Eliminar Relaciones (Global)
Método: DELETE
Endpoint:/api/delete-bulk-relationships/
Descripción: Permite eliminar múltiples relaciones a la vez, identificándolas mediante los labels y los valores de la propiedadidde los nodos involucrados.
Entrada: Un JSON con un arreglo en el camporelationships.
El proyecto se compone de dos grandes partes:
-
Generación de Datos:
Se han generado nodos (usuarios, posts, comentarios, reels, grupos) con propiedades y relaciones (por ejemplo, follows, likes, comentarios, etc.). Cada nodo y relación se crea con su respectivo conjunto de propiedades, donde se definen los tipos (Integer, String, Fecha, Boolean, Lista, Floats) y se asignan etiquetas que determinan el rol en la red social. -
Backend en Django:
Se implementaron múltiples endpoints REST para:- Crear nodos (con una o múltiples etiquetas) y relaciones.
- Consultar nodos de forma dinámica, con filtros, búsquedas por fecha y agregaciones.
- Actualizar propiedades en nodos y relaciones.
- Eliminar propiedades y nodos, con validaciones de integridad.
- Gestionar la eliminación de relaciones de forma masiva.
Estos endpoints están diseñados para trabajar a gran escala, permitiendo la manipulación y consulta de datos en una red social compleja, y se pueden utilizar para diversos casos de uso, como análisis de influencia, detección de comunidades, recomendaciones, entre otros.
Crear Nodo con Una Sola Label:
@POST http://127.0.0.1:8000/api/create-node-single-label/
Payload:
{
"label": "Persona"
}Crear Nodo con Múltiples Labels:
@post http://127.0.0.1:8000/api/create-node-multiple-labels/
Payload: {
"labels":["Persona","cliente","empresa"] ;
}Crear Nodo con Propiedades:
@POST http://127.0.0.1:8000/api/create-node-with-properties/
Payload:
{
"label": "Persona",
"properties": {
"id": 1,
"nombre": "Sergio",
"email": "juanperez@gmail.com",
"edad": 20,
"fecha_registro": "2024-01-02",
"intereses": ["hola", "prueba"],
"activo": true
}
}Buscar Nodos Dinámicamente:
@post http://127.0.0.1:8000/api/search-nodes/
Payload: {
"labels":["Reel"],"filters": {
'duracion': {
"operator":">=","value": '30.5';
}
,
'likes': {
"operator":"<","value": '4000';
}
}
,"limit": 10;
}Consultas Agregadas:
@post http://127.0.0.1:8000/api/get-aggregated-data/
Payload: {
"label":"Reel","property": 'duracion';
}Actualizar Propiedades de Múltiples Nodos:
@put http://127.0.0.1:8000/api/update-multiple-nodes-properties/
Payload: {
'node_ids': [1, 2, 3],
'label': 'persona',
'properties': {
"edad":22,"intereses": [ 'Baloncesto'];
}
}Eliminar Propiedades de Múltiples Nodos:
@PUT http://127.0.0.1:8000/api/remove-multiple-nodes-properties/
Payload:
{
"node_ids": [1, 2],
"label": "Persona",
"properties": ["email"]
}Crear Relación con Propiedades:
@POST http://127.0.0.1:8000/api/create-relationship/
Payload:
{
"label1": "Persona",
"node1_id": 2,
"label2": "Persona",
"node2_id": 1,
"rel_type": "Profesora",
"properties": {
"tipo_amistad": "Compañeros de trabajo",
"desde": "2021-10-23",
"nivel_confianza": 10
}
}Actualizar Propiedades en Múltiples Relaciones:
@PUT http://127.0.0.1:8000/api/update-bulk-relationships/
Payload:
{
"relationships": [
{
"label1": "Persona",
"node1_id": 1,
"label2": "Persona",
"node2_id": 2,
"rel_type": "ALUMNO_DE",
"sueldo": 10000,
"tipo_amistad": "Mejores Amigos",
"desde": "2025-04-03"
},
{
"label1": "Persona",
"node1_id": 2,
"label2": "Persona",
"node2_id": 1,
"rel_type": "Profesora",
"sueldo": 6000,
"tipo_amistad": "Mejores Amigos",
"desde": "2020-10-10"
}
]
}Eliminar Propiedades en Múltiples Relaciones:
@PUT http://127.0.0.1:8000/api/remove-bulk-relationships/
Payload:
{
"relationships": [
{
"label1": "Persona",
"node1_id": 1,
"label2": "Persona",
"node2_id": 2,
"rel_type": "ALUMNO_DE",
"properties": ["sueldo"]
},
{
"label1": "Persona",
"node1_id": 2,
"label2": "Persona",
"node2_id": 1,
"rel_type": "Profesora",
"properties": ["sueldo"]
}
]
}Eliminar Múltiples Nodos:
@delete http://127.0.0.1:8000/api/delete-multiple-nodes/
Payload: {
"label":"Persona","node_ids": [1, 2];
}Eliminar Múltiples Relaciones:
@DELETE http://127.0.0.1:8000/api/delete-bulk-relationships/
Payload:
{
"relationships": [
{
"label1": "Persona",
"node1_id": 1,
"label2": "Persona",
"node2_id": 2,
"rel_type": "ALUMNO_DE"
},
{
"label1": "Persona",
"node1_id": 2,
"label2": "Persona",
"node2_id": 1,
"rel_type": "Profesora"
}
]
}Aqui están los paquetes para instalar y que funcione el backend:
pip install django djangorestframework neo4j python-dotenv django-cors-headersPosteriormente a esto nos dirigimos al directorio del backend:
cd ./backendLuego procedemos a ejecutar el siguiente comando para ejecutar el backend:
python manage.py runserverEste proyecto integra:
- Generación de datos a través de un script Python que crea CSV para nodos y relaciones.
- Estructura de nodos y relaciones definidas en base a una red social (con nodos de tipo Usuario, Post, Comment, Reel, Group, y relaciones como FOLLOWS, LIKES, COMMENTED_ON, etc.) y sus respectivas propiedades (con tipos: Integer, String, Fecha, Boolean, Lista).
- Backend en Django con endpoints REST para:
- Crear nodos (con una o múltiples etiquetas) y relaciones con propiedades.
- Consultar nodos de forma dinámica y realizar agregaciones.
- Actualizar y eliminar propiedades de nodos y relaciones.
- Eliminar nodos y relaciones, validando integridad (por ejemplo, no eliminar nodos que tienen relaciones).
Cada endpoint está diseñado para operar a gran escala, aceptando datos dinámicos y permitiendo operaciones CRUD complejas en la base de datos Neo4j.