HCLS/ClinicalObservationsInteroperability/ContradictionRule
Detecting Contradiction in Eligibility Criteria Using Rules and Proofs
When expressing and encoding eligibility criteria for a clinical trial, contradiction and unsatisfiable conditions can be entered into the system. The following is a simple example
- male patient underwent hysterectomy
A reasoning engine can detect such contradiction using the following rules
#contradiction 1: hysterectomy can not be performed on male :Hysterectomy :hasRestriction [ :hasGender :Male]. { ?P :hasProcedure ?O. :hasGender ?G; ?O :hasRestriction ?A. ?A :hasGender ?G. } => {?P :contraIndication ?O}.
Given a set of triples (facts) about patient Peter, for example
#patient information :peter :hasGender :Male; :hasProcedure :Hysterectomy. :jane :hasGender :Female; :hasProcedure :Hysterectomy.
Asking all facts that have "contradictions", we will get
:peter :contraIndication :Hysterectomy.
The proof of this conclusion is generated
[ a r:Proof, r:Conjunction; r:component [ a r:Inference; r:gives {<http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_peter> <http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_contraIndication> <http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_Hysterectomy>}; r:evidence ( [ a r:Inference; r:gives {<http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_peter> <http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_contraIndication> <http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_Hysterectomy>}; r:evidence ( [ a r:Extraction; r:gives {<http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_peter> <http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_hasProcedure> <http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_Hysterectomy>}; r:because [ a r:Parsing; r:source <.\coi\CTRule.n3>]] [ a r:Extraction; r:gives {<http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_peter> <http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_hasGender> <http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_Male>}; r:because [ a r:Parsing; r:source <.\coi\CTRule.n3>]] [ a r:Extraction; r:gives {@forSome var:e1. <http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_Hysterectomy> <http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_hasRestriction> var:e1}; r:because [ a r:Parsing; r:source <.\coi\CTRule.n3>]] [ a r:Extraction; r:gives {@forSome var:e1. var:e1 <http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_hasGender> <http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_Male>}; r:because [ a r:Parsing; r:source <.\coi\CTRule.n3>]]); r:binding [ r:variable [ n3:uri "http://localhost/var#x0"]; r:boundTo [ n3:uri "http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_peter"]]; r:binding [ r:variable [ n3:uri "http://localhost/var#x1"]; r:boundTo [ n3:uri "http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_Hysterectomy"]]; r:binding [ r:variable [ n3:uri "http://localhost/var#x2"]; r:boundTo [ n3:uri "http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_Male"]]; r:binding [ r:variable [ n3:uri "http://localhost/var#x3"]; r:boundTo [ a r:Existential; n3:nodeId "http://localhost/var#e1"]]; r:rule [ a r:Extraction; r:gives {@forAll var:x0, var:x1, var:x2, var:x3. {var:x0 <http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_hasProcedure> var:x1. var:x0 <http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_hasGender> var:x2. var:x1 <http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_hasRestriction> var:x3. var:x3 <http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_hasGender> var:x2} => {var:x0 <http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_contraIndication> var:x1}}; r:because [ a r:Parsing; r:source <.ciCTRule.n3>]]]); r:binding [ r:variable [ n3:uri "http://localhost/var#x0"]; r:boundTo [ n3:uri "http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_peter"]]; r:binding [ r:variable [ n3:uri "http://localhost/var#x1"]; r:boundTo [ n3:uri "http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_Hysterectomy"]]; r:rule [ a r:Extraction; r:gives {@forAll var:x0, var:x1. {var:x0 <http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_contraIndication> var:x1} => {var:x0 <http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_contraIndication> var:x1}}; r:because [ a r:Parsing; r:source <.ciCTRuleQ.n3>]]]; r:gives { <http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_peter> <http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_contraIndication> <http://www.w3.org/2008/04/DiabeticPatientsDataSet/ClinicalPracticeOntology-Version3.owl#_Hysterectomy>. }].
This proof can be translated to PML and then use PML-tools to visualize the proofs, see example
More Generic and Elegant Expression of Contradiction in Logic Model
The same contradiction example can be expressed explicitly as a false model
{ ?A ?B :Hysterectomy. ?A ?D :Male. } => false.
This is telling the reasoner that :Hysterectomy and :Male can not coexist (disjoint). In this case you do not need to declare :ContraIndication specifically which simplifies the rule writing (of course you do lose some information: you do not know the "why" carried e.g. by the concept :Contraindication). In this way, we can write a set of nicely formed and easy-to-read rules that can be applied to any numbers of eligibility criteria, across different trials.
The proof looks like this
[ e:falseModel true ; e:because [ e:integrityConstraint {{:peter :hasProcedure :Hysterectomy. :peter :hasGender :Male} => false} ; e:selected [ e:triple {:peter :hasProcedure :Hysterectomy} ; e:falseAncestors true ; e:falseDescendents true ; e:assertedAncestors [ e:triples true ; e:selected [ e:ancestor true ; e:inferredDescendents true ] ] ] ; e:selected [ e:triple {:peter :hasGender :Male} ; e:falseAncestors true ; e:falseDescendents true ; e:assertedAncestors [ e:triples true ; e:selected [ e:ancestor true ; e:inferredDescendents true ] ] ] ]