Retrieve inferred object property filler in OWL ontology

289 views Asked by At

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!

1

There are 1 answers

3
Dmitry Tsarkov On BEST ANSWER

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 whether C and not (P some D) is unsatisfiable (alternatively, you can just check isSubsumedBy(C, P some D)).

You can improve the exploration time if you use some techniques that are used for classification, e.g.:

  • if C is a subclass of P some D, then so are all sub-classes of C
  • if C is not a subclass of P some D, then so are all super-classes of C
  • Similar rules for sub/super classes/properties of P and D
  • You can give names to all the P some Thing expressions. After classification you can restrict the search for C 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?

Using the OWLKnowledgeExplorerReasoner from JFact as suggested here did not work because it crashed when retrieving the neighbour labels (Exception Unreachable situation!).

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++?