Reputation: 1044
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
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 .
Upvotes: 1