From 76f54aa175f75daf8d4affeda931add4f6300555 Mon Sep 17 00:00:00 2001 From: vgemertb Date: Wed, 3 Dec 2025 15:16:55 +0100 Subject: [PATCH 1/5] Finalize RDF FHIR Observation example --- .gitignore | 1 + input/pagecontent/dynamic-data.md | 232 ++++++++++++++---------------- 2 files changed, 106 insertions(+), 127 deletions(-) diff --git a/.gitignore b/.gitignore index 0c5bd3b..25aaad9 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ fsh-generated/ input-cache/ root/ template/ +.idea/ diff --git a/input/pagecontent/dynamic-data.md b/input/pagecontent/dynamic-data.md index 18dfef3..a81d186 100644 --- a/input/pagecontent/dynamic-data.md +++ b/input/pagecontent/dynamic-data.md @@ -1,168 +1,146 @@ ### Pod Organization -Data that is stored in Solid pods is organized in containers and resources. Access can be granted to containers and resources. But in order to find data back and not to share too much information to an application, we propose an organisation structure of data in the pod as follows. The structure follows the resources definitions from [FHIR](https://www.hl7.org/fhir/resourcelist.html). +Data that is stored in Solid pods is organized in containers and resources. Access can be granted to containers and resources. But in order to find data back and not to share too much information to an application, we propose an organisation structure of data in the pod as follows. The structure follows the resources definitions from [FHIR](https://www.hl7.org/fhir/resourcelist.html). -For instance if an application is looking for a specific questionnaireResponse, the application should only be given access to the container where all questionnaireResponses are stored. +For instance if an application is looking for a specific questionnaireResponse, the application should only be given access to the container where all questionnaireResponses are stored. -To also include information about the resource in the container that is used to store resources, we propose to include the namespace of the FHIR resource as URL encoded. +To also include information about the resource in the container that is used to store resources, we propose to include +the namespace of the FHIR resource as URL encoded. All information in Welldata will be placed under the following root container of We Are: `/weare/` - ### Patient -Information about the patient that fits in the FHIR resource [patient](https://www.hl7.org/fhir/patient.html) must be stored at the following location: +Information about the patient that fits in the FHIR resource [patient](https://www.hl7.org/fhir/patient.html) must be +stored at the following location: `/weare/https%3A%2F%2Fwww.hl7.org%2Ffhir%2FPatient/.ttl` Information that will be stored in the resource: + - Gender - BirthDate - Address as a [FHIR datatype](https://build.fhir.org/datatypes.html#Address) - Language as codeable concept in communication -- Email +- Email - Tel ### Observation -Observations are stored in the pod at the following location as a [FHIR resource](https://www.hl7.org/fhir/observation.html) + +Observations are stored in the pod at the following location as +a [FHIR resource](https://www.hl7.org/fhir/observation.html) `/weare/https%3A%2F%2Fwww.hl7.org%2Ffhir%2FObservation/.ttl` -Observations can contain all measured values about a patient. In our project we cover the following observations with the according SNOMED-CT or Loinc codes: +Observations can contain all measured values about a patient. In our project we cover the following observations with +the according SNOMED-CT or Loinc codes: -| Name | Description | CODE | Intake vragenlijst | GGDM | Zipster | Selfcare | +| Name | Description | CODE | Intake vragenlijst | GGDM | Zipster | Selfcare | | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -| physical_limitation | aanwezigheid fysieke beperking | 32572006 (Snomed) | x | | x | | -| length | Lengte (cm) | 50373000 (Snomed) | x | x | | x | -| weight | Gewicht (kg) | 27113001 (Snomed) | x | x | | x | -| Waist_circumference | Buikomtrek (cm) | 276361009 (Snomed) | | x | | x | -| SBP | Systolische bloeddruk (mmHg) | 271649006 (Snomed) | | x | | x | -| cholesterol_total | Totaal cholesterol | 77068002 (Snomed) | | x | | x | -| cholesterol_hdl | HDL cholesterol | 02737005 (Snomed) | | x | | x | -| cholesterol_ratio | Totaal / HDL cholesterol | 313811003 (Snomed) | | x | | x | -| stress | Stress ervaring | 68011-6 (Loinc) | x | | x | | -| daily_life | Dagelijks leven | 91621-3 (Loinc) | x | | | x | -| social_contact | Voldoening uit sociale contacten | 61581-5 (Loinc) | x | | x | x | -| physical_exercise | beweegminuten | 228450008 (Snomed) | x | x | | x | -| smoking | roken (ja/nee) | 63638-1 (Loinc) & 77176002 (Snomed) | x | x | | | -| smoking_cigarettes | Hoeveel sigaretten per dag roken | 63640-7 (Loinc) | x | x | | | -| alcohol | Alcohol drinken | 897148007 (Snomed) | x | x | | | -| alcohol_Frequency | How often do you have a drink containing alcohol | 68518-0 (Loinc) | x | x | | | -| alcohol_normalConsumption | How many standard drinks containing alcohol do you have on a typical day? | 68519-8 (Loinc) | x | x | | | -| alcohol_excessiveConsumption | How often do you have 6 or more drinks on 1 occasion? | 68520-6 (Loinc) | x | x | | | -| birthdate | geboortedatum (dd/mm/yyyy) | 184099003 (Snomed) | x | x | x | | -| postcode | postcode | 184099003 (Snomed) | x | x | x | | -| work | werksituatie | / | x | | x | | - -More information can be found in the sharepoint excel: [Appendix 3. Alignering basis-set met parameters in project applicaties](https://vitoresearch.sharepoint.com/:x:/r/sites/21309-mydata4ourhealth2/Shared%20Documents/General/01%20Werkpakketten/WP3/A.3.1/Deliverables%2031-05-2025/Appendix%203.%20Alignering%20basis-set%20met%20parameters%20in%20project%20applicaties.xlsx?d=w12efbd9a8b924a709fa4dca1e92a1b84&csf=1&web=1&e=gslaTs) - - - - -An example of each observation can be found below: +| physical_limitation | aanwezigheid fysieke beperking | 32572006 (Snomed) | x | | x | | +| length | Lengte (cm) | 50373000 (Snomed) | x | x | | x | +| weight | Gewicht (kg) | 27113001 (Snomed) | x | x | | x | +| Waist_circumference | Buikomtrek (cm) | 276361009 (Snomed) | | x | | x | +| SBP | Systolische bloeddruk (mmHg) | 271649006 (Snomed) | | x | | x | +| cholesterol_total | Totaal cholesterol | 77068002 (Snomed) | | x | | x | +| cholesterol_hdl | HDL cholesterol | 02737005 (Snomed) | | x | | x | +| cholesterol_ratio | Totaal / HDL cholesterol | 313811003 (Snomed) | | x | | x | +| stress | Stress ervaring | 68011-6 (Loinc) | x | | x | | +| daily_life | Dagelijks leven | 91621-3 (Loinc) | x | | | x | +| social_contact | Voldoening uit sociale contacten | 61581-5 (Loinc) | x | | x | x | +| physical_exercise | beweegminuten | 228450008 (Snomed) | x | x | | x | +| smoking | roken (ja/nee) | 63638-1 (Loinc) & 77176002 (Snomed) | x | x | | | +| smoking_cigarettes | Hoeveel sigaretten per dag roken | 63640-7 (Loinc) | x | x | | | +| alcohol | Alcohol drinken | 897148007 (Snomed) | x | x | | | +| alcohol_Frequency | How often do you have a drink containing alcohol | 68518-0 (Loinc) | x | x | | | +| alcohol_normalConsumption | How many standard drinks containing alcohol do you have on a typical day? | 68519-8 (Loinc) | x | x | | | +| alcohol_excessiveConsumption | How often do you have 6 or more drinks on 1 occasion? | 68520-6 (Loinc) | x | x | | | +| birthdate | geboortedatum (dd/mm/yyyy) | 184099003 (Snomed) | x | x | x | | +| postcode | postcode | 184099003 (Snomed) | x | x | x | | +| work | werksituatie | / | x | | x | | + +More information can be found in the sharepoint +excel: [Appendix 3. Alignering basis-set met parameters in project applicaties](https://vitoresearch.sharepoint.com/:x:/r/sites/21309-mydata4ourhealth2/Shared%20Documents/General/01%20Werkpakketten/WP3/A.3.1/Deliverables%2031-05-2025/Appendix%203.%20Alignering%20basis-set%20met%20parameters%20in%20project%20applicaties.xlsx?d=w12efbd9a8b924a709fa4dca1e92a1b84&csf=1&web=1&e=gslaTs) + +An example of each type of observation can be found below: ``` +# Use your pod root below. +@base . @prefix fhir: . @prefix xsd: . - -# Cholesterol Ratio -_:obs_chol_ratio a fhir:Observation ; - fhir:code [ - fhir:system [ fhir:v "http://snomed.info/sct" ] ; - fhir:code [ fhir:v "313811003" ] ; - fhir:display [ fhir:v "Cholesterol/HDL ratio" ] - ] ; - fhir:valueQuantity [ - fhir:value [ fhir:v "4.5"^^xsd:decimal ] - ] . - -# Total Cholesterol -_:obs_chol_total a fhir:Observation ; - fhir:code [ - fhir:system [ fhir:v "http://snomed.info/sct" ] ; - fhir:code [ fhir:v "77068002" ] ; - fhir:display [ fhir:v "Total Cholesterol" ] ] ; - fhir:valueQuantity [ - fhir:value [ fhir:v "190"^^xsd:decimal ] ; - fhir:unit [ fhir:v "mg/dL" ] - ] . - -# HDL Cholesterol -_:obs_chol_hdl a fhir:Observation ; - fhir:code [ - fhir:system [ fhir:v "http://snomed.info/sct" ] ; - fhir:code [ fhir:v "102737005" ] ; - fhir:display [ fhir:v "HDL Cholesterol" ] - ] ; - fhir:valueQuantity [ - fhir:value [ fhir:v "50"^^xsd:decimal ] ; - fhir:unit [ fhir:v "mg/dL" ] - ] . - -# Length (Height) -_:obs_length a fhir:Observation ; - fhir:code [ - fhir:system [ fhir:v "http://snomed.info/sct" ] ; - fhir:code [ fhir:v "50373000" ] ; - fhir:display [ fhir:v "Body height" ] - ] ; - fhir:valueQuantity [ - fhir:value [ fhir:v "175"^^xsd:decimal ] ; - fhir:unit [ fhir:v "cm" ] - ] . - -# Weight -_:obs_weight a fhir:Observation ; - fhir:code [ - fhir:system [ fhir:v "http://snomed.info/sct" ] ; - fhir:code [ fhir:v "27113001" ] ; - fhir:display [ fhir:v "Body weight" ] - ] ; - fhir:valueQuantity [ - fhir:value [ fhir:v "70"^^xsd:decimal ] ; - fhir:unit [ fhir:v "kg" ] - ] . - -# BMI -_:obs_bmi a fhir:Observation ; - fhir:code [ - fhir:system [ fhir:v "http://snomed.info/sct" ] ; - fhir:code [ fhir:v "60621009" ] ; - fhir:display [ fhir:v "Body Mass Index (BMI)" ] + +# Mock observation with different fhir:value types. +<> a fhir:Observation ; + fhir:text [ fhir:v "Observatie - Total Cholesterol" ] ; + fhir:issued [ + a fhir:instant ; # Data type here is optional + fhir:v "2025-10-14T08:28:56.623Z"^^xsd:dateTime ] ; - fhir:valueQuantity [ - fhir:value [ fhir:v "22.9"^^xsd:decimal ] ; - fhir:unit [ fhir:v "kg/m²" ] - ] . - -# Waist Circumference -_:obs_waist a fhir:Observation ; - fhir:code [ - fhir:system [ fhir:v "http://snomed.info/sct" ] ; - fhir:code [ fhir:v "276361009" ] ; - fhir:display [ fhir:v "Waist Circumference" ] + fhir:status [ fhir:v "final"] ; # Optional, possible values: + # registered | specimen-in-process | + # preliminary | final | amended | + # corrected | appended | cancelled | + # entered-in-error | unknown | + # cannot-be-obtained + fhir:effective [ # Optional, in case we know when the measurement was made. + a fhir:dateTime ; + fhir:v "2013-04-02T10:30:10+01:00"^^xsd:dateTime ] ; - fhir:valueQuantity [ - fhir:value [ fhir:v "85"^^xsd:decimal ] ; - fhir:unit [ fhir:v "cm" ] - ] . - -# Systolic Blood Pressure (SBP) -_:obs_sbp a fhir:Observation ; fhir:code [ - fhir:system [ fhir:v "http://snomed.info/sct" ] ; - fhir:code [ fhir:v "271649006" ] ; - fhir:display [ fhir:v "Systolic blood pressure" ] + a fhir:CodeableConcept ; # Data type here is optional + fhir:coding ( [ + a fhir:Coding ; # Data type here is optional + fhir:system [ fhir:v "http://snomed.info/sct" ] ; + fhir:code [ fhir:v "77068002" ] ; + fhir:display [ fhir:v "Total Cholesterol" ] . + ] ) ] ; - fhir:valueQuantity [ - fhir:value [ fhir:v "120"^^xsd:decimal ] ; - fhir:unit [ fhir:v "mmHg" ] + fhir:category ( [ + fhir:text [ fhir:v "Vragenlijst" ] ; + fhir:coding ( [ + a fhir:Coding ; # Data type here is optional + fhir:code [ fhir:v "survey"^^xsd:string ] ; + fhir:system [ fhir:v "http://terminology.hl7.org/CodeSystem/observation-category"^^xsd:anyURI ] + ] ) + ] ) ; + fhir:subject ( [ + fhir:link ; + fhir:reference [ fhir:v "https://storage.sandbox-pod.datanutsbedrijf.be/a96561f7-3b6a-4631-9e6e-ad19f47e0f81/weare/http%3A%2F%2Fhl7.org%2Ffhir%2FPatient/2917eab8-bf6a-416d-8890-0fb0f22b15c0"^^xsd:string ] ; + fhir:type [ fhir:v "Patient"^^xsd:anyURI ] + ] ) ; + fhir:performer ( [ + fhir:link ; + fhir:reference [ fhir:v "https://storage.sandbox-pod.datanutsbedrijf.be/a96561f7-3b6a-4631-9e6e-ad19f47e0f81/weare/http%3A%2F%2Fhl7.org%2Ffhir%2FPatient/2917eab8-bf6a-416d-8890-0fb0f22b15c0"^^xsd:string ] ; + fhir:type [ fhir:v "Patient"^^xsd:anyURI ] + ] ) ; + fhir:derivedFrom ( [ + fhir:link ; + fhir:reference [ fhir:v "https://storage.sandbox-pod.datanutsbedrijf.be/a96561f7-3b6a-4631-9e6e-ad19f47e0f81/weare/http%3A%2F%2Fhl7.org%2Ffhir%2FQuestionnaireResponse/c75cc7d1-7c42-46f4-a425-e40cdaf8dae2"^^xsd:string ] ; + fhir:type [ fhir:v "QuestionnaireResponse"^^xsd:anyURI ] + ] ) ; + fhir:value [ # Cardinality 0..1. + a fhir:Quantity ; # Example Quantity value. + fhir:value [ fhir:v "190"^^xsd:decimal ] ; + fhir:unit [ fhir:v "mg/dL" ] # Example unit, unit not mandatory when code from terminology does not require it. + ] . # Value can be of different types, only one value is allowed + fhir:value [ # Cardinality 0..1. + fhir:coding ( [ # Example coding value, "A little of time" + fhir:code [ fhir:v "91621-3" ] ; + fhir:system [ fhir:v "https://loinc.org/LA14732-4"^^xsd:anyURI ] ; + fhir:display [ fhir:v "{{value}}" ] + ] ) + ] . # Value can be of different types, only one value is allowed + fhir:value [ # Cardinality 0..1. + a fhir:dateTime ; # Example dateTime value, e.g. a birthDate. + fhir:v "1990-10-05T08:28:56.623Z"^^xsd:dateTime ] . ``` ### QuestionnaireResponse -A resource of the type QuestionnaireResponse is stored as a [FHIR resource](https://www.hl7.org/fhir/questionnaireresponse.html) at the following location in the users's pod: +A resource of the type QuestionnaireResponse is stored as +a [FHIR resource](https://www.hl7.org/fhir/questionnaireresponse.html) at the following location in the users's pod: `/weare/https%3A%2F%2Fwww.hl7.org%2Ffhir%2FQuestionnaireResponse/.ttl` From 79decf1ad7ccaa5bef0a95a5a3f7534db23cc98a Mon Sep 17 00:00:00 2001 From: vgemertb Date: Wed, 3 Dec 2025 15:42:05 +0100 Subject: [PATCH 2/5] Finalize RDF FHIR Observation example --- .gitignore | 1 + input/pagecontent/dynamic-data.md | 188 +++++++++++++----------------- 2 files changed, 82 insertions(+), 107 deletions(-) diff --git a/.gitignore b/.gitignore index 0c5bd3b..25aaad9 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ fsh-generated/ input-cache/ root/ template/ +.idea/ diff --git a/input/pagecontent/dynamic-data.md b/input/pagecontent/dynamic-data.md index 18dfef3..3e81827 100644 --- a/input/pagecontent/dynamic-data.md +++ b/input/pagecontent/dynamic-data.md @@ -1,7 +1,7 @@ ### Pod Organization -Data that is stored in Solid pods is organized in containers and resources. Access can be granted to containers and resources. But in order to find data back and not to share too much information to an application, we propose an organisation structure of data in the pod as follows. The structure follows the resources definitions from [FHIR](https://www.hl7.org/fhir/resourcelist.html). +Data that is stored in Solid pods is organized in containers and resources. Access can be granted to containers and resources. But in order to find data back and not to share too much information to an application, we propose an organisation structure of data in the pod as follows. The structure follows the resources definitions from [FHIR](https://www.hl7.org/fhir/resourcelist.html). -For instance if an application is looking for a specific questionnaireResponse, the application should only be given access to the container where all questionnaireResponses are stored. +For instance if an application is looking for a specific questionnaireResponse, the application should only be given access to the container where all questionnaireResponses are stored. To also include information about the resource in the container that is used to store resources, we propose to include the namespace of the FHIR resource as URL encoded. @@ -21,7 +21,7 @@ Information that will be stored in the resource: - BirthDate - Address as a [FHIR datatype](https://build.fhir.org/datatypes.html#Address) - Language as codeable concept in communication -- Email +- Email - Tel ### Observation @@ -41,128 +41,102 @@ Observations can contain all measured values about a patient. In our project we | cholesterol_total | Totaal cholesterol | 77068002 (Snomed) | | x | | x | | cholesterol_hdl | HDL cholesterol | 02737005 (Snomed) | | x | | x | | cholesterol_ratio | Totaal / HDL cholesterol | 313811003 (Snomed) | | x | | x | -| stress | Stress ervaring | 68011-6 (Loinc) | x | | x | | -| daily_life | Dagelijks leven | 91621-3 (Loinc) | x | | | x | -| social_contact | Voldoening uit sociale contacten | 61581-5 (Loinc) | x | | x | x | -| physical_exercise | beweegminuten | 228450008 (Snomed) | x | x | | x | -| smoking | roken (ja/nee) | 63638-1 (Loinc) & 77176002 (Snomed) | x | x | | | -| smoking_cigarettes | Hoeveel sigaretten per dag roken | 63640-7 (Loinc) | x | x | | | -| alcohol | Alcohol drinken | 897148007 (Snomed) | x | x | | | -| alcohol_Frequency | How often do you have a drink containing alcohol | 68518-0 (Loinc) | x | x | | | -| alcohol_normalConsumption | How many standard drinks containing alcohol do you have on a typical day? | 68519-8 (Loinc) | x | x | | | -| alcohol_excessiveConsumption | How often do you have 6 or more drinks on 1 occasion? | 68520-6 (Loinc) | x | x | | | -| birthdate | geboortedatum (dd/mm/yyyy) | 184099003 (Snomed) | x | x | x | | -| postcode | postcode | 184099003 (Snomed) | x | x | x | | -| work | werksituatie | / | x | | x | | +| stress | Stress ervaring | 68011-6 (Loinc) | x | | x | | +| daily_life | Dagelijks leven | 91621-3 (Loinc) | x | | | x | +| social_contact | Voldoening uit sociale contacten | 61581-5 (Loinc) | x | | x | x | +| physical_exercise | beweegminuten | 228450008 (Snomed) | x | x | | x | +| smoking | roken (ja/nee) | 63638-1 (Loinc) & 77176002 (Snomed) | x | x | | | +| smoking_cigarettes | Hoeveel sigaretten per dag roken | 63640-7 (Loinc) | x | x | | | +| alcohol | Alcohol drinken | 897148007 (Snomed) | x | x | | | +| alcohol_Frequency | How often do you have a drink containing alcohol | 68518-0 (Loinc) | x | x | | | +| alcohol_normalConsumption | How many standard drinks containing alcohol do you have on a typical day? | 68519-8 (Loinc) | x | x | | | +| alcohol_excessiveConsumption | How often do you have 6 or more drinks on 1 occasion? | 68520-6 (Loinc) | x | x | | | +| birthdate | geboortedatum (dd/mm/yyyy) | 184099003 (Snomed) | x | x | x | | +| postcode | postcode | 184099003 (Snomed) | x | x | x | | +| work | werksituatie | / | x | | x | | More information can be found in the sharepoint excel: [Appendix 3. Alignering basis-set met parameters in project applicaties](https://vitoresearch.sharepoint.com/:x:/r/sites/21309-mydata4ourhealth2/Shared%20Documents/General/01%20Werkpakketten/WP3/A.3.1/Deliverables%2031-05-2025/Appendix%203.%20Alignering%20basis-set%20met%20parameters%20in%20project%20applicaties.xlsx?d=w12efbd9a8b924a709fa4dca1e92a1b84&csf=1&web=1&e=gslaTs) -An example of each observation can be found below: +Find a mock observation RDF below, it contains different types of fhir:value objects for tutorial purposes. Use only one fhir:value per observation in practice. ``` +# Use your pod root below. +@base . @prefix fhir: . @prefix xsd: . - -# Cholesterol Ratio -_:obs_chol_ratio a fhir:Observation ; - fhir:code [ - fhir:system [ fhir:v "http://snomed.info/sct" ] ; - fhir:code [ fhir:v "313811003" ] ; - fhir:display [ fhir:v "Cholesterol/HDL ratio" ] - ] ; - fhir:valueQuantity [ - fhir:value [ fhir:v "4.5"^^xsd:decimal ] - ] . - -# Total Cholesterol -_:obs_chol_total a fhir:Observation ; - fhir:code [ - fhir:system [ fhir:v "http://snomed.info/sct" ] ; - fhir:code [ fhir:v "77068002" ] ; - fhir:display [ fhir:v "Total Cholesterol" ] ] ; - fhir:valueQuantity [ - fhir:value [ fhir:v "190"^^xsd:decimal ] ; - fhir:unit [ fhir:v "mg/dL" ] - ] . - -# HDL Cholesterol -_:obs_chol_hdl a fhir:Observation ; - fhir:code [ - fhir:system [ fhir:v "http://snomed.info/sct" ] ; - fhir:code [ fhir:v "102737005" ] ; - fhir:display [ fhir:v "HDL Cholesterol" ] - ] ; - fhir:valueQuantity [ - fhir:value [ fhir:v "50"^^xsd:decimal ] ; - fhir:unit [ fhir:v "mg/dL" ] - ] . - -# Length (Height) -_:obs_length a fhir:Observation ; - fhir:code [ - fhir:system [ fhir:v "http://snomed.info/sct" ] ; - fhir:code [ fhir:v "50373000" ] ; - fhir:display [ fhir:v "Body height" ] - ] ; - fhir:valueQuantity [ - fhir:value [ fhir:v "175"^^xsd:decimal ] ; - fhir:unit [ fhir:v "cm" ] - ] . - -# Weight -_:obs_weight a fhir:Observation ; - fhir:code [ - fhir:system [ fhir:v "http://snomed.info/sct" ] ; - fhir:code [ fhir:v "27113001" ] ; - fhir:display [ fhir:v "Body weight" ] - ] ; - fhir:valueQuantity [ - fhir:value [ fhir:v "70"^^xsd:decimal ] ; - fhir:unit [ fhir:v "kg" ] - ] . - -# BMI -_:obs_bmi a fhir:Observation ; - fhir:code [ - fhir:system [ fhir:v "http://snomed.info/sct" ] ; - fhir:code [ fhir:v "60621009" ] ; - fhir:display [ fhir:v "Body Mass Index (BMI)" ] + +# Mock observation with different fhir:value types. +<> a fhir:Observation ; + fhir:text [ fhir:v "Observatie - Total Cholesterol" ] ; + fhir:issued [ + a fhir:instant ; # Data type here is optional + fhir:v "2025-10-14T08:28:56.623Z"^^xsd:dateTime ] ; - fhir:valueQuantity [ - fhir:value [ fhir:v "22.9"^^xsd:decimal ] ; - fhir:unit [ fhir:v "kg/m²" ] - ] . - -# Waist Circumference -_:obs_waist a fhir:Observation ; - fhir:code [ - fhir:system [ fhir:v "http://snomed.info/sct" ] ; - fhir:code [ fhir:v "276361009" ] ; - fhir:display [ fhir:v "Waist Circumference" ] + fhir:status [ fhir:v "final"] ; # Optional, possible values: + # registered | specimen-in-process | + # preliminary | final | amended | + # corrected | appended | cancelled | + # entered-in-error | unknown | + # cannot-be-obtained + fhir:effective [ # Optional, in case we know when the measurement was made. + a fhir:dateTime ; + fhir:v "2013-04-02T10:30:10+01:00"^^xsd:dateTime ] ; - fhir:valueQuantity [ - fhir:value [ fhir:v "85"^^xsd:decimal ] ; - fhir:unit [ fhir:v "cm" ] - ] . - -# Systolic Blood Pressure (SBP) -_:obs_sbp a fhir:Observation ; fhir:code [ - fhir:system [ fhir:v "http://snomed.info/sct" ] ; - fhir:code [ fhir:v "271649006" ] ; - fhir:display [ fhir:v "Systolic blood pressure" ] + a fhir:CodeableConcept ; # Data type here is optional + fhir:coding ( [ + a fhir:Coding ; # Data type here is optional + fhir:system [ fhir:v "http://snomed.info/sct" ] ; + fhir:code [ fhir:v "77068002" ] ; + fhir:display [ fhir:v "Total Cholesterol" ] . + ] ) ] ; - fhir:valueQuantity [ - fhir:value [ fhir:v "120"^^xsd:decimal ] ; - fhir:unit [ fhir:v "mmHg" ] + fhir:category ( [ + fhir:text [ fhir:v "Vragenlijst" ] ; + fhir:coding ( [ + a fhir:Coding ; # Data type here is optional + fhir:code [ fhir:v "survey"^^xsd:string ] ; + fhir:system [ fhir:v "http://terminology.hl7.org/CodeSystem/observation-category"^^xsd:anyURI ] + ] ) + ] ) ; + fhir:subject ( [ + fhir:link ; + fhir:reference [ fhir:v "https://storage.sandbox-pod.datanutsbedrijf.be/a96561f7-3b6a-4631-9e6e-ad19f47e0f81/weare/http%3A%2F%2Fhl7.org%2Ffhir%2FPatient/2917eab8-bf6a-416d-8890-0fb0f22b15c0"^^xsd:string ] ; + fhir:type [ fhir:v "Patient"^^xsd:anyURI ] + ] ) ; + fhir:performer ( [ + fhir:link ; + fhir:reference [ fhir:v "https://storage.sandbox-pod.datanutsbedrijf.be/a96561f7-3b6a-4631-9e6e-ad19f47e0f81/weare/http%3A%2F%2Fhl7.org%2Ffhir%2FPatient/2917eab8-bf6a-416d-8890-0fb0f22b15c0"^^xsd:string ] ; + fhir:type [ fhir:v "Patient"^^xsd:anyURI ] + ] ) ; + fhir:derivedFrom ( [ + fhir:link ; + fhir:reference [ fhir:v "https://storage.sandbox-pod.datanutsbedrijf.be/a96561f7-3b6a-4631-9e6e-ad19f47e0f81/weare/http%3A%2F%2Fhl7.org%2Ffhir%2FQuestionnaireResponse/c75cc7d1-7c42-46f4-a425-e40cdaf8dae2"^^xsd:string ] ; + fhir:type [ fhir:v "QuestionnaireResponse"^^xsd:anyURI ] + ] ) ; + fhir:value [ # Cardinality 0..1. + a fhir:Quantity ; # Example Quantity value. + fhir:value [ fhir:v "190"^^xsd:decimal ] ; + fhir:unit [ fhir:v "mg/dL" ] # Example unit, unit not mandatory when code from terminology does not require it. + ] . # Value can be of different types, only one value is allowed + fhir:value [ # Cardinality 0..1. + fhir:coding ( [ # Example coding value, "A little of time" + fhir:code [ fhir:v "91621-3" ] ; + fhir:system [ fhir:v "https://loinc.org/LA14732-4"^^xsd:anyURI ] ; + fhir:display [ fhir:v "{{value}}" ] + ] ) + ] . # Value can be of different types, only one value is allowed + fhir:value [ # Cardinality 0..1. + a fhir:dateTime ; # Example dateTime value, e.g. a birthDate. + fhir:v "1990-10-05T08:28:56.623Z"^^xsd:dateTime ] . ``` ### QuestionnaireResponse -A resource of the type QuestionnaireResponse is stored as a [FHIR resource](https://www.hl7.org/fhir/questionnaireresponse.html) at the following location in the users's pod: +A resource of the type QuestionnaireResponse is stored as a [FHIR resource](https://www.hl7.org/fhir/questionnaireresponse.html) at the following location in the users's pod: `/weare/https%3A%2F%2Fwww.hl7.org%2Ffhir%2FQuestionnaireResponse/.ttl` From a254dbdbb35117db12af9daf4987a9429d58a5e3 Mon Sep 17 00:00:00 2001 From: vgemertb Date: Wed, 3 Dec 2025 16:18:47 +0100 Subject: [PATCH 3/5] Finalize RDF FHIR Observation example --- input/pagecontent/dynamic-data.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/input/pagecontent/dynamic-data.md b/input/pagecontent/dynamic-data.md index 3e81827..5dc8ef0 100644 --- a/input/pagecontent/dynamic-data.md +++ b/input/pagecontent/dynamic-data.md @@ -126,13 +126,17 @@ Find a mock observation RDF below, it contains different types of fhir:value obj fhir:coding ( [ # Example coding value, "A little of time" fhir:code [ fhir:v "91621-3" ] ; fhir:system [ fhir:v "https://loinc.org/LA14732-4"^^xsd:anyURI ] ; - fhir:display [ fhir:v "{{value}}" ] + fhir:display [ fhir:v "A little of time" ] ] ) ] . # Value can be of different types, only one value is allowed fhir:value [ # Cardinality 0..1. a fhir:dateTime ; # Example dateTime value, e.g. a birthDate. fhir:v "1990-10-05T08:28:56.623Z"^^xsd:dateTime - ] . + ] . # Value can be of different types, only one value is allowed + fhir:value [ # Cardinality 0..1. + a fhir:string ; # Example string value. + fhir:v "Often"^^xsd:string + ] . # Value can be of different types, only one value is allowed ``` ### QuestionnaireResponse From dd78992bd74c83914de6d32cf3c2c3724d37416e Mon Sep 17 00:00:00 2001 From: Roland Groen Date: Wed, 3 Dec 2025 16:33:29 +0100 Subject: [PATCH 4/5] Extend WellDataObservation value types to include dateTime and string; update version to 0.1.2 --- CHANGELOG.md | 8 ++++++++ input/fsh/profiles/WellDataObservation.fsh | 5 ++++- sushi-config.yaml | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7e09c4..7361065 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,14 @@ All notable changes to the WellData FHIR profiles will be documented in this fil The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.1.2] - 2025-12-03 + +### Changed +- **WellDataObservation**: Extended `value[x]` to support additional data types: + - `dateTime`, `string` + - Previously only `CodeableConcept` and `Quantity` were allowed +- **Documentation**: Updated RDF example in dynamic-data.md to show all supported value types + ## [0.1.1] - 2025-11-28 ### Added diff --git a/input/fsh/profiles/WellDataObservation.fsh b/input/fsh/profiles/WellDataObservation.fsh index a0d4ab3..e3dc9dd 100644 --- a/input/fsh/profiles/WellDataObservation.fsh +++ b/input/fsh/profiles/WellDataObservation.fsh @@ -37,7 +37,7 @@ Description: "Observation used in the WellData project to record observation fro * effectiveDateTime 1..1 MS // --- Value choices ----------------------------------------------------------- -* value[x] only CodeableConcept or Quantity +* value[x] only CodeableConcept or Quantity or dateTime or string * valueCodeableConcept 0..1 MS * valueCodeableConcept.coding.system 1..1 @@ -48,6 +48,9 @@ Description: "Observation used in the WellData project to record observation fro * valueQuantity.value 1..1 * valueQuantity.unit 1..1 +* valueDateTime 0..1 MS +* valueString 0..1 MS + // --- Metadata for publication ------------------------------------------------ * ^publisher = "WellData Consortium" * ^purpose = "Captures observations related to support needs expressed as coded concepts or quantitative measurements." diff --git a/sushi-config.yaml b/sushi-config.yaml index 8689438..e15d623 100644 --- a/sushi-config.yaml +++ b/sushi-config.yaml @@ -10,7 +10,7 @@ name: welldata-implementation-guide title: WellData Implementation Guide # description: Example Implementation Guide for getting started with SUSHI status: draft # draft | active | retired | unknown -version: 0.1.1 +version: 0.1.2 fhirVersion: 4.0.1 FSHOnly: false applyExtensionMetadataToRoot: false From c894c23a18c6ee15fa9ddb8258d97002c12a8fb2 Mon Sep 17 00:00:00 2001 From: vgemertb Date: Thu, 4 Dec 2025 13:16:40 +0100 Subject: [PATCH 5/5] Finalize RDF FHIR Observation example --- input/pagecontent/dynamic-data.md | 72 +++++++++++++++++-------------- 1 file changed, 40 insertions(+), 32 deletions(-) diff --git a/input/pagecontent/dynamic-data.md b/input/pagecontent/dynamic-data.md index 5dc8ef0..1af3dfa 100644 --- a/input/pagecontent/dynamic-data.md +++ b/input/pagecontent/dynamic-data.md @@ -29,6 +29,8 @@ Observations are stored in the pod at the following location as a [FHIR resource `/weare/https%3A%2F%2Fwww.hl7.org%2Ffhir%2FObservation/.ttl` +Each observation should be stored in its individual resource with a unique uuid as shown above. + Observations can contain all measured values about a patient. In our project we cover the following observations with the according SNOMED-CT or Loinc codes: | Name | Description | CODE | Intake vragenlijst | GGDM | Zipster | Selfcare | @@ -57,18 +59,18 @@ Observations can contain all measured values about a patient. In our project we More information can be found in the sharepoint excel: [Appendix 3. Alignering basis-set met parameters in project applicaties](https://vitoresearch.sharepoint.com/:x:/r/sites/21309-mydata4ourhealth2/Shared%20Documents/General/01%20Werkpakketten/WP3/A.3.1/Deliverables%2031-05-2025/Appendix%203.%20Alignering%20basis-set%20met%20parameters%20in%20project%20applicaties.xlsx?d=w12efbd9a8b924a709fa4dca1e92a1b84&csf=1&web=1&e=gslaTs) - - - -Find a mock observation RDF below, it contains different types of fhir:value objects for tutorial purposes. Use only one fhir:value per observation in practice. +An example of an observation using a quantity type value can be find below. +Please find other kinds of observations here: [Artifacts Summary - WellData Implementation Guide v0.1.1](https://gidsopenstandaarden.github.io/welldata-implementation-guide/artifacts.html). ``` # Use your pod root below. @base . +@prefix pod-patient-folder: . +@prefix pod-questionnaire-response-folder: . @prefix fhir: . @prefix xsd: . -# Mock observation with different fhir:value types. + <> a fhir:Observation ; fhir:text [ fhir:v "Observatie - Total Cholesterol" ] ; fhir:issued [ @@ -91,7 +93,7 @@ Find a mock observation RDF below, it contains different types of fhir:value obj a fhir:Coding ; # Data type here is optional fhir:system [ fhir:v "http://snomed.info/sct" ] ; fhir:code [ fhir:v "77068002" ] ; - fhir:display [ fhir:v "Total Cholesterol" ] . + fhir:display [ fhir:v "Total Cholesterol" ] ] ) ] ; fhir:category ( [ @@ -102,41 +104,47 @@ Find a mock observation RDF below, it contains different types of fhir:value obj fhir:system [ fhir:v "http://terminology.hl7.org/CodeSystem/observation-category"^^xsd:anyURI ] ] ) ] ) ; - fhir:subject ( [ - fhir:link ; - fhir:reference [ fhir:v "https://storage.sandbox-pod.datanutsbedrijf.be/a96561f7-3b6a-4631-9e6e-ad19f47e0f81/weare/http%3A%2F%2Fhl7.org%2Ffhir%2FPatient/2917eab8-bf6a-416d-8890-0fb0f22b15c0"^^xsd:string ] ; + fhir:subject [ + fhir:link pod-patient-folder:2917eab8-bf6a-416d-8890-0fb0f22b15c0 ; + fhir:reference [ fhir:v "Patient/2917eab8-bf6a-416d-8890-0fb0f22b15c0"^^xsd:string ] ; fhir:type [ fhir:v "Patient"^^xsd:anyURI ] - ] ) ; + ] ; fhir:performer ( [ - fhir:link ; - fhir:reference [ fhir:v "https://storage.sandbox-pod.datanutsbedrijf.be/a96561f7-3b6a-4631-9e6e-ad19f47e0f81/weare/http%3A%2F%2Fhl7.org%2Ffhir%2FPatient/2917eab8-bf6a-416d-8890-0fb0f22b15c0"^^xsd:string ] ; + fhir:link pod-patient-folder:2917eab8-bf6a-416d-8890-0fb0f22b15c0 ; + fhir:reference [ fhir:v "Patient/2917eab8-bf6a-416d-8890-0fb0f22b15c0"^^xsd:string ] ; fhir:type [ fhir:v "Patient"^^xsd:anyURI ] ] ) ; fhir:derivedFrom ( [ - fhir:link ; - fhir:reference [ fhir:v "https://storage.sandbox-pod.datanutsbedrijf.be/a96561f7-3b6a-4631-9e6e-ad19f47e0f81/weare/http%3A%2F%2Fhl7.org%2Ffhir%2FQuestionnaireResponse/c75cc7d1-7c42-46f4-a425-e40cdaf8dae2"^^xsd:string ] ; + fhir:link pod-questionnaire-response-folder:c75cc7d1-7c42-46f4-a425-e40cdaf8dae2 ; + fhir:reference [ fhir:v "QuestionnaireResponse/c75cc7d1-7c42-46f4-a425-e40cdaf8dae2"^^xsd:string ] ; fhir:type [ fhir:v "QuestionnaireResponse"^^xsd:anyURI ] ] ) ; - fhir:value [ # Cardinality 0..1. - a fhir:Quantity ; # Example Quantity value. + # Example Quantity value. + fhir:value [ + a fhir:Quantity ; fhir:value [ fhir:v "190"^^xsd:decimal ] ; fhir:unit [ fhir:v "mg/dL" ] # Example unit, unit not mandatory when code from terminology does not require it. - ] . # Value can be of different types, only one value is allowed - fhir:value [ # Cardinality 0..1. - fhir:coding ( [ # Example coding value, "A little of time" - fhir:code [ fhir:v "91621-3" ] ; - fhir:system [ fhir:v "https://loinc.org/LA14732-4"^^xsd:anyURI ] ; - fhir:display [ fhir:v "A little of time" ] - ] ) - ] . # Value can be of different types, only one value is allowed - fhir:value [ # Cardinality 0..1. - a fhir:dateTime ; # Example dateTime value, e.g. a birthDate. - fhir:v "1990-10-05T08:28:56.623Z"^^xsd:dateTime - ] . # Value can be of different types, only one value is allowed - fhir:value [ # Cardinality 0..1. - a fhir:string ; # Example string value. - fhir:v "Often"^^xsd:string - ] . # Value can be of different types, only one value is allowed + ] . + # Value can be of different types, only one value is allowed + # Example coding value, "A little of time" + # fhir:value [ + # a fhir:CodeableConcept ; + # fhir:coding ( [ + # fhir:code [ fhir:v "91621-3" ] ; + # fhir:system [ fhir:v "https://loinc.org/LA14732-4"^^xsd:anyURI ] ; + # fhir:display [ fhir:v "A little of time" ] + # ] ) + # ] . # Value can be of different types, only one value is allowed + # Example dateTime value, e.g. a birthDate. + # fhir:value [ + # a fhir:dateTime ; + # fhir:v "1990-10-05T08:28:56.623Z"^^xsd:dateTime + # ] . # Value can be of different types, only one value is allowed + # Example string value. + # fhir:value [ + # a fhir:string ; + # fhir:v "Often"^^xsd:string + # ] . # Value can be of different types, only one value is allowed ``` ### QuestionnaireResponse