Regarding the issue of modeling, I would like to offer a fourth alternative, which, in essence, is a combination of your options 1 and 2: introduce a separate class (hierarchy) for these âexcluded / absentâ symptoms, diseases or treatment, as well as specific exceptions in as examples:
:Exclusion a owl:Class . :ExcludedSymptom rdfs:subClassOf :Exclusion . :ExcludedTreatment rdfs:subClassOf :Exclusion . :excludedDyspnea a :ExcludedSymptom . :excludedChemo a :ExcludedTreatment . :Patient a owl:Class ; owl:equivalentClass [ a owl:Restriction ; owl:onProperty :excluded ; owl:allValuesFrom :Exclusion ] . // john is a patient without Dyspnea :john a :Patient ; :excluded :excludedDyspnea .
Optionally, you can associate exception instances semantically with treatment / symptoms / diseases:
:excludedDyspnea :ofSymptom :Dyspnea .
In my opinion, this is just as âontologically correctâ (such a thing is quite subjective, to be honest), like your other options, and it may be much easier to support, query and really reason.
As for your second question: although I canât talk about the behavior of the particular argument that you are using, generally any construct involving complementOf is very hard to compute, but perhaps more importantly, it probably does not capture what you intend.
OWL has an open global assumption, which (in a broad sense) means that we cannot decide that a certain fact is incorrect simply because this fact is currently unknown. The complementOf construct will logically be an empty class, because for any single X , even if we do not currently know that X was diagnosed with dyspnea, it is likely that this fact will become known in the future, and therefore X will not be in the complement class.
EDIT
In response to your edit, with a suggestion using one property :hasFinding , I think it looks good, although I might change it a bit:
:patient1 a :Patient; :hasFinding :dyspneaFinding1 . :dyspneaFinding1 a :Finding ; :of :Dyspnea ; :conclusion false .
Now you have separated the âfindingâ as a concept a little more purely from the symptom / treatment that was the detection. In addition, explicit modeling (or the presence or absence of an âexcludedâ property or an âExceptionâ type is not implied) whether this positive or negative finding is positive or negative.
(Aside: as we connect the person to the class here through a non-printing relationship ( ... :of :Dyspnea ), we must rely on OWL 2 punning to make this valid in OWL DL)
Request a patient with detection (positive or negative) about the discrete:
SELECT ?x WHERE { ?xa :Patient; :hasFinding [ :of :Dyspnea ] . }
And to request patients with confirmed lack of dyspnea:
SELECT ?x WHERE { ?xa :Patient; :hasFinding [ :of :Dyspnea ; :conclusion false ] . }