EHRbase入門1 - 概要と環境整備


## はじめに

本記事は2020年第2回openEHR研究会で紹介する講演内容です。EHRbaseはopenEHR仕様のオープンソースソフトウェア実装の一つです。今回はEHRbaseについてそのアーキテクチャと、開発環境を構築するところまでを紹介します。

以降の内容は以下の資料と愛媛大学木村映善教授のメモを参考にして構築しております。

* EHRbase(GitHub repository)
    * https://github.com/ehrbase/
* EHRbase project
    * https://ehrbase.org/
* EHRbase, The 3rd openEHR Asia summitでのChristian Chevalleyの発表
    * https://www.slideshare.net/openEHR-Japan/ehrbase-open-source-openehr-cdr

---
## EHRbaseの開発環境
開発環境としてEHRbaseが利用する主要なソフトウェアコンポーネントを列記します。環境構築はdockerで行いますが、必要に応じてインストールしておいてください。

* docker
* Java JDK/JRE 17 (OpenJDK推奨, 0.22以降からJava 17でないとビルドできなくなりました。）
* Maven (Ubuntu 20.04のVersion 3.6では動作しないので新しいバージョンを新規に導入するかUbuntu 22.04LTSあたりにアップグレードする必要があります）
* Springboot
* PostgreSQL 10.4以降-
    * jsquery plugin
    * temporal template
* Postman
* Ocean archetype editor, template designer

---
## EHRbase概要

* EHRbaseはopenEHR仕様によるEHRサーバのオープンソースソフトウェア実装の一つです。
* MEDScape, EtherCISの流れをくんで2019年より開発開始。
* 現在16人の開発チームでGitHub上で開発が行われています。
* Springbootを採用して、Modern platform architectureでEHRサーバを構築しています。
    * REST API, JSON/XML message
* EHRデータを保存・管理するが、個人の氏名・住所などの情報は扱われない
    * OpenEPMI
    * 日本では？
* UI含めクライアントは含まれません。(SDKの提供有り）

---
## EHRbaseがめざすもの

* openEHR仕様に準拠したOpen source softwareでのEHRの実装
* 公開された標準とそれによる相互運用性を確立したプラットフォームをベンダーや病院、政府が導入する障壁を下げる。
* データ駆動型の医療を支える基盤となり、21世紀の医療における相互運用性を実現する。
* 複雑な業務手順を伴う電子処方箋や集中治療管理でも利用できるものとする。
* 次世代の医療関連ソフトウェアを容易に開発できるようにする。

---
## EHRbaseの組織ガバナンス

* [Hanover医大](http://www.mhh.de/en/)
* [Vitasystems Gmbh](https://www.vitagroup.ag/de_DE/Ueber-uns/vitasystems)
* [HiGHmed Medical Informatics] (https://highmed.org/), sponsored by:
    * [German Ministry of Education and Research](https://www.bmbf.de/en/index.html)
    * [Medical Informatics Initiative Germany](https://www.medizininformatik-initiative.de/en/about-initiative)
* Open Source Governance
    * Behaviour Driven Development(ふるまい駆動型開発）
    * SCRUMアプローチ(2週間を1スプリント）

---
## EHRbaseのアーキテクチャ

![ehrbase_platform.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18960/7fb7b6ef-181b-1dc9-6ccb-eea9da152f1d.png)

> [Christian Chevaley, EHRbase, the 3rd openEHR Asia summit, online, July 24, 2020.](https://www.slideshare.net/openEHR-Japan/ehrbase-open-source-openehr-cdr)

---
## EHRbaseとその周辺

![ehrbase_context.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18960/6d69a9ed-78de-bbe7-bf0c-dd5617b99324.png)

> [Christian Chevaley, EHRbase, the 3rd openEHR Asia summit, online, July 24, 2020.](https://www.slideshare.net/openEHR-Japan/ehrbase-open-source-openehr-cdr)

---
## EHRbase server
* Secure REST API(OAuth2はじめ多様な認証手順に対応）
* openEHR準拠のCRUDトランザクションとValidationを行う
* openEHRのオブジェクトに対するQuery（AQL)処理
* ローカルでのknwoledge modelを維持
* データ中心アーキテクチャ
* openEHRの最新architectureに対応

---
## EHRbase SDK

* Template(Knowledge base)を扱うことができる
* TemplateをPOJOクラスにコンバートすることができる
* EHRbaseクライアントのエンドポイントをJavaのメソッドとして提供する
    * EHR
    * Template
    * Composition
    * Querying(AQL)
    * Directory
* openEHRオブジェクトのシリアライズ、バリデーションをサポート
* REST APIのペイロードを生成

---
# 開発環境構築
---
## EHRbaseをインストールする前に
今回はDockerで環境を構築しますので、dockerが動作するように環境を整備します。docker-engine, docker-composeは比較的新しいversionであれば動作しますが、ver 1.7あたりの古いものでは動作しませんでした。

* Linux
    * それぞれのdistributionに対応した、docker, docker-composeをインストールしてください。
* Windows
    * Dockerの環境を整備する前に[WSL2環境を整備](https://qiita.com/yoskeoka/items/2d019d92fe6931930271)してください。
    * Ubuntu 20.04LTSで試しておりますが、他のdistroでも大丈夫だと思います。
* Mac
    * 試してませんが、dockerは動作するようです。

---
## EHRbaseのインストール
**重要**: 公式の手順で動かなくなることがありますので注意が必要です。

* 今回はJavaを使用しませんが、JDK 11相当のインストールは開発に必要ですので適宜自分の環境に合わせてインストールしておいてください。
* 順番は以下のように行います。

  1. docker-network作成
  1. PostgreSQLと関連プラグインを整備したコンテナの設定
  1. EHRbaseアプリケーションコンテナの作成

---
## docker-networkの作成

以下のコマンドで、EHRbase用のdocker networkを作成します

```shell
$ docker network create ehrbase-net
```

docker network lsで確認して以下のように表示されればOKです。

```shell
$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
2c6a5b55365a        bridge              bridge              local
4b82d2167e35        ehrbase-net         bridge              local
5ee3d71c037f        host                host                local
31ab9819a783        none                null                local
```
---
## PostgreSQLと関連プラグインを整備したコンテナの設定

既にPostgreSQLを利用されているかたはそのまま使われてもかまいませんが、プラグインのインストールが必要です。

* dockerを利用

```shell
$ docker run --name ehrdb --network ehrbase-net -e POSTGRES_PASSWORD=postgres -d -p 5432:5432 ehrbaseorg/ehrbase-postgres:latest
```

* dockerを利用しない場合はPostgreSQL(ver 10.4以降）をインストールしたあと、下記のプラグインをインストールしましょう。Ubuntuであれば下記のように必要となるパッケージもインストールしておきましょう。

```shell
$ sudo apt install gcc bison flex postgresql libpq-dev postgresql-server-dev-all openjdk-17-jdk maven
```

* [tamporal_tables](https://github.com/arkhipov/temporal_tables)のインストール

```shell:temporal_tables
$ git clone https://github.com/arkhipov/temporal_tables.git
$ cd temporal_tables
$ make
$ sudo make install
$ make installcheck
```

* make installcheckでエラーが出る場合はPostgreSQLでLinuxでのユーザー名と同じ名前のROLEを作成してデータベース作成権限を付与してください。

* [jsquery](https://github.com/postgrespro/jsquery)のインストール

```shell:jsquery
$ git clone https://github.com/postgrespro/jsquery.git
$ cd jsquery
$ make USE_PGXS=1
$ sudo make USE_PGXS=1 install
$ make USE_PGXS=1 installcheck
```

* make installcheckでエラーが出る場合はPostgreSQLでLinuxでのユーザー名と同じ名前のROLEを作成してデータベース作成権限を付与してください。

---
## EHRbaseサーバの構築

* dockerを利用するのが簡便です。

```shell
$ docker run --name ehrbase --network ehrbase-net -d -p 8080:8080 -e DB_URL=jdbc:postgresql://ehrdb:5432/ehrbase -e DB_USER=ehrbase -e DB_PASS=ehrbase -e SYSTEM_NAME=local.ehrbase.org ehrbaseorg/ehrbase:latest
```

* 実行確認は以下のように行います。

```shell
$ docker exec -i -t ehrbase /bin/bash
```

* dockerを利用せず、開発環境も含めて構築するのであれば、下記のようにします。
    * database tableの初期化

```shell
$ git clone https://github.com/ehrbase/ehrbase.git
$ cd ehrbase
$ sudo -u postgres psql -e < ./base/db-setup/createdb.sql
```

* mavenの環境の設定
    * 必要であれば、pom.xmlを編集してください。

* パッケージのビルド

```shell
$ mvn package
```

* EHRbaseの実行。
    * 現行バージョンであれば下記のコマンドを実行します。

```shell
$ java -jar application/target/application-0.13.0.jar
```

---
## APIの確認

うまく動いているようであればSwagger-uiで構築されたAPI一覧が出てきます。Basic認証のユーザーは ehrbase-user 、パスワードは SuperSecretPassword です。

http://localhost:8080/ehrbase/swagger-ui.html

## EHRの登録

Postmanを使ってEHRを登録してみましょう。公式のチュートリアルにある以下のJSONサンプルを利用します。

```json
{
  "_type": "EHR_STATUS",
  "subject": {
    "external_ref": {
      "id": {
        "_type": "GENERIC_ID",
        "value": "ins01",
        "scheme": "id_scheme"
      },
      "namespace": "ehr_craft",
      "type": "PERSON"
    }
  },
  "is_modifiable": "true",
  "is_queryable": "true"
}
```
---
## Templateの登録

Ocean Template DesignerなどのTemplate編集ソフトを利用してTemplateを作成します。作成したら、operational template(利用可能なテンプレート）形式で出力します。

XMLファイルの中身を確認したらAPIにそって、Postmanで登録します。

登録したファイルはPostmanを利用して見ることも可能です。

次回はこのテンプレートに基づいてデータを登録、読み出し、更新、削除(CRUD)を行います。

* 2022年12月13日、EHRbase 0.22でのアップデートに基づいて記事の更新を行いました。