OVS Semantic Hub es una plataforma web interactiva para explorar y visualizar grafos de conocimiento RDF basados en la ontología del Observatorio Inmobiliario (OVS-UNLP). Permite conectar un repositorio GraphDB y visualizar los datos a través de múltiples vistas complementarias: explorador tabular, mapa geográfico e inspector interactivo del grafo de conocimiento.
- 🔗 Conexión a GraphDB — Selección de repositorio con persistencia de sesión y diagnóstico de conexión
- 🗺️ Mapa geográfico — Geolocalización de inmuebles (
rec:RealEstate) con Leaflet.js y filtros dinámicos por subclase - 🗂️ Explorador tabular — Grilla con edición en línea (doble clic), ordenamiento y búsqueda
- 🕸️ Inspector de Grafo KG — Visualización interactiva de nodos del grafo de conocimiento con expansión de relaciones y traversal automático de blank nodes
- 🎨 Tematización dinámica — Temas Dark, Light y Pastel sincronizados en toda la interfaz
- 🐛 Modo Desarrollador — Etiquetas de identificación de componentes visuales al pasar el mouse
- 👤 Menú de usuario — Dropdown de perfil y configuración
Antes de comenzar, asegúrese de tener instalado:
| Componente | Versión mínima | Notas |
|---|---|---|
| Python | 3.10+ | Para el backend FastAPI |
| GraphDB Free | 10.x | Servidor de tripletas RDF |
No se requiere Node.js. El frontend es HTML + JavaScript puro (ES Modules) servido directamente por FastAPI.
git clone https://github.com/cientopolis/ovs-semantic-interaction.git
cd ovs-semantic-interactionpython3 -m venv venv
# macOS / Linux:
source venv/bin/activate
# Windows:
venv\Scripts\activatepip install -r backend/requirements.txtCopie el archivo de plantilla y edítelo con los datos de su instancia de GraphDB:
cp backend/.env.template backend/.envAbra backend/.env y ajuste los valores:
# URL del servidor GraphDB (por defecto puerto 7200)
GRAPHDB_URL=http://localhost:7200
# Credenciales de GraphDB (dejar vacío si no hay autenticación)
GRAPHDB_USER=admin
GRAPHDB_PASSWORD=admin
# Nombre del repositorio por defecto (sensible a mayúsculas)
GRAPHDB_DEFAULT_REPO=Test
# Configuración del servidor backend
PORT=8000
HOST=127.0.0.1
CORS_ORIGINS=http://localhost:5173,http://127.0.0.1:5173
⚠️ Importante: El nombre del repositorioGRAPHDB_DEFAULT_REPOes sensible a mayúsculas. Asegúrese de que coincide exactamente con el nombre del repositorio en GraphDB (ej.Test≠test).
- Descargue e instale GraphDB Free.
- Inicie el servidor GraphDB (normalmente disponible en
http://localhost:7200). - Cree un repositorio en la interfaz web de GraphDB:
- Vaya a Setup → Repositories → Create new repository
- Elija tipo GraphDB Repository
- Asigne un nombre (ej.
Test) y guárdelo
- Cargue la ontología:
- El archivo
inmontology.owlincluido en este repositorio contiene el esquema de la ontología OVS. - En GraphDB: Import → RDF → Upload RDF files → seleccione
inmontology.owl
- El archivo
- Cargue los datos de los inmuebles en el mismo repositorio (archivos RDF/Turtle con las instancias).
Este proyecto usa la ontología inmontology del proyecto OVS-UNLP, disponible en:
https://github.com/cientopolis/OVS-inmontology
Las entidades del mapa deben ser subclases de rec:RealEstate (RealEstateCore), con sus coordenadas WKT accesibles vía rec:includes → geosparql:hasGeometry → geosparql:asWKT.
cd backend
uvicorn app.main:app --host 0.0.0.0 --port 8000 --reloadAbra su navegador en:
http://localhost:8000
La API REST también está documentada y puede explorarse en:
http://localhost:8000/docs
ovs-semantic-interaction/
├── backend/
│ ├── .env # Variables de entorno (no incluido en git)
│ ├── .env.template # Plantilla de configuración
│ ├── requirements.txt # Dependencias Python
│ └── app/
│ ├── main.py # Punto de entrada FastAPI + sirve frontend
│ ├── config.py # Configuración con Pydantic Settings
│ ├── routes/
│ │ ├── repo_routes.py # Endpoints: repositorios y estadísticas
│ │ └── sparql_routes.py# Endpoints: SPARQL, grafo, mapa, inspector KG
│ └── services/
│ └── graphdb_service.py # Cliente HTTP para GraphDB
├── frontend/
│ ├── index.html # SPA principal (Mapa · Tabla · Grafo KG)
│ ├── graph-inspector-test.html # Página de prueba independiente del inspector
│ └── src/
│ ├── main.js # Orquestador de vistas
│ ├── api.js # Cliente de la API REST
│ ├── style.css # Estilos (temas dark/light/pastel)
│ └── components/
│ ├── repo_selector.js # Selector de repositorio
│ ├── entity_explorer.js # Explorador tabular
│ ├── sparql_editor.js # Consola SPARQL
│ ├── graph_viewer.js # Visor de grafo (Vis.js)
│ └── map_viewer.js # Mapa geográfico (Leaflet.js)
├── inmontology.owl # Ontología OVS-inmontology
├── .gitignore
└── README.md
Si desea adaptar el sistema a otro dominio ontológico:
-
Backend — Edite las consultas SPARQL en
backend/app/services/graphdb_service.py:get_geolocalized_entities()— Consulta de geolocalización (actualmente filtra porrec:RealEstatey navegarec:includes)- Los prefijos de ontología (
:,rec:,geosparql:) deben actualizarse para coincidir con su esquema
-
Frontend — El selector de repositorio en la interfaz permite cambiar el repositorio activo sin editar código.
En frontend/src/components/map_viewer.js puede reemplazar la URL del tile layer de CartoDB Positron por cualquier otro proveedor compatible con Leaflet.js (OpenStreetMap, Stamen, etc.).
| Variable | Valor por defecto | Descripción |
|---|---|---|
GRAPHDB_URL |
http://localhost:7200 |
URL base del servidor GraphDB |
GRAPHDB_USER |
admin |
Usuario de GraphDB (vacío si no hay auth) |
GRAPHDB_PASSWORD |
admin |
Contraseña de GraphDB |
GRAPHDB_DEFAULT_REPO |
test |
Repositorio por defecto al iniciar |
PORT |
8000 |
Puerto del servidor FastAPI |
HOST |
127.0.0.1 |
Host del servidor FastAPI |
CORS_ORIGINS |
http://localhost:5173,... |
Orígenes permitidos para CORS |
| Síntoma | Causa probable | Solución |
|---|---|---|
| Error de conexión a GraphDB | GraphDB no está iniciado | Verificar que GraphDB corre en http://localhost:7200 |
| Repositorio no encontrado | Nombre incorrecto o sensible a mayúsculas | Confirmar el nombre exacto en la UI de GraphDB |
| Mapa sin marcadores | Consulta SPARQL tarda demasiado | Revisar que el repositorio tiene datos y que rec:RealEstate y geosparql:hasGeometry están presentes |
| Error 400 en consultas personalizadas | SPARQL inválido | Verificar sintaxis en la Consola SPARQL de la app o directamente en GraphDB Workbench |
| Repository is currently in use | Dos procesos accediendo al repositorio | Cerrar otras conexiones o reiniciar GraphDB |
| Inspector KG sin resultados | IRI incorrecta o nodo no existe | Verificar la IRI completa copiándola desde el Workbench de GraphDB |
Se integra un nuevo panel Grafo KG accesible desde el toggle de vistas del header. Permite explorar en forma de grafo interactivo cualquier nodo del repositorio:
- Ingreso por IRI: el usuario ingresa la IRI completa del nodo raíz y obtiene un grafo inmediato de sus relaciones directas.
- Expansión interactiva: doble clic sobre cualquier nodo URI expande sus relaciones. Los nodos de tipo literal no son expandibles.
- Traversal automático de Blank Nodes: los blank nodes (nodos anónimos RDF) se expanden automáticamente al cargar, navegando desde su contexto padre (predicado + sujeto) para evitar errores de consulta SPARQL.
- Panel de detalles: panel lateral con el tipo, IRI/valor y acciones rápidas de cada nodo seleccionado.
- Leyenda cromática: diferenciación visual entre nodos Centro, URI, Literal, Blank Node y Clase.
- Compatibilidad de temas: hereda automáticamente los temas Dark, Light y Pastel de la aplicación.
- Soporte Modo Dev: todos los componentes visuales del inspector tienen
data-dev-idpara identificación.
Nuevos endpoints de API:
GET /api/sparql/graph/{repo_id}/node?uri=<IRI>— Consulta las relaciones directas de un nodo URI.GET /api/sparql/graph/{repo_id}/bnode?parent_uri=<IRI>&predicate_uri=<IRI>— Navega los valores de un blank node desde su contexto padre.
Se agrega un menú desplegable (dropdown acordeón) ubicado a la derecha del selector de tema. Incluye información del usuario activo, acceso a perfil, configuración y cierre de sesión. El diseño respeta el look & feel glassmorphism de la aplicación.
Se incorpora un toggle Modo Dev en el header que, al activarse, muestra el nombre identificador de cada componente visual al pasar el mouse. Cada componente puede recibir un alias personalizable a través de un diálogo modal. Los identificadores se almacenan en localStorage.
Corrección: se resolvió un bug donde desactivar el modo dev disparaba el diálogo de renombrado por propagación del evento click.
Se migró la interfaz de usuario de componentes vanilla a una aplicación React interactiva de una sola página optimizada para el análisis espacial y la conexión dinámica con GraphDB:
- Navegación Toggle Dual (Estilo Carto): Alternador dinámico en la cabecera entre vista de Mapa y vista de Tabla de alta densidad.
- Sincronización Bidireccional: Edición Excel-style (doble clic) en línea en la grilla que actualiza las capas del mapa de manera instantánea.
- Capas Visuales Avanzadas (Estilo Kepler.gl): Control de capas interactivo que permite activar:
- Capa de puntos/marcadores (coloreados por destino).
- Capa de mapa de calor de intensidad.
- Grilla de agregación hexagonal (Hexbins) por densidad espacial.
- Coropletas de barrios basadas en el valor promedio de suelo.
- Extrusión pseudo-3D de alturas según los valores inmobiliarios por metro cuadrado.
- Tematización Dinámica (Light, Dark, Pastel): Modifica automáticamente los estilos de la interfaz y las capas base de mapa (Carto Dark Matter, Positron y Voyager).
- Ejecución Nativa con HTM: Implementado con la biblioteca HTM (Hyperscript Tagged Markup) para posibilitar el uso de JSX en el cliente sin requerir herramientas de compilación pesadas o CDNs propensos a fallar.
Este proyecto es parte del Observatorio Virtual de Suelo (OVS) — UNLP / Cientópolis.
- Organización: Cientópolis
- Repositorio: ovs-semantic-interaction
- Ontología OVS: OVS-inmontology