Aplicación web que traduce consultas en lenguaje natural a SPARQL usando inteligencia artificial, optimizada para catálogos de datos abiertos DCAT-AP-ES.
- Traducción Lenguaje Natural → SPARQL: Convierte preguntas en español a consultas SPARQL válidas
- RAG (Retrieval-Augmented Generation): Sistema de recuperación de documentos con knowledge base especializada en web semántica.
- Múltiples proveedores LLM: Soporta Ollama (local), GitHub Models, OpenRouter y OpenAI
- Editor SPARQL integrado: Interfaz YASGUI con resaltado de sintaxis y ejecución directa
- Optimizado para DCAT-AP-ES: Knowledge base con vocabularios controlados, patrones SPARQL y ejemplos documentados
- Endpoints configurables: datos.gob.es, data.europa.eu y endpoints personalizados
- Validación de sintaxis: Verificación automática de consultas SPARQL generadas
Para iniciar rápidamente con Ollama dockerizado (recomendado para desarrollo local):
git clone https://github.com/mjanez/sparql-naturalizer.git
cd sparql-naturalizer
chmod +x setup-dev.sh
./setup-dev.shEl script interactivo:
- Verifica prerrequisitos (Docker, Node.js)
- Inicia Docker Compose con Ollama
- Te permite elegir modelos LLM y embeddings
- Descarga y precarga los modelos en memoria
- Configura el archivo
.envautomáticamente- Instala dependencias npm e indexa la knowledge base
- Inicia el servidor de desarrollo en http://localhost:3000
Opciones disponibles:
./setup-dev.sh # Menú interactivo (recomendado)
./setup-dev.sh --quick # Setup rápido con llama3.1:8b + nomic-embed-text
./setup-dev.sh --models-only # Solo descargar modelos
./setup-dev.sh --dev # Solo iniciar servidorModelos LLM disponibles:
llama3.1:8b(4.7GB, mejor precisión) - Recomendadogemma2:2b(1.6GB, más rápido)phi3:3.8b(2.2GB, rápido y preciso)qwen3:4b(2.5GB, multilingüe)
Modelos embeddings:
nomic-embed-text(274MB, mejor para búsquedas) - Recomendadomxbai-embed-large(670MB, alta precisión)all-minilm(47MB, ligero y rápido)
- Node.js 18+ y npm
- Proveedor LLM:
- Ollama (local): Docker + docker-compose
- GitHub Models: Personal Access Token con scope
models:read - OpenAI: API Key
git clone https://github.com/mjanez/sparql-naturalizer.git
cd sparql-naturalizernpm installCopia .env.example a .env y configura tu proveedor LLM preferido:
cp .env.example .envVer sección "Configuración" más abajo para detalles de cada proveedor.
La aplicación requiere una knowledge base vectorizada para el sistema RAG:
npm run index-kbEste proceso:
- Lee los documentos markdown de
context/knowledge-base/ - Genera embeddings con el modelo configurado (por defecto:
nomic-embed-text) - Guarda el vector store en
context/vector-store.json(archivo no versionado en Git)
Note
El archivo vector-store.json está en .gitignore para evitar sobrecargar el repositorio. Cada usuario debe ejecutar npm run index-kb después de clonar el proyecto.
npm run devAbre http://localhost:3000 en tu navegador.
La aplicación soporta múltiples proveedores de IA. Edita .env (copia desde .env.example):
LLM_PROVIDER=ollama
OLLAMA_API_URL=http://localhost:11434
OLLAMA_MODEL=llama3.1:8b
OLLAMA_EMBEDDINGS_MODEL=nomic-embed-textNote
✅ Ventajas: Gratis, rápido, sin límites, privado ❌ Requisitos: GPU local
LLM_PROVIDER=github
GITHUB_TOKEN=ghp_TuTokenAqui...
GITHUB_MODEL=openai/gpt-4.1-mini # o gpt-5-mini, llama-4-scout, deepseek-r1...Note
✅ Ventajas: Gratis, 42 modelos (OpenAI GPT-5, Meta Llama 4, DeepSeek, Microsoft Phi, Mistral, xAI Grok) ❌ Limitaciones: Rate limits, requiere internet
Modelos destacados:
openai/gpt-5-mini- Cost-effective, 200K contextopenai/gpt-4.1-mini- Best coding/reasoning, 1M contextmeta/llama-4-scout-17b-16e-instruct- 10M context window!deepseek/deepseek-r1-0528- Advanced reasoningmicrosoft/phi-4-multimodal-instruct- Text+audio+image
Lista completa de modelos:
curl -L -H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://models.github.ai/catalog/modelsLLM_PROVIDER=openai
OPENAI_API_KEY=sk-...
OPENAI_MODEL=gpt-4o-miniLa aplicación incluye endpoints predefinidos para catálogos DCAT-AP-ES:
const endpoints = [
{ name: 'datos.gob.es', url: 'https://datos.gob.es/virtuoso/sparql' },
{ name: 'data.europa.eu', url: 'https://data.europa.eu/sparql' },
];Puedes cambiar el endpoint en la interfaz o modificar el array en app/page.tsx.
En lib/modelService.ts:
this.config = {
modelPath: '/tfjs_model/model.json',-
"Dame todos los datasets en formato CSV"
PREFIX dcat: <http://www.w3.org/ns/dcat#> PREFIX dct: <http://purl.org/dc/terms/> SELECT DISTINCT ?dataset ?title WHERE { ?dataset a dcat:Dataset . ?dataset dct:title ?title . ?dataset dcat:distribution ?dist . ?dist dct:format <http://publications.europa.eu/resource/authority/file-type/CSV> . FILTER (lang(?title) = 'es') } LIMIT 100
-
"Lista datasets sobre salud"
PREFIX dcat: <http://www.w3.org/ns/dcat#> PREFIX dct: <http://purl.org/dc/terms/> SELECT DISTINCT ?dataset ?title WHERE { ?dataset a dcat:Dataset . ?dataset dct:title ?title . ?dataset dcat:theme <http://datos.gob.es/kos/sector-publico/sector/salud> . FILTER (lang(?title) = 'es') } LIMIT 100
-
"Busca datasets publicados por el Ministerio de Sanidad"
PREFIX dcat: <http://www.w3.org/ns/dcat#> PREFIX dct: <http://purl.org/dc/terms/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT DISTINCT ?dataset ?title WHERE { ?dataset a dcat:Dataset . ?dataset dct:title ?title . ?dataset dct:publisher ?publisher . ?publisher foaf:name ?name . ?publisher dct:identifier "E05070101" . } LIMIT 100
La knowledge base incluye mapeos de vocabularios oficiales:
- URI Base:
http://publications.europa.eu/resource/authority/file-type/ - Ejemplos: CSV, JSON, XML, RDF_XML, PDF, XLSX
- URI España:
http://datos.gob.es/kos/sector-publico/sector/ - URI Europa:
http://publications.europa.eu/resource/authority/data-theme/ - Ejemplos: HEAL (salud), ENVI (medio ambiente), TRAN (transporte), ECON (economía)
- URI Base:
http://publications.europa.eu/resource/authority/frequency/ - Ejemplos: DAILY, WEEKLY, MONTHLY, ANNUAL
Ver documentación completa: DCAT-AP-ES
Verifica la configuración de tu proveedor LLM:
Ollama:
# Verificar que Ollama está corriendo
curl http://localhost:11434/api/tags
# Si no está instalado, descarga desde https://ollama.ai
ollama pull llama3.1:8b
ollama pull nomic-embed-textGitHub Models:
# Verificar token
curl -H "Authorization: Bearer $GITHUB_TOKEN" \
https://models.github.ai/catalog/modelsRe-indexa la knowledge base:
npm run index-kbSi el problema persiste, fuerza re-indexación:
npm run index-kb:resetnpm i -g vercel
vercelConfigura las variables de entorno en el dashboard de Vercel.
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["npm", "start"]Build:
docker build -t sparql-naturalizer .
docker run -p 3000:3000 \
-e LLM_PROVIDER=ollama \
-e OLLAMA_API_URL=http://host.docker.internal:11434 \
sparql-naturalizerEl código fuente esta licenciado bajo CC-BY 4.0 - Ver LICENSE para más detalles.
Caution
Los productos generados por IA pueden estar sujetos a términos adicionales según el proveedor LLM utilizado.
- DCAT-AP-ES - Perfil de aplicación español
- DCAT-AP - Perfil europeo
- datos.gob.es - Catálogo nacional de datos abiertos
- data.europa.eu - Portal europeo de datos
- LangChain - Framework para aplicaciones LLM
- Next.js - Framework React
- YASGUI - Editor SPARQL
Para preguntas o sugerencias, abre un issue en GitHub.