Difference between revisions of "Vol-2644/paper35"

From BITPlan ceur-ws Wiki
Jump to navigation Jump to search
Line 11: Line 11:
 
|authors=Gerhard Kober,Adrian Paschke
 
|authors=Gerhard Kober,Adrian Paschke
 
}}
 
}}
=Freitext=
+
 
 
==Using PROVA-Rule Engine as Dispatching-Service for FHIR-Observation-Resources==
 
==Using PROVA-Rule Engine as Dispatching-Service for FHIR-Observation-Resources==
 
<pdf width="1500px">https://ceur-ws.org/Vol-2644/paper35.pdf</pdf>
 
<pdf width="1500px">https://ceur-ws.org/Vol-2644/paper35.pdf</pdf>

Revision as of 13:23, 30 March 2023

Paper

Paper
edit
description  
id  Vol-2644/paper35
wikidataid  Q117337882→Q117337882
title  Using PROVA-Rule Engine as Dispatching-Service for FHIR-Observation-Resources
pdfUrl  https://ceur-ws.org/Vol-2644/paper35.pdf
dblpUrl  https://dblp.org/rec/conf/ruleml/KoberP20
volume  Vol-2644→Vol-2644
session  →


Using PROVA-Rule Engine as Dispatching-Service for FHIR-Observation-Resources

load PDF

                 Using PROVA-Rule Engine as
                    Dispatching-Service for
                 FHIR-Observation-Resources

                       Gerhard Kober1 and Adrian Paschke2
                       1
                        Tiani ”Spirit” GmbH, Vienna, Austria
                      gerhard[DT]kober[AT]tiani-spirit.com
         2
           Fraunhofer FOKUS and Freie Universitaet Berlin, Berlin, Germany
                   adrian[DT]paschke[AT]fokus.fraunhofer.de



        Abstract. In a clinical medical environment, vital signs of patients are
        crucial information. In order to have the right information at the right
        time available, they need to be evaluated during the storage-process and
        then be submitted to special store-containers or to alerting-servers. To
        achieve the goal of observation-information-based dispatching, a rule en-
        gine is used to be highly flexible in the evaluation of health parameters
        and limits. The assumption is that such a declarative rule-based ser-
        vice is easier to maintain, and can also work in a distributed way. The
        distribution of the rule-engine is in the setting of a clinic-group (where
        many hospitals work together) fundamental to allow each hospital to
        work independently of the others.

        Keywords: FHIR · PROVA · Rules


1     Introduction

In a clinical-medical environment, vital signs from patients are important for
diagnoses and the upcoming therapy [5]. Usually, medical doctors are interested
in two main things by evaluating the vital signs in clinical routine: first, if the
vital signs are consistent over a timeline, and secondly, if there are outliers in
medical values [13].
    So the issue is to detect ’abnormal’ values and decide dynamically where to
store patient’s data, to have it available for the physician (besides the as ’normal’
defined vital-sings), who then needs to set actions for the patient.
    This paper analyzes the use of a rule-engine to fulfill the needs of a future
’distributed medical rule-engine’. Furthermore, the values of the medical data,
which exist in the form of FHIR-resources (Fast Healthcare Interoperability Re-
sources) needs to be extracted, and the decisions need to be taken during the
storage-process.

    Copyright c 2020 for this paper by its authors. Use permitted under Creative Com-
    mons License Attribution 4.0 International (CC BY 4.0).
�    The goal of this work is to set up a system architecture and a workflow that
allows us to receive FHIR-Observation-resources, which are meant for storage,
extract the needed values of a particular type of information and decide on the
retrieved information which storage-endpoint to use.
    A use-case for this can be found for people who have diabetes, where the
blood glucose level is highly relevant. So if the level falls under a certain level,
a doctor (or another medical person) should get notified to help this person.
Another feature is to have these occurrences for later medical analysis of these
non-normal medicinal values.
    A solution for the problem is needed to improve patient care, because of clear,
relevant information and gathering information for answering medical-clinical
research questions, based on vital signs.

FHIR (Fast Healthcare Interoperability Resources) is a standard created by HL7
(Health Level 7) [9]. FHIR defines resources, and they are defined by six layers
to strap down the big healthcare domain [8]. These layers are:
 1. Foundation Resources
 2. Base Resources
 3. Clinical Resources
 4. Financial Resources
 5. Specialized Resources
 6. Resource Contextualization.
In this work, the clinical resources from layer three are used. To be more precise,
the observation-resource is the target-resource. For the support of diagnosis or
patient monitoring, the observations-resource is a central element in healthcare
[6]. For the FHIR-Observation, it is mandatory to have the following items in
the object, which will then be sent to the FHIR-Store: the status and the code.
The ’Observations-status’ describes the status of result value and is used to track
the individual results. The observation-status is coded and can just take defined
values. The code describes the observed entity to understand the meaning of
the observation. [7]. Also, the value of the actual observation is useful (but not
mandatory by definition). Other items in the observation can be included, but
do not need to be. For the solution of the problem, the code and the observation-
value are important during processing to decide if the value is relevant for making
decisions, and if so, in which way to use it.

As a rule engine for this dispatching-case PROVA [12] will be used. It supports
the usage of event-driven reaction rules. Since there is a need in the overall pro-
cess for high flexibility and the ability of the solution to express event-patterns
and reactions, the complex event processing-lifecycle supported by Prova is help-
ful. Related to [4][2] the CEP (complex event processing)-lifecycle contains:
 – Event Production
 – Event Definition
 – Event Selection
� – Event Aggregation
 – Event Handling
 – Event Consumption.
These events will be processed during the actual execution. Prova provides the
ability to use a declarative programming paradigm in conjunction with an object-
oriented programming paradigm. There is a separation on the program-logic (the
declarative part), the data-access, and optional external procedural computa-
tions [1].
    Other possible approaches besides the rule-based to be thought of are more
restrictive and less flexible. For a very special use-case, a solution could be im-
plemented ’hardcoded’ by doing all the needed calculations and comparisons in
the code. Still, if someone likes to change comparison-values or change the use-
case, it takes a lot of changes in the program logic. Furthermore, if a second
or a third factor for a decision needs to be taken into account, the ’hardcoded’
solution will become complicated and hard to maintain. Therefore this is not
the preferred solution. When taking into account that not only FHIR-resources
or data structures defined in the medical domain are relevant for making deci-
sions, a more generic solution is needed. It has to be based on standards and to
be generic and flexible to build different options for needed decision points. For
example, there is HL7-Arden-Syntax, which is used for representing procedural
clinical knowledge in order to share health knowledge bases [3]. These knowledge
bases are encoded in the Arden Syntax, which is specialized for the needs of the
language of so-called MLMs (Medical Logic Module). So the Arden-Syntax has
a strong focus on medical information sharing and is useful for clinical processes.
Going beyond the clinics and using FHIR, the Arden Syntax has no capabilities
for obtaining clinical-medical decision support.

2   System design
The following section describes the planned system architecture, as well as the
workflow.

                                        Systemarchitecture
                                                                External FHIR-Servers
                                                               (e.g. Storage endpoint, or other DMRE)
                   FHIR-Client

                                                                External FHIR-Servers

                DMRE

                                        DMRE FHIR Service
                                                                     Knowledgebase
                Restful FHIR-Server         Prova-Receiver
                                             Prova-Sender                    Extractor
                                              FHIR-Client                   Dispatcher
                                           ObservationParser




                                  Fig. 1. Systemarchitecture
�   The following components are within the system architecture:
 – FHIR-Client
 – Restful FHIR-Server
 – DMRE FHIR-Service
    • Prova-Receiver
    • Prova-Sender
    • FHIR-Client
    • ObservationParser
 – Knowledgebase
    • Extractor
    • Dispatcher
 – external FHIR-Server
The following section describes the relations between the components having in
mind the workflow as well.

The system architecture: From an architectural point of view, the solution is
based on FHIR as a state-of-the-art standard for sending and receiving medi-
cal data. Therefore, any (external) FHIR-Client is needed to send the FHIR-
Observations to a so-called ’Distributed Medical Rule Engine’ (DMRE) which
contains a FHIR-Server. The DMRE is a container for different services, which
need to be accessed during transaction time.
    The FHIR-Client is responsible for the creation of conformant JSON-objects,
containing the appropriate values for the designated resource. The FHIR-Server
provides a RESTful-service to receive FHIR-resources (e.g., Patient-resources,
Observation-resources) by using HTTP. The server has to be able to accept
HTTP-calls for inserting, updating, and deleting resources.
    The DMRE-FHIR-Service is a service that provides the interfaces for the
PROVA-rule-engine, as well as an FHIR-Client and an Observation parser. The
rule-engine interacts with the Knowledge base. The knowledgebase contains the
rules. There are rules which define which value needs to be extracted for further
processing, and also rules for the dispatching of the FHIR-resources. These rules
are providing the ’logic’ in the workflow during execution-time.
    The DMRE-FHIR-Service can send incoming requests from the FHIR-Server
to the extractor-rule. Secondly, the DMRE-FHIR-Service can receive incoming
requests from the Rules for upcoming processing. Here is meant to either get the
information of extraction (which value to extract from the FHIR-Observation),
or the dispatch information (where to process the FHIR-Observation to). For the
extraction, the Observation-parser is needed, to grab the relevant information
(requested code and value), if it exists in the observation. This DMRE-FHIR-
Service exists as an extra service because of the option to have another incoming
path than the FHIR-Server (which intercepts the request). The external FHIR-
Server is the chosen endpoint by the rule-engine, executed by the FHIR-Client
in the DMRE-FHIR-Service. This endpoint could be the goal (target) server,
which is responsible for the persistence of the observation resource. It could be
another DMRE-RESTful-FHIR-Server-instance, which proceeds other rules and
�takes a different decision (based on a different set of rules). That means it is
possible to have the integrated rule-engine used in a distributed way, and no
central component is needed. Still, it could be on the edge of a wide distributed
inter-operable health system.
   The system architecture is designed to intercept the incoming FHIR-Observation-
request for the information extraction and make decisions based on the rules
about the FHIR endpoint.



Workflow: For the current use-case, the workflow during the transaction process
in this architecture is based on the fact that an observation-type (e.g. a heart-rate
or glucose-level) and a decision for ’normal’ or ’not normal’ is needed.




                                                                                                                                                                                                                                                                                                                                                                                                            FHIR-Client
                                                                                                                                                                                                                                                                                                                                                                                         Observation
           execution




                                                                                                                                                                                                                                                                                                                                                                                           Send
            Return
             result




                                                                                                                                                                                                                                                                                                                                                                                                       FHIR-Restful
                                                                                                                                                                                                                                                                                                                                                                                                         Server
                                                                                                                                                                                                                                                                                                                                                                          Observation
                                                                                                                                                                                                                                                                                                                                                                           Forward
                execution
                 Return
                  result




                                                                                                                                                                                                                                                                                                                                                                                                            DMREFhirServer
                                                                                                                                                                                                                                                                                                                                          ProvaService.send („extractor“, Observation)
                                                                                                                                                                                                                                               Save Observation temporary



                                                                                                                                                                                                                                                                            Send Back observation and value to extract
                                                                                                                                                                                               Return extracted value



                                                                                                                                                                                                                        Extract needed Value
                                                      Forward Observation to desired endpoint




                                                                                                                                                                        Send extracted value
                                                                                                Return FHIR-Endpoint




                                                                                                                                                                                                                                                                                                                                                                                                       Observation-
                                                                                                                                                                                                                                                                                                                                                                                                         Parser
                            Return execution result




                                                                                                                                                                                                                                                                                                                                                                                                       Knowledgebase
                                                                                                                                                                                                                                                                                                                                                                                                         (Extractor)
                                                                                                                                                                                                                                                                                                                         Check for needed Value




                                                                                                                                                                                                                                                                                                                                                                                                       Knowledgebase
                                                                                                                                                                                                                                                                                                                                                                                                        (Dispatcher)
                                                                                                                                                        Check if value is normal or not
                                                                                                                       Choose FHIR-Endpoint to submit




                                                                                                                                                                                                                                                                                                                                                                                                       Server (storage)
                                                                                                                                                                                                                                                                                                                                                                                                        External FHIR-




          Fig. 2. Sequence FHIR-Client, Interception and final submission
�    The workflow starts by having an FHIR-Client submitting an FHIR-Observation
to the DMRE-FHIR-Restful-Server. The DMRE-FHIR-Restful-Server intercepts
the request by calling the DMRE-FHIR-Service and forwarding the observation
there. This DMRE-FHIR-Service is the core component in the workflow since
it coordinates requests and takes care of responding to the initial requestor.
The DMRE-FHIR-Service forwards the observation to the ’extractor’-Rulebase.
This extractor is aware of which value needs to be extracted to have the right
information for the upcoming dispatching. The extractor-rule returns than the
’to-be-extracted’ value and observation. This task of filling the needed value
and an FHIR-Observation can also be done by any external component. The
DMRE-FHIR-Service keeps the current observation to proceed with the follow-
ing parsing and extraction. The observation-parser simply returns the extracted
value, which will then be submitted to the ’dispatch’-rule. This rule decides
(e.g., if a value is a normal value or a not-normal value), based on the configu-
ration of the rules and the extracted value, which FHIR-Server-Endpoint to use
for the (final) submission. The ’dispatch’-rule finally returns the endpoint to the
DMRE-FHIR-Service, which then acts as an FHIR-Client and submits the initial
observation to the decided endpoint. The endpoint returns an execution-result,
which will be processed back through the entire processing-chain, to have the
initial FHIR-Client informed about successful storage.
    The general workflow during the execution process is for every observation-
type and the attached values the same, but the specific details on ’what’ goal
need to be achieved can be changed due to the needs of the use case.


3     Implementation

The implementation of the Distributed Medical Rule Engine (DMRE) is done in
Java by including Prova-libraries for the rule-engine-parts and the HAPI-FHIR-
Library [10] for essential FHIR services.
    For testing a sample use case, a reduced example from the HL7-FHIR-
Resource page of samples is used. This one is then sent via HTTP-Post to the
FHIR-Endpoint in the DMRE.
    The HAPI-FHIR-Library provides a servlet, which allows us to set up an
FHIR-Server in general, but without having specific resources implemented. This
allows us to build up our own needs in the implementation, by creating for
example a specific ’RestfulObservationResourceProvider’, which then can call
the DMRE-FHIR-Service-code. The DMRE-FHIR-Service acts as a client for
sending the received JSON-Object to the rule-engine. The call is submitted to
the extractor. A sample listening for the extractor is in Listening 1.1.

                              Listing 1.1. Sample Extractor.prova
:− e v a l ( e x t r a c t o r ( ) ) .
e x t r a c t o r ( ) :−
                rcvMult (XID , P r o t o c o l , From , inform ,
                      { o b s e r v a t i o n −>O b s e r v a t i o n } ) ,
�         routeTo2 ( O b s e r v a t i o n ) .
routeTo2 ( O b s e r v a t i o n ) :−
         sendMsg ( ” XIDExtractor ” , o s g i , ”FHIR” , inform ,
               { g l u c o s e −>O b s e r v a t i o n } ) .

The knowledgebase (extractor-rule) has the information WHAT to extract. It
receives the observation as a string, and ’routeTo2’ (which means send it back
to the Java-process - ’Step 2’) also has the information which observation-type
to take care of. In the sample, it takes care of the glucose-coding.
     The java-code contains a Prova-Callback, to receive calls from the rule-engine.
Prova has a defined ordering of parameters [11] that is used for the decision if
it is an extraction-task or a dispatching-task. The parameters are the following
ones [11]:
 – XID - conversion-ID of the message
 – Protocol - Name of the message passing protocol
 – Destination
 – Performative - the message type broadly characterizing the meaning of the
   message
 – Payload
For this task, the ’Destination’ is used - either ’FHIR’ for the data-extraction
and further ongoing submission to the second rule-base or ’DISPATCHER’ for
executing the submission to the next FHIR-Endpoint.
    Once the Prova-callback is hit by the Destination ’FHIR’, the Java-code tries
to parse the FHIR-Observation, extract the value from there, and return it, to
then put this information in a further call to the Dispatcher-rule, to take the
decision where to send the FHIR-Observation-Resource finally.
    The dispatching-rule has information about the decision to submit to a dif-
ferent endpoint, and it also holds the information on the endpoint.
    In Listening 1.2, a reaction-routing functionality is used to find the correct
endpoint if the value of the observation is normal or another if it is abnormal.
Once found out about the status of the value, the ”routeToFHIR” either takes
the event processing agent for FHIR-Endpoint A (http://hapi.fhir.org/baseR4)
or B (http://hapi2.fhir.org/baseR4). This information is then sent back to the
Prova-Callback with the Prova-Destination ’DISPATCH’, to submit the FHIR-
Observation to the meant endpoint, by using an implementation of an FHIR-
Client.
                       Listing 1.2. Sample Dispatcher.prova
:− e v a l ( d i s p a t c h e r ( ) ) .
d i s p a t c h e r ( ) :−
                rcvMult (XID , P r o t o c o l , From , inform ,
                       { val ue −>O b s e r v a t i o n } ) ,
                routeToFHIR ( Agent , O b s e r v a t i o n ) ,
                sendMsg ( ”XID3” , o s g i , ”DISPATCHER” , inform ,
                       { endpoint −>Agent } ) .
�routeToFHIR ( ” h t t p : / / h a p i . f h i r . o r g / baseR4 ” , O b s e r v a t i o n ) :−
          abnormal ( O b s e r v a t i o n ) .
routeToFHIR ( ” h t t p : / / h a p i 2 . f h i r . o r g / baseR4 ” , O b s e r v a t i o n ) :−
          normal ( O b s e r v a t i o n ) .
abnormal ( O b s e r v a t i o n ) :−
          Observation >7.
normal ( O b s e r v a t i o n ) :−
          Observation <=7.

After processing the information to the next FHIR-Server, the response from the
server is then returned to the client (for successful and also for not successful
submissions). This is achieved by the HAPI-FHIR-Method ’MethodOutcome’.
Important to say, that the initial JSON-Object is not changed in terms of con-
tent. The transformations are done for the necessary extraction to allow the
decision based on values.
    The code is available on Github https://github.com/gkober/DMRE. As a
side note: in the code are two options implemented: first, using ”hardcoded”
observation-types (by configuration), and secondly, the opportunity for the rule-
engine is available. The usage of the different options can be done by configura-
tion.


4    Results and Discussion
The presented work shows the ability to achieve rule-based dispatching to dif-
ferent FHIR-Servers for obtaining patient’s observations, which are critical for
patient care. The solution is highly flexible, because of the rules which take
control of the decision-points.
    During the evaluation of the implementation, simple observations contain-
ing e.g., glucose-values or heart-rate values, the solution works appropriately by
the extraction and the dispatching. There is a known issue in the implementa-
tion, which takes care of ’combined observations’. This means if an observation
has two or more codes and values (e.g., blood pressure). The implementation is
susceptible to the correctness of the FHIR-Observation. For example, an obser-
vation without a value returns in error. Such an observation is, by definition,
correct, but for a production system, it is probably not relevant to take care of
this topic.
    Finally, the architecture and the decision to use the rule-engine Prova turned
out to be a reasonable solution providing the required flexibility and adaptability
as well as extendability of the architecture. This helps to improve the overall
solution of the ’distributed medical rule engine’.
�5   Future Work

Based on this work, further topics need to be addressed. One is to extend the
solution for other FHIR-Resources, which are valuable for different types of in-
formation dispatching and extraction. In the rules, the user mentions the ”type”
of information which needs to be extracted - therefore, information retrieval from
a terminology-service needs to found. Also, the dispatching of patient-basis and
combinations is a field that needs to be addressed.


References
 1. A.Paschke: Semantic Web Rules,
    https://pdfs.semanticscholar.org/d8f9/e961df8c4103a2d698f962d3460305d43564.pdf,
    accessed: 2020-05-06
 2. A.Paschke: The Reaction RuleML Classification of the Event/Action/State Pro-
    cessing and Reasoning Space (12 2006),
    https://arxiv.org/ftp/cs/papers/0611/0611047.pdf
 3. Arden Syntax v2.10 (Health Level Seven Arden Syntax for Medical Logic Systems,
    Version 2.10),
    https://www.hl7.org/implement/standards/product brief.cfm?product id=372,
    accessed: 2020-05-06
 4. Semantic CEP with Reaction RuleML,
    https://de.slideshare.net/swadpasc/paschke-rule-ml2014keynote, accessed: 2020-
    05-06
 5. Chalari E., Intas G., S.P.: The Importance of Vital Signs in the Triage of Injured
    Patients. Critical Care Nursing Quarterly 35, 292–298 (2012). https://doi.org/doi:
    10.1097/CNQ.0b013e318255d6b3
 6. Observation - FHIR v4.0.1,
    https://www.hl7.org/fhir/observation.html, accessed: 2020-05-06
 7. Observation - FHIR v4.0.1 - Definitions,
    https://www.hl7.org/fhir/observation-definitions.html#Observation.code,
    Accessed: 2020-05-06
 8. HL7 FHIR: Architect’s Introduction,
    https://www.hl7.org/fhir/overview-arch.html, accessed: 2020-05-06
 9. HL7 FHIR: Summary,
    https://www.hl7.org/fhir/summary.html, accessed: 2020-05-06
10. HAPI FHIR - The Open Source FHIR API for Java,
    https://hapifhir.io, accessed: 2020-05-06
11. Kozlenkov, A.: Prova Rule Language Version 3.0, User’s guide (May 2010)
12. Prova rule language, https://github.com/prova/prova, accessed: 2020-05-06
13. Versloot, M.: Evidence based decisions in nursing and their effect on
    quality of care. Ph.D. thesis, Faculty of Medicine (AMC-UvA) (2012),
    https://hdl.handle.net/11245/1.385728
�