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