aehrc / snorocket

The Snorocket Description Logic classifier for EL++ with concrete domains support
Apache License 2.0
22 stars 6 forks source link

Filtering redundant roles from inferred axioms #5

Closed davetrig closed 8 years ago

davetrig commented 8 years ago

Given the following concepts:

and the following roles:

Such that part-of is the right identity of located-in, I have defined the following axioms:

Concept [id=Heart-Valve-Disease] ⊑ (located-in.Concept [id=Heart-Valve] + Concept [id=ROOT])
(located-in.Concept [id=Heart] + Concept [id=ROOT]) ⊑ Concept [id=Heart-Disease]
Concept [id=Heart-Disease] ⊑ (located-in.Concept [id=Heart] + Concept [id=ROOT])
Concept [id=Heart-Valve] ⊑ (part-of.Concept [id=Heart] + Concept [id=ROOT])
Concept [id=Heart] ⊑ Concept [id=ROOT]
located-in o part-of ⊑ located-in

After classifying with the Snorocket Reasoner, I get the following inferred axioms: (retrieved using reasoner.getInferredAxioms())

Concept [id=Heart-Valve-Disease] ⊑ (located-in.Concept [id=Heart] + located-in.Concept [id=Heart-Valve] + Concept [id=Heart-Disease])
Concept [id=Heart-Disease] ⊑ (located-in.Concept [id=Heart] + Concept [id=ROOT])
Concept [id=Heart] ⊑ Concept [id=ROOT]
Concept [id=Heart-Valve] ⊑ (part-of.Concept [id=Heart] + Concept [id=ROOT])

This seems mostly correct, except the axiom for Heart-Valve-Disease, which includes both existentials located-in.(Heart) and located-in.(Heart-Valve), which I believe is redundant. Some comments in the core project mention that some redundant roles may exist in the inferred axioms, so I'm assuming this is an example of that possible redundancy.

It would seem to me that this kind of redundancy must have already been addressed in order to successfully classify SNOMED CT, but I can find no mention of a solution.

My questions: Is my assumption correct, that this redundancy is an expected side-effect in the Snorocket reasoner? If so, is there an existing function or algorithm to remove these redundant roles, or must I write my own filter?
If not, is there an additional role axiom that I'm missing in the input to prevent this, or I am retrieving inferred axioms incorrectly? (or am I missing something else entirely?)

Thanks in advance for your help.

ametke commented 8 years ago

Hi davetrig,

We use the getInferredAxioms() method to produce the distribution normal form of SNOMED CT in another module (that is not open sourced) but in general this method should not be used for arbitrary ontologies because it will not produce correct results (it makes assumptions about the ontology that will only hold for SNOMED CT).

So, to answer your question, yes, the redundancy is likely to be an expected side effect and there is a module that removes redundancies that works for SNOMED CT but it is not available as open source.

That said, you should only need a method like getInferredAxioms() if you need to produce something like SNOMED's distribution normal form. For the typical uses of a reasoner (e.g. determining subsumption relationships) you could use the taxonomy that is generated during classification (check the getNodeMap() method in the Ontology class).

davetrig commented 8 years ago

Thanks ametke, that's good to know. I am indeed trying to create the inferred view for arbitrary ontologies. We'll just have to work out a solution for either filtering the redundancies or calculating role inheritance separately. Thanks again for the quick response!