How can I retrieve for each class in my ontology O all (inferred) existential restrictions?
My current approach is to iterate over all pairs of classes and object properties, and check if the restriction is satisfied:
- for each subclass (C, D) in Classes(O) × Classes(O):
- for each property P defined in Object properties(O):
- if C and P some D is satisfiable:
- yield (C, P, D)
This is pretty slow as I am working with the vaccine ontology which has 4557 classes and 107 object properties. Even it is a one-time computation, I may learn something from seeing better approaches.
Using the OWLKnowledgeExplorerReasoner
from JFact as suggested here did not work because it crashed when retrieving the neighbour labels (see my test case)
Can you suggest any improved solution using OWLAPI, Protégé or any other tool? Also, it would be nice to only retrieve the most specific filler classes.
Thanks!
First of all, your check is wrong. For an empty ontology
C and P some D
would be satisfiable, which is not what you want. You have to check whetherC and not (P some D)
is unsatisfiable (alternatively, you can just checkisSubsumedBy(C, P some D)
).You can improve the exploration time if you use some techniques that are used for classification, e.g.:
C
is a subclass ofP some D
, then so are all sub-classes ofC
C
is not a subclass ofP some D
, then so are all super-classes ofC
P
andD
P some Thing
expressions. After classification you can restrict the search forC
only to sub-classes of these concepts.It also helps if you can narrow down the problem. Do you really need to check all pairs and all properties?
Could you please provide a test case and a full stacktrace of the problem so we can fix it? Did you try to use the same with FaCT++?