Configurar Joseki para inferencia en un modelo OWL + Reglas

Posted on the noviembre 27th, 2007 under General,Inteligencia Artificial,Probando herramientas,Web Semántica by Nacho

jena 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:

  1. Common ontology application problems
  2. HOWTO use Jena with an external DIG reasoner
  3. Jena 2 Inference support
  4. Jena Documentation
  5. Jena Yahoo Group
  6. Jena JavaDoc
  7. Es lo más [Algunos experimentos con Jena]

7 Responses to 'Configurar Joseki para inferencia en un modelo OWL + Reglas'

  1. enero 15, 2008 a las 6:31 am
    Rafael
  2. enero 21, 2008 a las 5:15 pm
    Nacho
  3. abril 14, 2010 a las 11:06 am
    Clara
  4. abril 16, 2010 a las 3:14 pm
    nacho
  5. mayo 29, 2011 a las 6:52 pm
    esther
  6. julio 27, 2012 a las 9:02 am
    Luis
  7. julio 27, 2012 a las 9:04 am
    Luis

Leave a Reply




XHTML::
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>