Configurar Joseki para inferencia en un modelo OWL + Reglas
Hasta hace un tiempo venía usando Joseki para dar servicio de consultas SPARQL pero generando un modelo a nivel RDF/RDFS. Si bien estaba trabajando sobre una ontología definida en OWL, estaba perdiendo algunas cosas provechosas de ese nivel de abstracción.
En esa configuración tenía definidas algunas reglas ad-hoc para inferir cierto conocimiento en base a lo que tenía en las instancias. Pero hace unos días, me enviaron una actualización de la ontología sobre la que estaba trabajando, en la cual ahora tenía restricciones y reglas en OWL para poder hacer clasificación automática de las instancias. Generalmente se definen utilizando condiciones necesarias y suficientes (para los que hicieron la materia modelos de e-negocios conmigo recuerden las Pizzas 🙂 ).
Me tomó bastante tiempo de lectura de documentación, buscar en por la web, y probar distintas soluciones. Al final de ese post pongo algunos links que me acuerdo que consulté, pero seguramente me olvido alguno.
Bien. Joseki se configura a través del Jena Assembler. Es un volcabulario definido por el proyecto Jena en RDFS. En realidad debería escribir un post donde muestre como configurar un modelo básico para no desviarme ahora, pero se ve algo así:
# Service configuration [] rdf:type joseki:Service ; rdfs:label "SPARQL on MySite" ; joseki:serviceRef "service" ; # dataset part joseki:dataset _:site ; # Service part. # This processor will not allow either the protocol, # nor the query, to specify the datset. joseki:processor joseki:ProcessorSPARQL_FixedDS ; . ## -------------------------------------------------------------- ## Datasets _:site rdf:type ja:RDFDataset ; rdfs:label "My Site" ; ja:defaultGraph [ rdfs:label "Site.owl" ; a ja:Model; ja:content [ ja:externalContent <http://ontologiasweb.com.ar/data.owl> ; ] ; #A-Box ja:content [ ja:externalContent <http://ontologiasweb.com.ar/schema.owl> ;] ; #T-Box ] . |
Con eso se define un servicio (Servlet) al cual se le envia una consulta SPARQL por el parámetro «query».
Hasta acá es algo similar a la configuración que tenía.
En la configuración que muestro a continuación estoy utilizando el reasoner genérico que provee Jena, para poder utilizar las reglas que comenté en los párrafos previos. Sin embargo ahora quería tener inferencia sobre OWL.
## -------------------------------------------------------------- ## Datasets _:site rdf:type ja:RDFDataset ; rdfs:label "My Site" ; ja:defaultGraph [ rdfs:label "Site.owl" ; a ja:InfModel; ja:content [ ja:externalContent <http://ontologiasweb.com.ar/data.owl> ; ] ; #A-Box ja:content [ ja:externalContent <http://ontologiasweb.com.ar/schema.owl> ;] ; #T-Box ja:reasoner [ ja:reasonerURL <http://jena.hpl.hp.com/2003/GenericRuleReasoner> ; ja:rulesFrom <file:Data/inference_rules.rules> ; ]; ] . |
Para esto encontré que podía definir en vez de un InfModel, un OntModel con el Assembler. Como el OntModel implementa la interfaz InfModel, supuestamente no debía cambiar nada más. Bien, hecho esto probé y no pude consultar por los inferred statements.
Es ahí donde pruebo con el ontModelSpec para decirle que utilice OWL_MEM_RULE_INF, con lo cuál logro obtener resultados inferidos de acuerdo a las reglas OWL, pero pierdo las reglas personalizadas.
Continué leyendo documentación y tratando de detectar el problema. Es como que me estuviera faltando definir las reglas OWL. Se me ocurrió por un momento la descabellada idea de describir las reglas de inferencia para un subconjunto de OWL.. desistí enseguida 😉
En el sitio de Jena, en un howto de inferencia, encontré que a las reglas se les podía incluir mediante @include con OWL, OWLMicro, OWLMini, RDFS, etc.
¡¡Eso era lo que buscaba!!!
La solución a todo esto fue configurarlo como:
- Un InfModel
- Agregar todos los A-Box y T-Box necesarios como contenido
- Agregar el rasonador genérico
- En las reglas agregar una cláusula @include
con la cuál le digo que agrege inferencia OWL.
Configuración final de joseki (segmento)
# Service configuration [] rdf:type joseki:Service ; rdfs:label "SPARQL on MySite" ; joseki:serviceRef "service" ; # dataset part joseki:dataset _:site ; # Service part. # This processor will not allow either the protocol, # nor the query, to specify the datset. joseki:processor joseki:ProcessorSPARQL_FixedDS ; . ## -------------------------------------------------------------- ## Datasets _:site rdf:type ja:RDFDataset ; rdfs:label "My Site" ; ja:defaultGraph [ rdfs:label "Site.owl" ; a ja:InfModel; ja:content [ ja:externalContent <http://ontologiasweb.com.ar/data.owl> ; ] ; #A-Box ja:content [ ja:externalContent <http://ontologiasweb.com.ar/schema.owl> ;] ; #T-Box ja:reasoner [ ja:reasonerURL <http://jena.hpl.hp.com/2003/GenericRuleReasoner> ; ja:rulesFrom <file:Data/inference_rules.rules> ; ]; ] . |
Ejemplo del archivo de reglas (Data/inference_rules.rules):
#Defino prefijos @prefix p1: <http://ontologiasweb.com.ar/schema.owl#>. @include <OWLMini>. [rule1: (?P p1:predicado1 ?S), (?S p1:predicado2 ?C), (?C p1:predicado3 ?T) ->(?S p1:predicadoNuevo ?T) ] [rule2: (?P p1:predicadoNuevo ?S), (?S p1:predicadoNuevo ?C), ->(?P p1:predicadoNuevo ?C) ] |
Sí, una solución bastante simple, pero la documentación la tenía un poco escondida y no estaba descripto como un problema (porque seguramente no lo és), pero esto es lo que observé:
- No se puede definir un modelo OntModel con ontModelSpec y agregar un reasoner externo o interno con reglas propias. Es como que contradice el alcance de razonamiento definido por ontModelSpec.
- Si no se pone ontModelSpec, por más que sea un OntModel, no hay inferencia OWL por defecto como está muy bien explicado en el sitio de Jena.
- Si no se agregan los T-Box es decir el schema que define tu ontología, no hay inferencia OWL. Al parecer no importa las ontologías indicadas por las cláusulas owl:imports dentro del archivo de instancias.
- Hay otras alternativas para mezclar los distintos tipos de reglas, como ser modelos de inferencia en cascada, etc. Sus pros y cons.
Quizá sea porque me faltó leer aún más toda la documentación de Jena, pero es algo de nunca acabar :-). Siempre descubro algo nuevo.
Espero que esto le sea de utilidad a alguien. Cualquier experiencia relacionada al tema o aporte bienvenido!
Enlaces de sitios que estuve consultando:
Rafael
Hola! Muy interesante este post y muy útil para los que tenemos que usar Joseki. Yo estoy haciendo el proyecto fin de carrera con Jena y Joseki y me ha surgido una duda ¿es posible actualizar un fichero RDF cargado en Joseki y que los cambios sean visibles sin tener que relanzar Joseki. Te agradecería mucho la ayuda que me puedas proporcionar, pues estoy atascado aquí.
Nacho
Hola Rafael. Si estás usando Joseki con un dataset que toma los datos de un archivo RDF los cambios se ven reflejadas sólamente como bien decís reiniciando el servidor. Quizá haciendo que lo cargue de nuevo te evitarías reiniciarlo, pero el tema es que todo el archivo es cargado en memoria.
No se cómo podrías hacer para que cargue el archivo nuevamente, quizá agregando algún servicio a la aplicación web que se ocupe de esto.
Otra opción sería que utilices una BD relacional con Joseki. Hay un par de ejemplos en el sitio oficial, y te podés ayudar con este post que hice al respecto.
Ahora bien, lo que no he logrado es que si hago una modificación en la DB, y además estoy usando algún razonador, los cambios se vean reflejados. Incluso sería hasta discutible la utilidad ya que las relaciones inferidas deberían ser invalidadas debido a que algunas modificaciones podrían estar cambiando su condición de verdad. Me explico?
Espero que podamos intercambiar material al respecto, estoy investigando activamente en esto.
Saludos!
Clara
Hola
Estoy comenzando a trabajar en el tema de ontología y necesito grandemente saber como definir una regla de inferencia en mi ontología, me pudieras ayudar? , gracias
nacho
Hola Clara,
en mi experiencia personal que sólo trabajé con OWL 1, usé Jena[0] con su propio motor de inferencia [1]. Pero tengo entendido que OWL2[2] soporta Rules, aunque dependerá de la API que uses para acceder que pueda interpretarlas y usarlas. Podés buscar algo en Pellet[3] y OWLAPI[4]. De esto último no probé nada. Sólo usé Pellet con OWL para razonarlo.
Te recomiendo seguir los ejemplos de Jena, a mi me sirvieron. Cualquier cosa consultame, no soy un experto en el área pero te puedo contar un poco más.
Saludos y gracias por comentar!
[0] http://jena.sourceforge.net/
[1] http://jena.sourceforge.net/inference/
http://jena.sourceforge.net/inference/#RULEsyntax
[2] http://www.w3.org/TR/owl2-profiles/#Reasoning_in_OWL_2_RL_and_RDF_Graphs_using_Rules
[3] clarkparsia.com/pellet
[4] http://owlapi.sourceforge.net/
esther
Hola,
He desarrollado una ontología con protegé. Mediante WebProtegé la ontología va a estar accesible via web pero quiero poder realizar consultas a dicha ontologia vía web tambien. He visto que con joseki se puede hacer pero no se por donde empezar. Me he descargado joseki pero estoy totalmente perdida.¿Me podrían ayudar para saber por donde empezar?
Un saludo y gracias de antemano!!
Luis
Hola Esther,
Si la Ontología es accesible desde la Web, bajate un cliente SPARQL como twinkle [1].
Recuerda que tienes que indicar el FROM.
Ejemplo, todas las tripletas
SELECT *
FROM
WHERE {
?t ?p ?q .
}
Un saludo,
Luis
[1] http://www.ldodds.com/projects/twinkle/
Luis
«FROM signo menor que URL signo menor que»