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
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.
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
yisSatisfiable
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.