openehr terminology and aql
TRANSCRIPT
Dr Ian McNicoll
AQL, Terminology and Integration
Copyright 2012 Ocean Informatics
Model-driven
GUI
Model-driven
GUI
Model-driven
GUI
Model-driven tech
development
TDO
Model-driven tech
development
TDS
TDO
Model-driven tech
development
TDO Examples
How does this translate to Java code?
TDSTDS = template data schema - is an xml schema for the corresponding template
Authoring of xml documents based on this schema is possible using standard tools (XMLSpy, Oxygen, etc)
Can also be used for form programming
TDD/ Web templatesTDD = template data document - an xml document which conforms to a specific TDS
An openEHR engine can convert TDDs to canonical OpenEHR Compositions or also directly commit a TDD
Web templates are more modern JSON based equivalent
SELECT pulse FROM EHR[ehr_id/value=$ehruid] CONTAINS COMPOSITION c
CONTAINS OBSERVATION hr[openEHR-EHR-OBSERVATION.heart_rate_pulse-zn.v1]
WHERE c/name/value='Encounter‘AND c/context/start_time/value <= $endperiodAND c/context/start_time/value >= $startPeriod
AND pulse/data[at0001]/events[at0006|Anyevent]/ data[at0003]/items[at0004|Rate]/value/value < 60
AQL
Model-driven
querying
SELECT pulse FROM EHR[ehr_id/value=$ehruid] CONTAINS COMPOSITION c
CONTAINS OBSERVATION hr[openEHR-EHR-OBSERVATION.heart_rate_pulse-zn.v1]
WHERE c/name/value='Encounter‘AND c/context/start_time/value <= $endperiodAND c/context/start_time/value >= $startPeriod
AND pulse/data[at0001]/events[at0006|Anyevent]/ data[at0003]/items[at0004|Rate]/value/value < 60
AQL
Model-driven
querying
SELECT pulse FROM EHR[ehr_id/value=$ehruid] CONTAINS COMPOSITION c
CONTAINS OBSERVATION hr[openEHR-EHR-OBSERVATION.heart_rate_pulse-zn.v1]
WHERE c/name/value='Encounter‘AND c/context/start_time/value <= $endperiodAND c/context/start_time/value >= $startPeriod
AND pulse/data[at0001]/events[at0006|Anyevent]/ data[at0003]/items[at0004|Rate]/value/value < 60
AQL
Model-driven
querying
Example AQLAll Nursing reports during this admission for patient … with a clinical synopsis record…
SELECT c FROM EHR[ehr_id/value='a4a3f0c8-254a-49a5-97dd-784d50c46b78']
CONTAINS Composition c[openEHR-EHR-COMPOSITION.encounter.v1] CONTAINS Evaluation e[openEHR-EHR- EVALUATION.clinical_synopsis.v1]
WHERE c/name/value matches {'Summary report'} AND c/context/start_time >= '20110328T000000.000+0200' AND c/context/start_time < '30000101T010000.000+0100'
Vital signs chartSELECT com0/context/start_time/value as START_DATE, obs1/data[at0001]/events[at0006]/data[at0003]/items[at0004]/value/magnitude as SYSTOLIC, obs1/data[at0001]/events[at0006]/data[at0003]/items[at0005]/value/magnitude as DIASTOLIC, obs3/data[at0002]/events[at0003]/data[at0001]/items[at0004]/value/magnitude as PULSE_RATE, obs4/data[at0001]/events[at0002]/data[at0003]/items[at0004]/value/magnitude as RESPIRATORY_RATE, obs6/data[at0001]/events[at0002]/data[at0003]/items[at0006]/value as SPO2_PROPORTION, obs7/data[at0002]/events[at0003]/data[at0001]/items[at0004]/value as BODY_TEMPERATURE_QUANTITY FROM EHR e[ehr_id/value='a4a3f0c8-254a-49a5-97dd-784d50c46b78'] CONTAINS COMPOSITION com0 [openEHR-EHR-COMPOSITION.encounter.v1] CONTAINS (OBSERVATION obs7 [openEHR-EHR-OBSERVATION.body_temperature-zn.v1] OR OBSERVATION obs3 [openEHR-EHR-OBSERVATION.heart_rate-pulse-zn.v1] OR OBSERVATION obs1 [openEHR-EHR-OBSERVATION.blood_pressure-zn.v1] OR OBSERVATION obs6 [openEHR-EHR-OBSERVATION.indirect_oximetry.v1] OR OBSERVATION obs4 [openEHR-EHR-OBSERVATION.respiration.v1])
WHERE com0/name/value matches {'Vital functions', 'Respiratory assessment'} AND com0/context/start_time >= '20110328T000000.000+0200' AND com0/context/start_time >= '30000101T000000.000+0100'
Vital signs chartSELECT com0/context/start_time/value as START_DATE, obs1/data[at0001]/events[at0006]/data[at0003]/items[at0004]/value/magnitude as SYSTOLIC, obs1/data[at0001]/events[at0006]/data[at0003]/items[at0005]/value/magnitude as DIASTOLIC, obs3/data[at0002]/events[at0003]/data[at0001]/items[at0004]/value/magnitude as PULSE_RATE, obs4/data[at0001]/events[at0002]/data[at0003]/items[at0004]/value/magnitude as RESPIRATORY_RATE, obs6/data[at0001]/events[at0002]/data[at0003]/items[at0006]/value as SPO2_PROPORTION, obs7/data[at0002]/events[at0003]/data[at0001]/items[at0004]/value as BODY_TEMPERATURE_QUANTITY FROM EHR e[ehr_id/value='a4a3f0c8-254a-49a5-97dd-784d50c46b78'] CONTAINS COMPOSITION com0 [openEHR-EHR-COMPOSITION.encounter.v1] CONTAINS (OBSERVATION obs7 [openEHR-EHR-OBSERVATION.body_temperature-zn.v1] OR OBSERVATION obs3 [openEHR-EHR-OBSERVATION.heart_rate-pulse-zn.v1] OR OBSERVATION obs1 [openEHR-EHR-OBSERVATION.blood_pressure-zn.v1] OR OBSERVATION obs6 [openEHR-EHR-OBSERVATION.indirect_oximetry.v1] OR OBSERVATION obs4 [openEHR-EHR-OBSERVATION.respiration.v1])
WHERE com0/name/value matches {'Vital functions', 'Respiratory assessment'} AND com0/context/start_time >= '20110328T000000.000+0200' AND com0/context/start_time >= '30000101T000000.000+0100'
Result: openEHR data
Archetypes and terminologyEach archetype has its own internal terminology “atCodes”
may be mapped to >= 1 external terminologies
The Archetype terminology provides “names” in name/value pairs
on internal valuesets
External terminology may be ‘bound’ to provide values for coded text nodes
Terminology binding patternsDirect node-binding
e.g ‘Urine colour’ node
Node name e.g. “Urine colour”
Automatically has unique internal term ‘at0007’
Can be ‘run-time’ coded by external term
Can be ‘run-time’ mapped to an external term
Node value e.g. ‘Red, yellow, purple’
Unique term provided by Internal valueset ‘at0009’
External term mapped to term from Internal valueset
External term used as the value
External terminologiesMedications / drug allergies
ICD-10, SNOMED-CT
Lab tests/analytes
Local admin terminologies Organisation types
Sex / gender
Clinical roles
Local admin terminologies
External terminologies -TermsetsTerminologies can be very large
‘Termsets’ define a small subset of the large terminology that can be handled by a drop-down GUI or other ‘browse’ facility
Sometimes called subsets or refsets
e.g.
RUPROC::“All Orthopaedic procedures”
ICD10::“Gynaecological diagnoses”
Termset-binding guidanceGenerally at Template-level
Layered constraint approach All procedures
Orthopaedic procedures
Knee specialist procedures
But generally have to provide option to override the constraint for unusual clinical situations
e.g. Non-orthopaedic procedure carried out in Orthopaedic department.
Termset-binding guidance
NHS Common User Interface (CUI)
Layered constraint with ‘termset filters
‘Get-out clause’ where constraint is too tight
Problem/diagnosis
Problem/diagnosis
openEHR and integration
In one sense openEHR nothing special!! transforms, transforms, transforms
But -
do it once for the whole openEHR community
Share the transforms
Integration targetsDICOM
Back office use mostly but well-established
HL7 v2: devices, labs, radiology, ADT
v3: limited usage
CDA: largely limited to Level 1-2
FHIR: Hype ++ but will move the world onwards!
SMARTPlatforms Pluggable Webapp
API
HL7 FHIR Clinical Content
Exchange NHS API
‘inVivo’ Datastore API
Detailed Clinical Content Development
Clinical leadership PRSB
Terminology CentreHSCIC
Non openEHR systems
Archetype+ SNOMED Clinical Content definitions
HSPC
SMARTPlatforms APIScopes and permissions: OAuth2
Simple sign-in: OpenID Connect
Lightweight UI integration: HTML5 via Pluggable app framework
SMARTPlatforms APIScopes and permissions: OAuth2
Simple sign-in: OpenID Connect
Lightweight UI integration: HTML5 via Pluggable app framework
HL7 FHIR API
What is FHIR good at?Communication of information between systems with limited querying
Strengths
Developer friendly
Lightweight approach
Great documentation / community
Where might FHIR be weaker?Not designed for persistence
can work but will it scale?
hard-wired querying only
Resources will not work ‘out of the box’ in the real world
Need local extensions and profiles
Version control / governance of the profiles
Endeavour Health