🦝

HAPI FHIR入門 - 医療情報交換の標準化を実現するOSS

2025/03/08に公開

はじめに

医療情報システムの世界では、異なるシステム間でのデータ交換が長年の課題でした。患者情報、診療記録、検査結果など、様々な医療データが異なるフォーマットで管理されていると、医療機関間の連携や研究データの活用が困難になります。

この課題を解決するために登場したのが、HL7 FHIRという国際標準規格です。HL7 FHIRについては、以前の記事で解説しているので、興味がある方はそちらも参考にしてください。そしてHAPI FHIRは、このFHIR規格をJavaで実装した強力なオープンソースライブラリです。

今回は、HAPI FHIRの概要から簡単な実装例まで、初心者にも分かりやすく解説します。

https://zenn.dev/ispec_inc/articles/medical-dx-fhir-future

HAPI FHIRとは?

HAPI FHIRは、カナダのトロントにある公的医療・研究機関ネットワークであるUHN (University Health Network) が開発・提供しているオープンソースのJavaライブラリです。HL7 FHIR規格に準拠した医療情報システムを簡単に構築できるよう設計されています。

主な特徴

  • 標準規格への準拠
    • HL7 FHIR規格に完全準拠
  • 包括的な機能
    • データモデル、API、検証機能など、FHIR実装に必要な機能を網羅
  • 柔軟な拡張性
    • 様々なユースケースに対応できる拡張機能
  • オープンソース
    • MITライセンスで提供され、商用利用も可能
  • 活発なコミュニティ
    • 継続的な改善と拡張が行われている

https://hapifhir.io

主要コンポーネント

HAPI FHIRは以下の主要コンポーネントで構成されています。

  • FHIR データモデル
    • 患者情報、診療記録などのFHIRリソースを表現するJavaクラス
  • パーサー/エンコーダー
    • XML、JSONなどの形式とJavaオブジェクト間の変換機能
  • バリデーター
    • FHIRリソースの妥当性を検証する機能
  • RESTクライアント
    • FHIRサーバと通信するためのクライアントAPI
  • HAPI FHIR サーバ
    • データベースを持たないFHIRサーバの実装
    • 既存システムのデータをリアルタイムにFHIRに変換し提供するファサード型のサーバの実装に有用
  • HAPI FHIR JPA Server
    • データベースと連携したFHIRサーバの実装
    • 既存システムのデータを予めFHIR形式に変換してDBに保存、提供するリポジトリ型のサーバの実装に有用


https://www.hl7.jp/docs/77seminar_2_HL7.pdf

特に「HAPI FHIR JPA Server」は、Java Persistence API (JPA) を使用してFHIRリソースをデータベースに永続化する機能を提供しており、完全なFHIRサーバを簡単に構築できる強力なコンポーネントです。

https://qiita.com/amadablam/items/487e91c173a198cfe6be

活用シナリオ

HAPI FHIRは以下のようなシナリオで活用できます。

  • 既存システムのFHIR対応
    • 既存の電子カルテシステムにFHIRインターフェースを追加
  • 新規FHIR準拠システムの開発
    • 最初からFHIR準拠の医療情報システムを構築
  • 医療データの標準化
    • 異なるシステムからのデータをFHIR形式に変換・標準化
  • 医療機関間の情報連携
    • 異なる医療機関間でのデータ共有基盤の構築


https://hapifhir.io

実際の活用事例

HAPI FHIRは世界中の医療機関や医療ITベンダーで活用されています。

  • 電子カルテシステムのFHIRインターフェース
    • 既存の電子カルテシステムにFHIRインターフェースを追加し、他システムとの連携を実現
  • 地域医療連携ネットワーク
    • 異なる医療機関間でのデータ共有基盤として活用
  • 電子処方箋システム
    • 処方情報を標準化されたFHIR形式で交換
  • 臨床研究データ管理
    • 研究データをFHIR形式で標準化し、研究間でのデータ共有を容易に

実践:HAPI FHIRを使ってみよう

それでは、HAPI FHIRを使った簡単な例を見ていきましょう。

0. プロジェクトセットアップ

まずはGradleプロジェクトにHAPI FHIRの依存関係を追加します。
今回は、最も普及しているFHIRのバージョンである R4(第4版) を使用します。

build.gradle.kts
dependencies {
    // HAPI FHIR コア
    implementation("ca.uhn.hapi.fhir:hapi-fhir-base:8.0.0")

    // FHIR R4 (第4版) のモデル
    implementation("ca.uhn.hapi.fhir:hapi-fhir-structures-r4:8.0.0")

    // クライアント機能
    implementation("ca.uhn.hapi.fhir:hapi-fhir-client:8.0.0")
}

1. FHIRリソースの作成と操作

患者情報(Patient)リソースを作成し、JSON形式に変換する例です。

main.kt
import org.hl7.fhir.r4.model.Patient
import org.hl7.fhir.r4.model.Enumerations.AdministrativeGender
import org.hl7.fhir.r4.model.DateType
import ca.uhn.fhir.context.FhirContext

fun main() {
    // 患者リソースの作成
    val patient = Patient().apply {
        // 患者ID設定
        id = "patient-001"

        // 患者名設定
        addName().apply {
            family = "山田"
            addGiven("太郎")
            addPrefix("Mr.")
        }

        // 性別設定
        gender = AdministrativeGender.MALE

        // 生年月日設定
        birthDate = DateType("1980-01-01").value

        // 電話番号設定
        addTelecom().apply {
            system = org.hl7.fhir.r4.model.ContactPoint.ContactPointSystem.PHONE
            value = "03-1234-5678"
        }
    }

    // FHIRコンテキスト作成 (R4バージョン)
    val ctx = FhirContext.forR4()

    // JSON形式に変換
    val json = ctx.newJsonParser().setPrettyPrint(true).encodeResourceToString(patient)

    // 結果表示
    println(json)
}

出力されるJSON:

{
  "resourceType": "Patient",
  "id": "patient-001",
  "name": [ {
    "family": "山田",
    "given": [ "太郎" ],
    "prefix": [ "Mr." ]
  } ],
  "telecom": [ {
    "system": "phone",
    "value": "03-1234-5678"
  } ],
  "gender": "male",
  "birthDate": "1980-01-01"
}

2. FHIRクライアントを使ったサーバとの通信

公開FHIRサーバから患者情報を検索する例です。

main.kt
import ca.uhn.fhir.context.FhirContext
import org.hl7.fhir.r4.model.Bundle
import org.hl7.fhir.r4.model.Patient

fun main() {
    // FHIRコンテキスト作成 (R4バージョン)
    val ctx = FhirContext.forR4()

    // クライアント作成 (公開テストサーバに接続)
    val client = ctx.newRestfulGenericClient("https://hapi.fhir.org/baseR4")

    // 患者検索 (姓が"SMITH"の患者を検索)
    val results = client
        .search<Bundle>()
        .forResource(Patient::class.java)
        .where(Patient.FAMILY.matches().value("SMITH"))
        .returnBundle(Bundle::class.java)
        .execute()

    // 検索結果の表示
    println("検索結果: ${results.entry.size}件")

    // 各患者情報の表示
    results.entry.forEach { entry ->
        (entry.resource as? Patient)?.let { patient ->
            val name = patient.nameFirstRep.nameAsSingleString
            val id = patient.idElement.idPart
            println("ID: $id, 名前: $name")
        }
    }
}

出力結果:

検索結果: 20件
ID: pat2, 名前: John Smith
ID: ailovdisyb2, 名前: Darcy Smith
ID: lalo2, 名前: Darcy Smith
ID: frt2, 名前: Darcy Smith
ID: Patient123, 名前: Jahn Smith
ID: 10626123, 名前: Elijah Smith
ID: 10626129, 名前: Johns Smith
ID: 10652737, 名前: Mr. John Smith
ID: 10653394, 名前: Mr. John Smith
ID: 10663056, 名前: John Smith
ID: 10663085, 名前: John Smith
ID: 10663172, 名前: John Smith
ID: 10676359, 名前: John Smith
ID: 10676361, 名前: Johnny Smith
ID: 10676366, 名前: John Smith
ID: 10676369, 名前: John Smith
ID: 10676370, 名前: John Smith
ID: 10676587, 名前: Baby of Emma SMITH
ID: 10676588, 名前: Baby of Emma SMITH
ID: 10676986, 名前: Test12345 SMITH

3. HAPI FHIR JPA Serverを使ったFHIRサーバの実装

公式ドキュメントで、まずはスタータープロジェクトを使用することが推奨されていたので、クローンして起動してみます。Spring Bootを使用しているみたいです。

https://github.com/hapifhir/hapi-fhir-jpaserver-starter

データベースはインメモリ型のH2が設定されているため、mvn spring-boot:runを実行するだけで使用することができました。PostgreSQLやMySQLなど他のデータベースに変更することも可能です。
起動したFHIRサーバに対して、cURLコマンドを使用してPatientの登録と取得を行うことができました。

まとめ

HAPI FHIRは、医療情報交換の国際標準規格であるHL7 FHIRをJavaで実装した強力なオープンソースライブラリです。UHN (University Health Network) という公的医療・研究機関によって開発・提供されており、医療情報システムの相互運用性向上に大きく貢献しています。

データモデル、API、検証機能、サーバ実装など包括的な機能を提供しており、既存システムのFHIR対応から新規FHIR準拠システムの開発まで、様々なユースケースに対応できます。

医療情報の標準化と相互運用性は、より良い医療サービスの提供や医療研究の発展に不可欠です。HAPI FHIRはその実現に向けた重要なツールとして、今後もさらなる発展が期待されています。

参考リソース

ispec inc.

Discussion