HCLS/ClinicalObservationsInteroperability/CTCriterialRules.html
Appearance
Using N3 Rules to Express CT Inclusion/Exclusion Criteria
CT #8 Inclusion Criteria
- monotherapy with metformin, insulin secretagogue, or alpha-glucosidase inhibitors,
- or a low-dose combination of these at ≤ 50% maximal dose
- Dosing is stable for 8 weeks
Mock Patient Data
#test case 1: two prescriptions, but only one candiate medication, one prescription,
#this patient is a candidate, stable dose > 8 weeks
:med0001 a :Metformin;
:subject :P0001;
:dosePerAdministration [ :hasValue "2000";
:hasUnit "mg"];
:startDateTime "2008-01-01T00:00:00"^^xsd:dateTime;
:endDateTime "2009-01-01T00:00:00"^^xsd:dateTime.
:med00011 a :someOtherMedication;
:subject :P0001;
:dosePerAdministration [ :hasValue "2000";
:hasUnit "mg"];
:startDateTime "2008-01-01T00:00:00"^^xsd:dateTime;
:endDateTime "2009-01-01T00:00:00"^^xsd:dateTime.
#test case 2: one medication, multiple prescriptions
#this patient is not a candidate, due to the change of dose recently (May 2, 2008)
:med0002 a :Metformin;
:subject :P0002;
:dosePerAdministration [ :hasValue "500";
:hasUnit "mg"];
:startDateTime "2007-01-01T00:00:00"^^xsd:dateTime;
:endDateTime "2007-05-01T00:00:00"^^xsd:dateTime.
:med0003 a :Metformin;
:subject :P0002;
:dosePerAdministration [ :hasValue "1000";
:hasUnit "mg"];
:startDateTime "2007-05-02T00:00:00"^^xsd:dateTime;
:endDateTime "2008-05-01T00:00:00"^^xsd:dateTime.
:med0004 a :Metformin;
:subject :P0002;
:dosePerAdministration [ :hasValue "2000";
:hasUnit "mg"];
:startDateTime "2008-05-02T00:00:00"^^xsd:dateTime;
:endDateTime "2009-01-01T00:00:00"^^xsd:dateTime.
#test case 3: multiple medication, multiple prescriptions
#this patient is a candidate, stable dose, and dose < 50% max dose
:med0005 a :Gliclazide;
:subject :P0003;
:dosePerAdministration [ :hasValue "60";
:hasUnit "mg"];
:startDateTime "2008-01-01T00:00:00"^^xsd:dateTime;
:endDateTime "2009-01-01T00:00:00"^^xsd:dateTime.
:med0006 a :Metformin;
:subject :P0003;
:dosePerAdministration [ :hasValue "500";
:hasUnit "mg"];
:startDateTime "2007-01-01T00:00:00"^^xsd:dateTime;
:endDateTime "2009-01-01T00:00:00"^^xsd:dateTime.
#test case 4: multiple medication, multiple prescriptions
#this patient is not a candidate, due to large dose for a combination of medication
:med0007 a :Gliclazide;
:subject :P0004;
:dosePerAdministration [ :hasValue "100";
:hasUnit "mg"];
:startDateTime "2008-01-01T00:00:00"^^xsd:dateTime;
:endDateTime "2009-01-01T00:00:00"^^xsd:dateTime;.
:med0008 a :Metformin;
:subject :P0004;
:dosePerAdministration [ :hasValue "500";
:hasUnit "mg"];
:startDateTime "2007-01-01T00:00:00"^^xsd:dateTime;
:endDateTime "2009-01-01T00:00:00"^^xsd:dateTime.
#test case 5: one medication, multiple prescriptions
#this patient is not a candidate, his is no longer taking one of the candidate medication
:med0009 a :Metformin;
:subject :P0005;
:dosePerAdministration [ :hasValue "500";
:hasUnit "mg"];
:startDateTime "2007-01-01T00:00:00"^^xsd:dateTime;
:endDateTime "2007-05-01T00:00:00"^^xsd:dateTime.
:med0010 a :Metformin;
:subject :P0005;
:dosePerAdministration [ :hasValue "1000";
:hasUnit "mg"];
:startDateTime "2007-05-02T00:00:00"^^xsd:dateTime;
:endDateTime "2008-05-01T00:00:00"^^xsd:dateTime.
'''#test case 6: one medication, multiple prescriptions, stable dose in the past '''
#this patient is a candidate
:med0011 a :Metformin;
:subject :P0006;
:dosePerAdministration [ :hasValue "500";
:hasUnit "mg"];
:startDateTime "2007-01-01T00:00:00"^^xsd:dateTime;
:endDateTime "2008-01-01T00:00:00"^^xsd:dateTime.
:med0012 a :Metformin;
:subject :P0006;
:dosePerAdministration [ :hasValue "500";
:hasUnit "mg"];
:startDateTime "2008-01-02T00:00:00"^^xsd:dateTime;
:endDateTime "2008-06-01T00:00:00"^^xsd:dateTime.
Drug Information
###################################################################
# monotherapy with metformin, insulin secretagogue,
# or alpha-glucosidase inhibitors,
# or a low-dose combination of these at <= 50% maximal dose
#
# since each medicine has its own maximum dose and it is a general knowledge,
# we state the max dose of each medicine seperately from the selection (query rules)
# The following statement can be moved to STDM ontology
###################################################################
:Metformin a owl:Class;
:maxDose [ :hasValue "2000";
:hasUnit "mg"].
:Repaglinide a owl:Class;
owl:subClassOf :InsulinSecertagogue;
:maxDose
[ :hasValue "4";
:hasUnit "mg"].
:Gliclazide a owl:Class;
owl:subClassOf :InsulinSecertagogue;
:maxDose
[ :hasValue "120";
:hasUnit "mg"].
:Glipizide a owl:Class;
owl:subClassOf :InsulinSecertagogue;
:maxDose
[ :hasValue "10";
:hasUnit "mg"].
:Acarbose a owl:Class;
owl:subClassOf :AlphaGlucosidaseInhibitor;
:maxDose
[ :hasValue "100";
:hasUnit "mg"].
:Miglitol a owl:Class;
owl:subClassOf :AlphaGlucosidaseInhibitor;
:maxDose
[ :hasValue "100";
:hasUnit "mg"].
CT Criteria Rules
Here we have to use "close" our world when searching for all prescriptions of a patient. We use a built-in called "e:findall".
#assume now is "2008-05-22T00:00:00"
:CTcheckTime :hasDate "2008-05-22T00:00:00"^^xsd:dateTime.
:CandidateMedicine owl:unionOf (:AlphaGlucosidaseInhibitor :InsulinSecertagogue :Metformin).
{:CandidateMedicine owl:unionOf ?L. ?B :inSomeOf ?L} => {?B a :CandidatePrescription}.
# assume all knowledge about the patient are contained in this one knowledgebase - scoped closure
#step 1: check if patient is taking the candidate medicine and one of his prescription has a end date later than CTcheckTime (?NOW)
{
:CTcheckTime :hasDate ?NOW.
?X :subject ?P;
a :CandidatePrescription;
:startDateTime ?sDate;
:endDateTime ?eDate.
(?eDate ?NOW) math:difference ?E.
?E math:greaterThan "P1D"^^xsd:duration.
}
=>
{?P a :possibleCandidate}.
#step 2:If a patient has multiple prescription of a medicine, check if the dose is stable for at least 8 weeks
#step 2.1 find all prescriptions of each kind of candidate medication and dose is stable for at least 8 weeks
{
:CandidateMedicine owl:unionOf ?L.
?P a :possibleCandidate.
?X_m :subject ?P;
a ?B.
?B list:in ?L.
(?SCOPE 1) e:findall (?X
{?X :subject ?P;
a ?B;
:dosePerAdministration ?ADose;
:startDateTime ?sDate;
:endDateTime ?eDate.
?ADose :hasValue ?DoseValue.
} ?MedicationList).
#find the stable dose
}
=>
{(?P ?B) :hasPrescriptionList ?MedicationList.
?MedicationList a rdf:List}.
#step 2.2 if a patient has only one type of candidate medication, check if the dose is stable for at least 8 weeks
#case 1: one prescription
{ :CTcheckTime :hasDate ?NOW.
(?P ?B) :hasPrescriptionList ?MedicationList.
?MedicationList math:memberCount ?Count.
?MedicationList rdf:first ?I.
?I :startDateTime ?S;
:endDateTime ?E.
(?NOW ?S) math:difference ?T.
?T math:greaterThan "P2M"^^xsd:duration.
(?E ?NOW) math:difference ?T1.
?T1 math:greaterThan "P1D"^^xsd:duration.
}
=>
{?P a :CTCandidate}.
Supporting Rules (generic rdf and owl semantics)
{?A owl:subClassOf ?B. ?x a ?A} => {?x a ?B}.
rdf:first a rdf:Property; rdfs:domain rdf:List.
rdf:rest a rdf:Property; rdfs:domain rdf:List; rdfs:range rdf:List.
rdfs:subClassOf a rdf:Property; rdfs:domain rdfs:Class; rdfs:range rdfs:Class; a owl:TransitiveProperty.
rdfs:subPropertyOf a rdf:Property; rdfs:domain rdf:Property; rdfs:range rdf:Property; a owl:TransitiveProperty.
owl:equivalentClass a rdf:Property; rdfs:domain rdfs:Class; rdfs:range rdfs:Class; rdfs:subPropertyOf rdfs:subClassOf; a owl:SymmetricProperty.
owl:equivalentProperty a rdf:Property; rdfs:domain rdf:Property; rdfs:range rdf:Property; rdfs:subPropertyOf rdfs:subPropertyOf; a owl:SymmetricProperty.
owl:sameAs a rdf:Property; a owl:SymmetricProperty, owl:TransitiveProperty.
owl:inverseOf a rdf:Property; rdfs:domain owl:ObjectProperty; rdfs:range owl:ObjectProperty; a owl:SymmetricProperty.
owl:differentFrom a rdf:Property; a owl:SymmetricProperty.
owl:distinctMembers a rdf:Property; rdfs:domain owl:AllDifferent; rdfs:range rdf:List.
owl:oneOf a rdf:Property; rdfs:domain rdfs:Class; rdfs:range rdf:List.
owl:intersectionOf a rdf:Property; rdfs:domain rdfs:Class; rdfs:range rdf:List.
owl:unionOf a rdf:Property; rdfs:domain rdfs:Class; rdfs:range rdf:List.
owl:complementOf a rdf:Property; rdfs:domain rdfs:Class; rdfs:range rdfs:Class.
{?S ?P ?O} => {?P a rdf:Property}.
{?P rdfs:domain ?C. ?S ?P ?O} => {?S a ?C}.
{?P rdfs:range ?C. ?S ?P ?O} => {?O a ?C}.
{?A rdfs:subClassOf ?B. ?S a ?A} => {?S a ?B}.
{?P rdfs:subPropertyOf ?R. ?S ?P ?O} => {?S ?R ?O}.
#{?X owl:sameAs ?Y. ?P a rdf:Property. ?X ?P ?O} => {?Y ?P ?O}.
#{?X owl:sameAs ?Y. ?S ?X ?O} => {?S ?Y ?O}.
#{?X owl:sameAs ?Y. ?P a rdf:Property. ?S ?P ?X} => {?S ?P ?Y}.
{?P owl:inverseOf ?Q. ?S ?P ?O} => {?O ?Q ?S}.
{?P a owl:SymmetricProperty. ?S ?P ?O} => {?O ?P ?S}.
{?P a owl:TransitiveProperty. ?X ?P ?O. ?S ?P ?X} => {?S ?P ?O}.
#{?P a owl:FunctionalProperty. ?S ?P ?X. ?S ?P ?Y} => {?X owl:sameAs ?Y}.
{?P a owl:InverseFunctionalProperty. ?X ?P ?O. ?Y ?P ?O} => {?X owl:sameAs ?Y}.
{?A owl:distinctMembers ?D. ?D rdf:rest ?R} => {?A owl:distinctMembers ?R}.
{?A owl:distinctMembers ?D. ?L :subListOf ?D. ?L rdf:first ?X; rdf:rest ?R. ?Y list:in ?R} => {?X owl:differentFrom ?Y}.
{?C owl:oneOf ?L. ?X list:in ?L} => {?X a ?C}.
{?C owl:intersectionOf ?L. ?X :inAllOf ?L} => {?X a ?C}.
{?A owl:unionOf ?L} => {?L a rdf:List}.
{?C owl:unionOf ?L. ?X :inSomeOf ?L} => {?X a ?C}.
{?L rdf:rest ?R} => {?R a rdf:List}.
{?L rdf:first ?I; a rdf:List} => {?I list:in ?L}.
{?L rdf:rest ?R; a rdf:List. ?I list:in ?R} => {?I list:in ?L}.
{?L a rdf:List} => {?L :subListOf ?L}.
{?L rdf:rest ?R; a rdf:List. ?X :subListOf ?R} => {?X :subListOf ?L}.
{?L rdf:first ?A; a rdf:List. ?X a ?A. ?L rdf:rest rdf:nil} => {?X :inAllOf ?L}.
{?L rdf:first ?A; a rdf:List. ?X a ?A. ?L rdf:rest ?R. ?X :inAllOf ?R} => {?X :inAllOf ?L}.
{?L rdf:first ?A; a rdf:List. ?X a ?A} => {?X :inSomeOf ?L}.
{?L rdf:rest ?R; a rdf:List. ?X :inSomeOf ?R} => {?X :inSomeOf ?L}.
Query
{?B :hasPrescriptionList ?MedicationList} => {?B :hasPrescriptionList ?MedicationList}.
{?P a :CTCandidate} => {?P a :CTCandidate}.
Results
The following is the preliminary results. We have not checked dose < 50% max dose when using a combination of drugs.
(:P0003 :InsulinSecertagogue) :hasPrescriptionList (:med0005). (:P0003 :Metformin) :hasPrescriptionList (:med0006). (:P0004 :InsulinSecertagogue) :hasPrescriptionList (:med0007). (:P0004 :Metformin) :hasPrescriptionList (:med0008). (:P0001 :Metformin) :hasPrescriptionList (:med0001). (:P0002 :Metformin) :hasPrescriptionList (:med0002 :med0003 :med0004). (:P0006 :Metformin) :hasPrescriptionList (:med0011 :med0012). :P0003 a :CTCandidate. :P0004 a :CTCandidate. :P0001 a :CTCandidate.