On February 8, the Edenlab team together with HL7 International held a webinar focused on healthcare data quality. We brought together FHIR experts to dive deep into the strategies for ensuring data quality in healthcare organizations with the help of FHIR profiles.
Our panelists were:
- Andrii Krylov (LN), Executive Director at HL7 Ukraine. His solid 10+ years of experience in healthcare allows him to appreciate the impact FHIR has had on healthcare data interoperability.
- Eugene Yesakov (LN), Solution Architect and FHIR Evangelist, and Sveta Vedmed (LN), Business Analyst, are part of the development team behind Ukraine’s eHealth project with 36,5 million+ patient records and have worked on other complex high-load projects.
We want to give a huge thank you to everyone who joined us for the webinar. We were blown away by the number of questions we received from the participants during the webinar and have compiled them into a comprehensive Q&A post, which you can find below.
FHIR Implementation Questions
Can FHIR pull data from an EHR that is a clinical note as opposed to elements that live in a discrete data field?
Yes, it is possible in FHIR to exchange FHIR documents like clinical notes that combine multiple FHIR resources such as Encounter, Condition, Observation, etc.
Thank you for the excellent presentation. Please describe any data quality concerns related to the translation/transformation of health data to and from HL7 FHIR integration. Thank you!
When data is being transformed to FHIR, if it is stored on an FHIR server, it will be validated against FHIR profiles.
What do you use to evaluate FHIRPath expressions? How are the invariant expressions evaluated? Like a separate engine or the FHIR server handles it.
As a rule, we use the Kodjin FHIR Server. As demonstrated during the webinar, we can upload/update profiles on the FHIR server using an API. After we have uploaded or updated the profile, Kodjin will validate the resource using new validation rules. So it is the best way to check if FHIRPath works correctly. Other evaluators may not cover all FHIRPath rules because of the complexity of the FHIR profiles and constraints. For a comprehensive comparison between Kodjin and other FHIR servers like HAPI, refer to our detailed Kodjin vs. HAPI analysis.
Any suggestions for learning FHIR?
We recommend HL7 FHIR Fundamentals and some practice. In most cases, it’s enough to get the EHR certification. However, it depends on your current experience with healthcare standards. There are also a lot of videos on YouTube. We are currently working on our own FHIR Academy, but it’s still in the beginning stage.
Do invariants support conditions like encounter start date < end date?
Yes, all math functions are supported by FHIRPath. This current example will look like this:
```
{
"key": "custom-rule-1",
"severity": "error",
"human": "encounter start date < end date",
"expression": "period.start.toDateTime() < period.end.toDateTime()",
"source": "http://hl7.org/fhir/StructureDefinition/Encounter"
}
Why does GET /fhir/StructureDefinition not work?
Because StructureDefinition is a knowledge resource, you have to specify an ID for a particular profile, e.g., /fhir/StructureDefinition/Patient, or if you need a full specification of the FHIR server, please use /fhir/metadata.
What is another example of “slicing”? Why would you slice, and when would you need to slice?
We prefer using slicing when there are two or more different validations on the same object in an array based on the specific field in the object. For example, we have an identifier, which is an array, and based on the type of the identifier, we want to validate the value.
So, in human language, it would be: if the type is `SSN`, then the value should be 10 digits, and the type SSN is required; if the type is `Passport`, then the value should be two letters and four digits; if the value is `driver license`, then the value should be some special words, etc. You can read more about using slicing and choosing validation types in our blog.
If an EHR vendor has to start from scratch to learn and incorporate FHIR, where do they start? Are there any step-by-step guidelines?
As an HL7 Affiliate, we provide training and courses for our vendors.
Which integration tool do you recommend using for FHIR integration with any third-party tool?
If the third-party tool doesn’t use FHIR, we recommend building an FHIR facade and using the SMART-on-FHIR approach.
Can a single FHIR server be utilized for multi-tenant clients? And if yes, how would you ensure data separation?
The answer is yes. Currently, we are working on this possibility for the Kodjin FHIR Server.
Have you had good success using FHIR Bulk?
Yes, it’s implemented in the Kodjin FHIR Server. We provide some examples of how to configure FHIR Bulk on our blog.
What is the base FHIR resource for EoB?
Explanation of benefit (EoB) is a native FHIR resource. As with all FHIR resources, it’s based on the DomainResource data type. You can read the full definition of the EoB resource here and the description for the FHIR financial module here.
Could you please explain the difference between flag and cardinality from an FHIR Profile perspective?
The cardinality defines if an attribute is mandatory or optional or if it shall be omitted altogether. It serves as an instruction within a profile for an FHIR server. Flags are signs for implementers. An FHIR server doesn’t validate them. The most common flags are ?!, S, and Σ. S is the most confusing item because you can encounter an attribute with flag S: and cardinality 0..1 (optional). It means that you can save a resource without this attribute in an FHIR server, but your system still has to know how to handle this attribute even if it’s absent.
What do you recommend for analytics solutions on FHIR data?
In one of our projects where analytics were used, we used Clickhouse + Cube.js for data visualization.
Could you please explain the 0..1,1..1,0..* properties?
Cardinality validates if the element in the resource is required and how many elements should be in an array. For example, we have a cardinality of `0..1` for Patient.gender. This means that gender can be absent in the resource, but if it is present, it should be present only once, so this is an object or primitive data type.
It will look like this:
```
"gender": "female"
```
When cardinality is `1..1`, that means the element should be present in the resource. The resource will not be saved by an FHIR server, and an FHIR server will return an error for the resource without this element. This element is an object or primitive data type as well.
When cardinality is `0..*`, we understand that this is an array of objects or primitive types, and this element can be absent in the resource. Patient.generalPractitioner is such an element, and it will look like this:
```
"generalPractitioner": [
{
"reference": "Practitioner/123”
},
{
"reference": "Practitioner/456”
}
]
```
When cardinality is `1..*`, then this is an array of objects or primitive types, and this element is mandatory and should be present at least once in the resource. For example, if we set the cardinality to `2..*`, it would mean that there should be at least two elements in the array of objects.
Are resource profile examples on the HL7 website or ONLY resident on the FHIR server? In other words, do you have a link on the HL7 FHIR website that shows an example of an FHIR resource profile?
For an FHIR profile, the URL in the profile, terminology, and search parameters could be a real link to the published documentation. As a rule, that is done for FHIR-specific profiles and some national profile URLs. But that is not necessarily the case for any other custom profiles.
In regards to data quality, do you see any potential use for FHIR CQL?
We’ve explored CQL and are considering its use in the Kodjin FHIR Server.
Kodjin FHIR Server Questions
What FHIR server was used during the webinar?
Edenlab’s Kodjin FHIR Server was used.
Could you provide details on the technology stack used for your FHIR data store?
The Kodjin FHIR Server is written in Rust programming language. MongoDB is used as a transactional DB; ElasticSearch is used as a search engine. Kafka is used as an event streaming platform.
What database is used to store FHIR data; is it MongoDB since it is a document-based storage?
Yes, it is MongoDB.
Are you using terminology services, for instance, SNOMED or LOINC for coding in FHIR?
We are using all open-source terminologies. We can post/upload all ValueSets and CodeSystems that we have, and the Kodjin FHIR Server will validate resources according to this information.
Have you seen any impact on the performance of your systems when adding profiling? Does it run in real time?
The Kodjin FHIR Server was designed for high load with dynamic profiling in mind. Yes, the validations run in real time.
How do you store FHIR data? It is an SQL server?
We store it in MongoDB.
Is data validation provided by some generally available API service or is each validation rule implemented by you?
All validations in the Kodjin FHIR Server are implemented by us.
Is this validation against the StructureDefinition done “by hand” by your software or is there a library that does this automatically if you provide the StructureDefinition (i.e., HAPI FHIR, ..)?
All validations in the Kodjin FHIR Server are implemented by us.
Is it possible to query the DB directly with Mongo Query Language, or do you always need to use FHIR API? I mean, could you build the server underpinned by our MongoDB infrastructure in the cloud?
No. For the Kodjin FHIR Server, it’s impossible. Kodjin is built as a microservices solution on an infrastructure-as-a-code platform and should be operated in the Kubernetes cluster. But it can roll out in the cloud or on-premise. Access is only possible through the FHIR API.
If you had to compare Kodjin with the competition, what would you mention about your strong points in comparison to other known solutions?
Performance and configurability. From a performance perspective, Kodjin was designed and developed to handle high loads. Configurability means that the profile StructureDefinitions are configurable in Kodjin, as well as custom SearchParameters and extensions. Based on these configurable artifacts, Kodjin validates the incoming resources, dynamically builds the CapabilityStatement, etc.
Do you support database sharding for horizontal scaling?
Yes, we do support sharding.
Is the data stored in the FHIR system only used for analytics or also used as the OLTP or real transactional system?
It is used as transactional data and is stored in MongoDB.
How do you handle versioning at the profile level?
Each profile has a version. When we mention a profile in the resource and do not specify the version, the Kodjin FHIR Server will retrieve the latest one. We can also specify the version, and then the Kodjin FHIR server will get exactly the specified version or will return an error if there is no such version.
National Ukrainian Health System (eHealth) Questions
Is your government FHIR solution open source?
Yes, it is open source.
Are you using FHIR for the collection of patient-reported outcomes?
No, only clinicians register health data in the National eHealth System. Patients have access to this data.
What is the difference between patient records and EMR records? Patient records are 52 million, and EMR records are 532 million. So do EMR records consist of the encounter and episode records, like inpatient and outpatient records combined together?
We’d like to clarify. We have 36,5 million patients in the national system. And we have 3 billion+ records that contain episodes, encounters (inpatient and outpatient), service requests, observations, diagnostic reports, etc. One object, one record.
Do you think FHIR will completely replace Clinical Document Architecture (CDA)? Is CDA used in Ukraine a lot? What do you think?
We don’t use CDA in Ukraine, and we’ve never used it before. Thanks to our late start in digitization, we started from FHIR. We use the operation $document for FHIR resource composition and FHIR profiles to validate different clinical rules for FHIR resources, and these cases could replace CDA.
Is your project referencing ISO 21089 (embedded in FHIR) and its Records Lifecycle Events construct to define and manage data quality attributes?
Usually, FHIR servers use security layers and business layers (or some kind of proxies) that implement the requirements of ISO 21089. On the other hand, the FHIR server provides tools to use the instructions from ISO 21089, such as versioning, hard and soft delete, provenance resources, and audit events. The same approach is used in our national project.
Are all the clinicians across Ukraine accessing the same FHIR server technology? Is all patient data part of one clinical database?
Clinicians work with EHRs. We have ~30 different vendors. Each EHR provides a mandatory functionality (required and certified by governmental institutions) and can provide its own extended functionality. Some solutions aren’t connected to the centralized FHIR storage. So, these solutions still could work but, for payment, reimbursement, and coverage of the medical episode (case) by the government, it has to be reported by one of the systems connected to the eHealth system.
Would it be helpful to have personal data carried by the client, especially for refugees, as we see in the Netherlands?
Yes, perhaps we will connect to the International Patient Summary project in the future. Thank you for prioritizing this problem.
Do you have a national patient identifier in Ukraine?
We’ve created a Master Patient Index and assigned a national patient identifier.
How much historical/legacy patient data did you migrate into the new eHealth system?
We started from scratch. That is the reason why we started with an agreement between patients and general practitioners in primary care. It was a mandatory step for our citizens to choose GP to obtain free-of-charge healthcare services.
I heard you used Kafka; probably, that was the technology component for supporting 1,000 messages per sec. Please confirm.
Correct, we used Kafka in the National Ukrainian eHealth System as an event streaming platform.
Not sure if this is the right question for this forum or not, however, I would like to understand more about how you ensured that your solution is capable of handling 1,000 messages per second. Thanks!
We regularly run performance tests on the National eHealth System and optimize it according to our findings.
General Healthcare and Miscellaneous Questions
I greatly appreciate the first slides about Ukranian people/culture. I work with several engineers from the country and have always found that they are driven, trustworthy, and deliver high-quality products.
Thank you so much for your support and feedback. We highly appreciate your confidence.
Are you collaborating with Israel?
No, not yet.
Have you explored any cohort/population-level summary statistics?
Yes, one of our projects is around cohort/population-level data.
Can you speak to any blockchain use?
Yes, we used blockchain for our eHealth project.
Is Edenlab assisting hospitals and clinics in implementing/maintaining FHIR standards and stuff, or do you develop your own applications that consume data from FHIR servers, such as SMART-on-FHIR apps?
We do both: FHIR implementation plus the development of necessary additional modules (claims, analytics modules), and we have our own FHIR solutions. We developed the Kodjin FHIR Server for enterprise projects (event-driven, high-performance), and we continue working on other products as part of our Kodjin Interoperability Suite.
Do you have clinicians ensuring the mapping to FHIR data elements is semantically accurate?
We have experience in FHIR mapping for different companies, but the expertise of the client and the clinicians working on their side is decisive. As a rule, on projects, it is joint work, taking into account the client’s individual needs as well.
What is the extension that you are using on your VScode to see the FHIR profile and spec side by side?
It’s a Kodjin FHIR Profiler tool developed by our team. You can download its VSCode plugin. It’s available as a browser-based web editor as well.
I imagine that Edenlab’s clients are mainly hospitals and clinics that are now implementing FHIR or already have FHIR and need maintenance?
Both variants work. We have FHIR implementations for some local tasks, e.g., institutions performing clinical trials. Also, some EHR vendors use FHIR for the EHR engine (storage). We are currently maintaining and further extending the functionality of the eHealth project.
Conclusion
We hope the information shared in this Q&A and during our webinar will be useful in your efforts to improve data quality in your organizations. Thank you again for your participation in the event. We look forward to organizing future events and growing the FHIR community!
Have more questions about FHIR implementation or our healthcare projects? Add your questions at the Q&A registration form, and we will answer them during our live session. If you’re also interested in learning more about our products, the Kodjin FHIR Server is available for a free demo. We are always glad to share our expertise.