El grafo de conocimiento
Subpáginas
Las páginas de detalle que cuelgan de este hub. Cada una desarrolla una pieza del grafo.
La ontología EKG
El modelo educativo del dominio Python con perfil OWL 2 RL, SKOS y SHACL.
Inferencia y razonamiento
La materialización OWL 2 RL que lleva de 1772 a 4786 triples.
Validación con SHACL
Las formas que garantizan la integridad, con cero violaciones.
Consulta con SPARQL
Las consultas que interrogan el grafo y la federación con Wikidata.
Enlazado a Wikidata
Los 30 enlaces skos:exactMatch hacia la web de datos.
Grafos de propiedades
La comparación con Neo4j y Cypher, declarada como camino no recorrido.
2El grafo de conocimiento (EKG)
El EKG modela el dominio de la programación en Python en RDF/OWL 2 RL. Es la base semántica del proyecto y la fuente de contexto de los sistemas C y D.
Grafoteca interactiva — todos los grafos del proyecto
Un único lienzo para ver y manipular los grafos del proyecto. Elige el tipo, busca un
concepto, agrúpalo por tema, alterna la inferencia o compara el grafo RDF con su versión de propiedades. Para recorrerlo tienes zoom, un minimapa en la esquina y, al pasar el ratón sobre un nodo, un rótulo con su tema y dificultad. Todos
los datos proceden del .ttl canónico y van embebidos, sin red. El detalle argumentado está en la
memoria.
Alternativa sin arrastrar y operable por teclado: puedes explorar el grafo entero con los desplegables "Tipo de grafo" y "Filtrar por tema", el campo "Buscar concepto" y el desplegable "Resaltar concepto" (más abajo), sin necesidad de arrastrar ni de gestos. Los botones "Encajar", "+" y "−" sustituyen al arrastre y al zoom de rueda. El contenido equivalente está además en forma textual: los bloques Turtle, las tablas y la lista de conceptos.
Selecciona un tipo de grafo y, si quieres, un nodo para ver sus relaciones.
›Equivalente textual y conteos (accesibilidad)
El grafo modela 157 conceptos en 16 temas, con 174
prerrequisitos, 14 contrastes, 16 errores conceptuales, la malla SKOS 19/19/16
(broader/narrower/related), 30 enlaces skos:exactMatch a Wikidata y 10 formas SHACL.
La tabla de conceptos por tema (consulta 01) y las 8 consultas con su salida ofrecen el detalle textual.
| Métrica | Valor | Objetivo |
|---|---|---|
| Conceptos (skos:Concept) | 157 | ≥150 |
| Triples afirmados → tras OWL 2 RL | 1772 → 4786 | ≥1500 |
| Validación SHACL | Conforme (0 violaciones) | Sí |
Enlaces skos:exactMatch a Wikidata | 30 | ≥15 |
| Relaciones SKOS internas (broader/narrower · related) | 19 · 16 | — |
| Clases · prop. objeto · prop. datos | 20 · 21 · 7 | — |
skos:exactMatch, no owl:sameAsEl enlazado a Wikidata usa skos:exactMatch (no owl:sameAs) de forma deliberada: así el
razonador OWL 2 RL no fusiona el concepto propio con la entidad de Wikidata. Por eso la consulta
?x a pyedu:Concepto con inferencia devuelve 157 (solo los conceptos propios).
Un subgrafo de ejemplo
SPARQL: consulta federada a Wikidata
La consulta 08_federada_wikidata.rq recupera, para cada concepto enlazado, su descripción en
español desde el endpoint de Wikidata. Ejecutada en vivo, devuelve 20 filas reales.
PREFIX pyedu: <https://w3id.org/ekg-python/schema#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
SELECT ?concepto ?etiqueta ?descripcionWikidata WHERE {
?concepto skos:exactMatch ?wd ; rdfs:label ?etiqueta .
FILTER(LANG(?etiqueta) = "es")
SERVICE <https://query.wikidata.org/sparql> {
?wd schema:description ?descripcionWikidata .
FILTER(LANG(?descripcionWikidata) = "es")
}
}
# → 20 filas. Ej.: python → "lenguaje de programación de alto nivel"
El grafo en Turtle
El EKG canónico se serializa en Turtle bajo el perfil OWL 2 RL. Estos son los prefijos y cuatro bloques representativos, literales del fichero ekg-python-150.ttl.
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix pyedu: <https://w3id.org/ekg-python/schema#> .
@prefix pyr: <https://w3id.org/ekg-python/id/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix schema: <http://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix wd: <http://www.wikidata.org/entity/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .pyr:recursion a pyedu:PrincipioTransversal ;
rdfs:label "Recursion"@en,
"Recursión"@es ;
rdfs:comment "Definición de una función en términos de sí misma."@es ;
skos:exactMatch wd:Q264164 ;
skos:narrower pyr:recursion_cola ;
skos:prefLabel "Recursión"@es ;
skos:related pyr:bucle_for ;
pyedu:aNivelDominio pyr:avanzado ;
pyedu:contrastaCon pyr:bucle_for ;
pyedu:perteneceATema pyr:T_recursion ;
pyedu:requierePrerrequisito pyr:funcion ;
pyedu:tieneDificultad 4 .pyr:busqueda_binaria a pyedu:PrincipioTransversal ;
rdfs:label "Binary search"@en,
"Búsqueda binaria"@es ;
skos:exactMatch wd:Q243754 ;
skos:prefLabel "Búsqueda binaria"@es ;
skos:related pyr:busqueda_lineal ;
pyedu:perteneceATema pyr:T_complejidad ;
pyedu:requierePrerrequisito pyr:bucle_while,
pyr:indexacion ;
pyedu:seAplicaA pyr:lista ;
pyedu:tieneDificultad 4 .pyr:err_iteracion_recursion a pyedu:ErrorConceptual ;
rdfs:label "Iteration vs recursion confusion"@en,
"Confusión iteración / recursión"@es ;
pyedu:errorSobreConcepto pyr:recursion .pyr:stmt_offbyone a rdf:Statement ;
rdfs:label "Provenance (reification): off-by-one on indexing per Keuning et al."@en,
"Procedencia (reificación): off-by-one sobre indexación según Keuning et al."@es ;
dcterms:source pyr:ref_keuning2019 ;
rdf:object pyr:indexacion ;
rdf:predicate pyedu:errorSobreConcepto ;
rdf:subject pyr:err_off_by_one ;
rdfs:comment "Procedencia del enunciado (patrón de reificación del material docente)."@es .Visualización del grafo completo
Los 157 conceptos agrupados por tema, con sus prerrequisitos, su jerarquía skos:broader y sus contrastes. Elija un concepto para resaltar sus relaciones (o pase el cursor por un nodo).
Pase el cursor o seleccione un concepto para ver sus prerrequisitos, su tema, sus contrastes y sus errores asociados.
.ttl canónico y embebido (sin red).Las 8 consultas SPARQL, con salida real
Cada consulta se ejecuta sobre el grafo inferido (4786 triples) y su salida procede de scripts/consultar.py (la federada, de salidas/08_federada_wikidata.txt).
| # | Consulta | Qué demuestra | Salida real |
|---|---|---|---|
| 01 | 01_conceptos_por_tema.rq | SELECT + GROUP BY + GROUP_CONCAT + FILTER(LANG) | 16 temas con sus conceptos |
| 02 | 02_inferencia_conceptos.rq | SELECT diagnóstico de la inferencia de tipos | 0 sin inferencia → 157 con OWL-RL |
| 03 | 03_prerrequisitos_transitivos.rq | property path transitivo (+) | 5 prerrequisitos de búsqueda binaria |
| 04 | 04_ruta_aprendizaje.rq | property path + OPTIONAL + ORDER BY dificultad | 1 fila (Función, dificultad 2) |
| 05 | 05_errores_por_concepto.rq | OPTIONAL sobre reificación rdf:Statement | 16 errores (uno con fuente Keuning 2019) |
| 06 | 06_construct_prereq_directos.rq | CONSTRUCT que materializa el cierre transitivo | 356 triples construidos (340 sin inferencia) |
| 07 | 07_diagnostico_envio.rq | SELECT diagnóstico-RAG (caso de uso del TFM) | 2 filas (off-by-one→Indexación; iteración/recursión→Recursión) |
| 08 | 08_federada_wikidata.rq | consulta federada SERVICE a Wikidata | 20 filas reales (descripción @es) |
›Código de 02_inferencia_conceptos.rq
PREFIX pyedu: <https://w3id.org/ekg-python/schema#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
# Consulta DISEÑADA para evidenciar la inferencia RDFS.
# Recupera todo lo que es pyedu:Concepto.
# - Inferencia NONE: 0 resultados (ningún individuo se tipa a mano
# como Concepto; solo por su subcategoría).
# - Inferencia RDFS/OWL-RL: 157 resultados (rdfs:subClassOf propaga el tipo).
SELECT ?concepto ?etiqueta
WHERE {
?concepto a pyedu:Concepto ;
rdfs:label ?etiqueta .
FILTER(LANG(?etiqueta) = "es")
}
ORDER BY ?etiqueta›Código de 03_prerrequisitos_transitivos.rq
PREFIX pyedu: <https://w3id.org/ekg-python/schema#>
PREFIX pyr: <https://w3id.org/ekg-python/id/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
# Prerrequisitos directos e indirectos de "búsqueda binaria" mediante
# un property path (+). Esta consulta NO necesita razonador: el camino
# transitivo se calcula en tiempo de consulta. Es el contraste didáctico
# con la propiedad owl:TransitiveProperty, que materializa los mismos
# hechos por inferencia.
SELECT DISTINCT ?prerequisito ?etiqueta
WHERE {
pyr:busqueda_binaria pyedu:requierePrerrequisito+ ?prerequisito .
?prerequisito rdfs:label ?etiqueta .
FILTER(LANG(?etiqueta) = "es")
}
ORDER BY ?etiqueta›Código de 06_construct_prereq_directos.rq
PREFIX pyedu: <https://w3id.org/ekg-python/schema#>
# CONSTRUCT: materializa como triples directos el cierre transitivo de
# prerrequisitos. Devuelve un grafo nuevo (pyedu:tienePrerrequisitoTransitivo)
# que aplana la representación indirecta, útil para exportar o cargar
# en un sistema que no razone.
CONSTRUCT {
?concepto pyedu:tienePrerrequisitoTransitivo ?prerequisito .
}
WHERE {
?concepto pyedu:requierePrerrequisito+ ?prerequisito .
}Validación SHACL: conforme, y 6 violaciones en el control negativo
El grafo canónico es CONFORME (0 violaciones). Para probar que la validación no es vacua, un fichero con seis defectos deliberados (ejemplo-invalido.ttl) dispara exactamente 6 violaciones, una por defecto:
| # | Nodo | Propiedad | Violación |
|---|---|---|---|
| 1 | pyr:mal_concepto | pyedu:tieneDificultad | dificultad 8 fuera del rango 1–5 (sh:maxInclusive) |
| 2 | pyr:mal_ejercicio | pyedu:cubreConcepto | ejercicio sin ningún concepto cubierto (sh:minCount) |
| 3 | pyr:mal_concepto | pyedu:perteneceATema | concepto sin tema (sh:minCount) |
| 4 | pyr:mal_ejercicio | pyedu:tieneDificultad | ejercicio sin dificultad declarada (sh:minCount) |
| 5 | pyr:mal_concepto | rdfs:label | concepto sin etiqueta rdfs:label (sh:minCount) |
| 6 | pyr:mal_ejercicio | pyedu:tieneEnunciado | ejercicio sin enunciado (sh:minCount) |
Contraste de inferencia OWL 2 RL
El salto procede de rdfs:subClassOf (toda subclase de concepto es pyedu:Concepto). Como el enlazado usa skos:exactMatch y no owl:sameAs, las 30 entidades de Wikidata no se infieren como concepto, por eso el resultado es 157 y no 187.
Federada a Wikidata: las 20 filas reales
Hay 30 skos:exactMatch, pero la federada devuelve 20 filas porque solo 20 entidades tienen schema:description en español recuperable.
›Las 20 filas (id · etiqueta · descripción Wikidata @es)
| id | Etiqueta | Descripción (Wikidata, es) |
|---|---|---|
arbol_estr | Árbol | tipo abstracto de datos que imita la estructura jerárquica de un árbol |
polimorfismo | Polimorfismo | informática |
python | Python | lenguaje de programación de alto nivel |
regex | Expresiones regulares (re) | secuencia de caracteres que forma un patrón de búsqueda en cómputo teórico y teoría de lenguajes formales |
tabla_hash | Tabla hash | estructura de datos que asocia claves con valores, utilizando una función hash |
iterador | Iterador (iter, next) | En computación, un objeto que permite recorrer un contenedor. |
ordenacion_burbuja | Ordenación de burbuja | tipo de algoritmo de ordenamiento |
ordenacion_rapida | Ordenación rápida | algoritmo de ordenación |
closure | Clausura (closure) | función en informática que es evaluada en un entorno conteniendo una o más variables dependientes de otro entorno |
complejidad | Complejidad temporal | tiempo de ejecución que describe la demora de una máquina en procesar una tarea |
conjunto | Conjunto (set) | estructura de datos de tipo abstracto en informática |
recursion | Recursión | método en ciencias de computación |
bfs | Recorrido en anchura (BFS) | algoritmo de búsqueda no informada utilizado para recorrer o buscar elementos en un grafo (usado frecuentemente sobre árboles) |
busqueda_binaria | Búsqueda binaria | algoritmo de búsqueda |
generador | Generador (yield) | rutina especial en informática |
grafo_estr | Grafo (estructura) | tipo abstracto de datos que consiste en un conjunto de nodos |
clase | Clase | en programación orientada a objetos, plantilla para la creación de objetos de datos según un modelo predefinido |
diccionario | Diccionario | estructura de datos que asocia claves con valores |
herencia | Herencia | concepto en informática |
lista | Lista | dato abstracto que representa una secuencia ordenada de valores en ciencias de la computación |
VoID / FAIR
El grafo se publica como dato FAIR con una descripción void.ttl (Vocabulary of Interlinked Datasets):
| void:triples | 1772 |
| void:entities | 157 |
| void:classes · void:properties | 20 · 28 |
| Linkset a Wikidata (void:linkPredicate skos:exactMatch) | 30 enlaces |
| Licencia | CC BY 4.0 |
| Vocabularios reutilizados | RDFS, OWL, SKOS, Dublin Core, FOAF, schema.org |
Si este trabajo te resulta útil y quieres referenciarlo, esta es la cita recomendada.
Bueno Junquero, A. (2026). Integración de un grafo de conocimiento educativo con un LLM mediante RAG. Trabajo Fin de Máster, Máster Universitario en Investigación en Inteligencia Artificial, UNED. Director, José Luis Fernández Vindel.