es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

OWLAPI: Razonamiento sobre ontologías con disyunciones

Tengo una ontología con un individuo a y 6 clases (A, B, C, D, E, F). El individuo pertenece a las siguientes disyunciones: (A o B; C o D; E o F).

¿Existe alguna forma en la que pueda inferir que un individuo debe estar en una de las dos clases de cada disyunción? Intenté crear un estado en el que se cumplan todas las afirmaciones de la ontología. Por ejemplo, que a pertenece a A, C, F. Pero con la función getTypes para el reasoner de owlapi no es posible, porque devuelve un NodeSet vacío.


ontologyManager = OWLManager.createOWLOntologyManager();
ontology = ontologyManager.loadOntologyFromOntologyDocument(new File(Configuration.ONTOLOGY));
OWLReasonerFactory reasonerFactory = new OpenlletReasonerFactory();
reasoner = reasonerFactory.createReasoner(ontology);
reasoner.getTypes(ind, false).getNodes()

También intenté con Hermit (ReasonerFactory()) y jFact (JFactFactory()).

También intenté lo siguiente:


Set ontologyTypes = EntitySearcher.getTypes(ind, ontology).collect(toSet());

Pero esto solo me devuelve ClassExpression en forma de ObjectUnionOf, lo cual no ayuda porque necesito clases atómicas.

Entiendo que el reasoner infiere en esta función solo las clases a las que el individuo siempre pertenece. Pero ¿hay alguna forma de decidir a qué clases de la disyunción debería pertenecer? Necesito construir un modelo para cualquier ontología, pero no puedo encontrar ninguna función en el reasoner que haga esto o algo similar.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Lamentablemente, el comportamiento que estás experimentando con el Reasoner es esperado con la OWLAPI. El método getTypes devuelve únicamente las clases nombradas inmediatas a las que un individuo pertenece, y no distingue entre las disyunciones lógicas individuales.

    Una forma de lograr el resultado deseado es iterar manualmente a través de cada disyunción y verificar a qué clases nombradas pertenece el individuo, utilizando una combinación de los métodos getSubClasses y isSatisfiable del reasoner.

    Por ejemplo, para verificar a qué clase pertenece un individuo en la disyunción de A o B, puedes llamar a getSubClasses en la expresión de clase ObjectUnionOf(A B), e iterar sobre las clases devueltas para verificar cuáles son satisfacibles con el individuo. Esto te permitiría determinar a cuál de A o B pertenece el individuo, y de manera similar para las otras disyunciones.

    Otra solución podría ser modificar la propia ontología definiendo clases nombradas para cada una de las combinaciones posibles de las disyunciones, y utilizando expresiones de clase para restringir al individuo a pertenecer a una de las dos clases nombradas en cada disyunción. Esto permitiría que el Reasoner infiera adecuadamente las clases nombradas a las que pertenece el individuo.

    En general, determinar a qué clases nombradas pertenece un individuo en una ontología compleja puede ser una tarea desafiante y requiere considerar cuidadosamente la estructura de la ontología y las capacidades de razonamiento del Reasoner.

Comments are closed.