kurious
kurious

Reputation: 1044

Representing conditionality using OWL2

I'm building an ontology to classify records from a database. It will iterate over updated versions of database. Hence it needs to account for potential changes.

This is my use case:

A person takes 3 doses of DrugA (each event being represented as drugA1 being taken as dose1 by dose1Person, drugA2 being taken as dose2 by dose2Person and so on). The classes and conditions are described:

CompletePerson: If person has taken all 3 doses IncompletePerson: If person has taken dose 1 and/or dose 2

If I represent the 'Incomplete' class as:

((dose1 or dose2) and (not dose3)), I get no inferred individuals for the class even when database records show I should.

This is probably because of Open World Assumption. In the ontology, I say a person has received such and such dose, not what the person has not received.

If I create this axiom for the class:

dose1 or dose2

the class becomes a superclass of CompletePerson (which in turn is a subclass of dose1Person, dose2Person, and dose3Person). How should I represent the axoim for IncompletePerson so that it isn't inferred as a superclass of CompletePerson.

Upvotes: 1

Views: 65

Answers (1)

Joshua Taylor
Joshua Taylor

Reputation: 85883

In the ontology, I say a person has received such and such dose, not what the person has not received.

That's really the issue here. If you don't say what they haven't received, then you don't have a way to know that they haven't received a given dose. E.g., if I tell you that John took dose1 and dose2, and don't tell you whether he's taken dose3 or not, you can't know whether John is actually a CompletePerson or an IncompletePerson.

You'll need to make an assertion that says what things John has and hasn't taken. E.g., in addition to

        John took dose1 .
        John took dose2 .

you'd also assert that

        John : (took only {dose1 dose2})

Then, as long as you know that dose1 ≠ dose3 and dose2 ≠ dose3, you can infer that John is an incomplete person because John hasn't taken dose3.

Now, you've phrased the idea as a conditional "if a person took all three doses, then they are a CompletePerson", but I think you really want that to be definitional, i.e., an equivalence: "a person took all three doeses id and only if they are a CompletePerson". You need that equivalence, because otherwise a person could be complete for some other reason, and you want to exclude that possibility.

Once you've done that, you can just say that Person is the disjoint union of CompletePerson and IncompletePerson.

Here's an OWL ontology with a class hierarchy:

Person         (disjoint union of Incomplete and Complete)
  Incomplete   
  Complete == (took value dose1) and (took value dose2) and (took value dose3)

and individuals:

John : Person, (took only {dose1, dose2}), took dose1, took dose2
Mary : Person, took dose1, dose2, dose3
dose1 : ≠ dose2, ≠ dose3
dose2 : ≠ dose1, ≠ dose3
dose3 : ≠ dose1, ≠ dose2

You'll be able to infer that Mary is complete and John is incomplete.

It's in Turtle serialization, you can download it and open it in Protege.

@prefix :      <http://www.semanticweb.org/user/ontologies/2016/2/untitled-ontology-58#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix untitled-ontology-58: <http://www.semanticweb.org/taylorj/ontologies/2016/2/untitled-ontology-58#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .

_:b0    a               owl:Restriction ;
        owl:hasValue    untitled-ontology-58:dose2 ;
        owl:onProperty  untitled-ontology-58:took .

<http://www.semanticweb.org/taylorj/ontologies/2016/2/untitled-ontology-58>
        a       owl:Ontology .

[ a                    owl:AllDifferent ;
  owl:distinctMembers  ( untitled-ontology-58:dose1 untitled-ontology-58:dose2 untitled-ontology-58:dose3 )
] .

untitled-ontology-58:took
        a       owl:ObjectProperty .

untitled-ontology-58:Incomplete
        a                owl:Class ;
        rdfs:subClassOf  untitled-ontology-58:Person .

_:b1    a               owl:Restriction ;
        owl:hasValue    untitled-ontology-58:dose3 ;
        owl:onProperty  untitled-ontology-58:took .

untitled-ontology-58:dose3
        a       owl:Thing , owl:NamedIndividual .

untitled-ontology-58:Mary
        a                          owl:Thing , untitled-ontology-58:Person , owl:NamedIndividual ;
        untitled-ontology-58:took  untitled-ontology-58:dose1 , untitled-ontology-58:dose2 , untitled-ontology-58:dose3 .

untitled-ontology-58:Complete
        a                    owl:Class ;
        rdfs:subClassOf      untitled-ontology-58:Person ;
        owl:equivalentClass  [ a                   owl:Class ;
                               owl:intersectionOf  ( _:b2 _:b0 _:b1 )
                             ] .

untitled-ontology-58:Person
        a                    owl:Class ;
        owl:disjointUnionOf  ( untitled-ontology-58:Complete untitled-ontology-58:Incomplete ) .

untitled-ontology-58:dose2
        a       owl:Thing , owl:NamedIndividual .

untitled-ontology-58:John
        a                          owl:Thing , untitled-ontology-58:Person , owl:NamedIndividual ;
        a                          [ a                  owl:Restriction ;
                                     owl:allValuesFrom  [ a          owl:Class ;
                                                          owl:oneOf  ( untitled-ontology-58:dose2 untitled-ontology-58:dose1 )
                                                        ] ;
                                     owl:onProperty     untitled-ontology-58:took
                                   ] ;
        untitled-ontology-58:took  untitled-ontology-58:dose1 , untitled-ontology-58:dose2 .

_:b2    a               owl:Restriction ;
        owl:hasValue    untitled-ontology-58:dose1 ;
        owl:onProperty  untitled-ontology-58:took .

untitled-ontology-58:dose1
        a       owl:Thing , owl:NamedIndividual .

See Also

Upvotes: 1

Related Questions