All Projects → Optum → CyFHIR

Optum / CyFHIR

Licence: GPL-3.0 license
A Neo4j Plugin for Handling HL7 FHIR Data

Programming Languages

java
68154 projects - #9 most used programming language
typescript
32286 projects
shell
77523 projects

Projects that are alternatives of or similar to CyFHIR

hl7v2-fhir-converter
Converts HL7 v2 Messages to FHIR Resources
Stars: ✭ 40 (+2.56%)
Mutual labels:  healthcare, fhir, hl7
fhir-works-on-aws-persistence-ddb
A DynamoDB implementation of the FHIR Works on AWS framework, enabling users to complete CRUD operations on FHIR resources
Stars: ✭ 24 (-38.46%)
Mutual labels:  healthcare, fhir, hl7
fhirpath
FHIRPath implementation in Python.
Stars: ✭ 25 (-35.9%)
Mutual labels:  healthcare, fhir, hl7
Neo4j Streams
Neo4j Kafka Integrations, Docs =>
Stars: ✭ 126 (+223.08%)
Mutual labels:  neo4j, graph-database
Neo4j Core
A simple unified API that can access both the server and embedded Neo4j database. Used by the neo4j gem
Stars: ✭ 99 (+153.85%)
Mutual labels:  neo4j, graph-database
Libneo4j Client
neo4j-client -- Neo4j Command Line Interface (CLI)
Stars: ✭ 121 (+210.26%)
Mutual labels:  neo4j, graph-database
Neo4j sips
Elixir driver for the Neo4j graph database server
Stars: ✭ 78 (+100%)
Mutual labels:  neo4j, graph-database
Neo4j 3d Force Graph
Experiments with Neo4j & 3d-force-graph https://github.com/vasturiano/3d-force-graph
Stars: ✭ 159 (+307.69%)
Mutual labels:  neo4j, graph-database
Reddit Detective
Play detective on Reddit: Discover political disinformation campaigns, secret influencers and more
Stars: ✭ 129 (+230.77%)
Mutual labels:  neo4j, graph-database
monai-deploy
MONAI Deploy aims to become the de-facto standard for developing, packaging, testing, deploying and running medical AI applications in clinical production.
Stars: ✭ 56 (+43.59%)
Mutual labels:  healthcare, fhir
Bolt sips
Neo4j driver for Elixir
Stars: ✭ 204 (+423.08%)
Mutual labels:  neo4j, graph-database
Activegraph
An active model wrapper for the Neo4j Graph Database for Ruby.
Stars: ✭ 1,329 (+3307.69%)
Mutual labels:  neo4j, graph-database
Neo4j Apoc Procedures
Awesome Procedures On Cypher for Neo4j - codenamed "apoc"                     If you like it, please ★ above ⇧            
Stars: ✭ 1,291 (+3210.26%)
Mutual labels:  neo4j, graph-database
Movies Javascript Bolt
Neo4j Movies Example with webpack-in-browser app using the neo4j-javascript-driver
Stars: ✭ 123 (+215.38%)
Mutual labels:  neo4j, graph-database
Neo4j
Graphs for Everyone
Stars: ✭ 9,582 (+24469.23%)
Mutual labels:  neo4j, graph-database
Neo4j Php Ogm
Neo4j Object Graph Mapper for PHP
Stars: ✭ 151 (+287.18%)
Mutual labels:  neo4j, graph-database
Movies Python Bolt
Neo4j Movies Example application with Flask backend using the neo4j-python-driver
Stars: ✭ 197 (+405.13%)
Mutual labels:  neo4j, graph-database
Helicalinsight
Helical Insight software is world’s first Open Source Business Intelligence framework which helps you to make sense out of your data and make well informed decisions.
Stars: ✭ 214 (+448.72%)
Mutual labels:  neo4j, graph-database
database-journal
Databases: Concepts, commands, codes, interview questions and more...
Stars: ✭ 50 (+28.21%)
Mutual labels:  neo4j, graph-database
Movies Java Bolt
Neo4j Movies Example application with SparkJava backend using the neo4j-java-driver
Stars: ✭ 66 (+69.23%)
Mutual labels:  neo4j, graph-database

CyFHIR

Operationalizing Neo4j for use within Healthcare by leveraging HL7 FHIR Standards

Table of Contents

  1. Introduction
  2. Using CyFHIR
  3. Using This Codebase
  4. Performance Metrics

1. Introduction

Background

Before explaining CyFHIR, you should first understand what Neo4j and FHIR are, as this project is directly built off of them. To summarize, Neo4j is an 'open-source, NoSQL, native graph database', and FHIR is an open standard in healthcare maintained by HL7 who publishes interoperable methods of data transfer, storage, classification, and more. We highly recommend at least reading through HL7's FHIR documentation before continuing to work with CyFHIR.

What is CyFHIR?

CyFHIR is a native Neo4j plugin that acts as the bridge between FHIR and Neo4j. With CyFHIR, users can: directly load FHIR Resources into their Neo4j database, execute Neo4j queries (using Neo4j's query language, Cypher) on those FHIR Resources, and return query responses as FHIR Resources that meet HL7's standards.

2. Using CyFHIR

Usage Prerequisites

  • Docker Desktop (docker and docker-compose)

How to use CyFHIR

We recommend the use of Docker for running Neo4j version 4.2.x locally to maintain static development environments that can be easily cleaned/removed. But if you wish to use Neo4j Desktop, that should work as well. Whichever development you choose, adding CyFHIR to Neo4j should be the same process:

  1. Download the latest release from https://github.com/Optum/CyFHIR/releases
  2. Add CyFHIR to your $NEO4J_HOME/plugins folder
  3. Download the latest APOC Package from https://github.com/neo4j-contrib/neo4j-apoc-procedures/releases (APOC is a Neo4j community package with tons of useful procedures and functions and we use it in tandem with CyFHIR)
  4. Add APOC to your $NEO4J_HOME/plugins folder
  5. In $NEO4J_HOME/conf/neo4j.conf add apoc and cyfhir as unrestricted plugins NEO4J_dbms_security_procedu res_unrestricted: apoc.*,cyfhir.*
  6. Run Neo4j

CyFHIR Commands

Currently CyFHIR has 3 procedures and 2 aggregating functions:

Procedures:
  • cyfhir.bundle.load(String <FHIR JSON>, { validation: Boolean, version: String <FHIR Version: "DSTU3", "R5", "R5"> })

    • To load FHIR into Neo4J, you can easily do this by running CALL cyfhir.bundle.load() with the input being a FHIR Bundle JSON that has been formatted as a string (adding escape chars to all double quotes in the JSON).

    • Validation is turned off by default but if you want to validate FHIR resources as you load them, add the config map with validation: true and version: "DSTU3", "R4", or "R5". Validation is fast with a less than 5% reduction in loading speed.

    • Another thing to note is if you want to test this way with generated data, we recommend Synthea. BUT if you choose to use Synthea, you must remove the generated html in every resource of the bundle for all entries. The path to the field to remove is: Bundle.entry[i].resource.text.display. This is necessary as there are escape chars hidden within the display that Neo4j cannot handle.

  • cyfhir.resource.load(String <FHIR JSON>, { validation: Boolean, version: String <FHIR Version: "DSTU3", "R5", "R5"> })

    • To load FHIR into Neo4J, you can easily do this by running CALL cyfhir.resource.load() with the input being a FHIR Resource JSON that has been formatted as a string (adding escape chars to all double quotes in the JSON).

    • Validation is turned off by default but if you want to validate FHIR resources as you load them, add the config map with validation: true and version: "DSTU3", "R4", or "R5". Validation is fast with a less than 5% reduction in loading speed.

    • Another thing to note is if you want to test this way with generated data, we recommend Synthea. BUT if you choose to use Synthea, you must remove the generated html in every resource of the bundle for all entries. The path to the field to remove is: Resource.text.display. This is necessary as there are escape chars hidden within the display that Neo4j cannot handle.

  • cyfhir.resource.expand()

    • Pass either a Resource node or an Entry node into cyfhir.resource.expand() to expand out the full resource/entry to be able to pass it into an aggregating function like cyfhir.resource.format() or cyfhir.bundle.format()

    • Example where "entry" is a previously queried node with label type "entry":

    CALL cyfhir.resource.expand(entry) YIELD path
    RETURN cyfhir.bundle.format(collect(path))
Functions
  • cyfhir.bundle.format()

    • Pass an array of expanded FHIR Resources as entries that were the result of some query. To properly pass data into this function, the last few lines of your query will probably end up looking like this:
    UNWIND entryList AS entry
    CALL cyfhir.resource.expand(entry) YIELD path
    RETURN cyfhir.bundle.format(collect(path))

    The entryList variable above that gets unwound is the list of entry nodes that match a query that you've written above. This expands those entry nodes to get the full resource, converts that to a JSON/tree-like structure, then passes it to CyFHIR to build the bundle and enforce correct cardinality of resource properties.

  • cyfhir.resource.format()

    • Just like cyfhir.bundle.format(), this function will format a fully expanded resource, but only one. As part of some query to find a single Resource, you pass the Resource node into the expander,then pass the collected paths into the formatter to build your FHIR Resource.
    CALL cyfhir.resource.expand(resource) YIELD path
    RETURN cyfhir.resource.format(collect(path))

3. Using this Codebase

Understanding the Cypher and code behind this solution is not trivial, so we recommend using this repo to get a better understanding of how this all works.

In this repo we have:

  • The CyFHIR Java Project
  • An Express.js HTTP Server that also serves Swagger Docs for interacting with Neo4j, used for demonstrating examples of CyFHIR in action
  • Docker-Compose files for spinning up Neo4j, Node.js, and a small ELK Stack with APM for performance monitoring if you are interested in that

Just be sure to git clone this repo and cd CyFHIR into the project

Starting Neo4j with CyFHIR in Docker and local Express.js server

  1. In one terminal window run command make neo4j
  2. In a different terminal window run command cd express && npm ci
  3. Then run npm run serve to start the Express.js server
  4. Open browser to http://localhost:7474 and http://localhost:3000/docs
  5. Use Swagger Docs to Load Test Bundle or run bash bin/seed.sh from root of project to seed Neo4j with 6, large Synthea Bundles

Starting Neo4j with CyFHIR and Express.js server in Docker

  1. In terminal run command make backend
  2. Open browser to http://localhost:7474 and http://localhost:3000/docs
  3. Use Swagger Docs to Load Test Bundle or run bash bin/seed.sh from root of project to seed Neo4j with 6, large Synthea Bundles

Visual Graph of Patient and Conditions

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].