MMLとFHIRの相互位置付け
seagia 2023/5/20

日本ダイナシステム株式会社

鈴木 利明

レジメ
・MMLサーバー(EHR3)の現状と概略

・MMLサーバーからFHIRへの変換
・MMLDBからFHIRへの変換の仕組み
・シンプルなデモ
・FHIR規格の調査で判明したこと

MMLサーバー(EHR3)の現状と概略

現在のデータベースサイズ
2023/5/12現在

MMLデータベース 6.2Tバイト
MML文書の格納（階層構造）
各種索引
ワークテーブル等
添付データベース

6.0Tバイト

MML以外の添付ファイルの格納(BASE64変換したもの）

MMLサーバー(EHR3)の現状と概略

施設数の推移（最初の記録の登録日）97施設

MMLサーバー(EHR3)の現状と概略
MMLの取り込み状況（con rmDate) 現在９７施設 累積１１億

fi

100万件/平日

MMLの歴史
1995

模索開始

1999.1

MML2.212001.11 MML2.3 (地域連携で利用が始まる)
2009.11 MML3.0 (ISO 13606標準,CDAに対応）
2016.2

MML4.0 (処方、注射、バイタル、フローシートの追加)

2016.12 MML4.1.2 (1000年カルテ用に運用規則の適用）

規格はMedXMLが決定している
XML規格 --- DTD, XMLSchemaで定義

FHIR(HL7)の歴史
HL7 v2.x
1987年から開発開始
1988年 v2.0
1994年 v2.2
2000年 v2.4
データ交換の必要性あり。
軍隊では必須事項
ハードウエアの貧弱をカバーするためデータ量を減らす。(ディスクサイズ、メモリサイズ、通信速度、現在の1000分の1以下)
医療で行うことは変わっていない。画像等は増えているが、検査数、投薬種類が増えている訳ではない
読み易さは後回し
DOD,VA(M言語系ユーザー)が参加しているので、項目を連結した文字列をメッセージみになっている
RDBからみると扱いにくいデータ構造である。
そのためRDBではそのままの文字列を格納することが多い(ETL処理は他言語で行う)非常に項目数が多い
構造定義はBNFで定義
例： Address ::= <street address (ST)> ^ < other designation (ST)> ^ <city (ST)> ^ <state or province (ST)> ^ <zip or postal code (ST)> ^<country (ID)> ^ <address type (ID)> ^ <other geographic designation (ST)>set zip=$piece(Address,"^",5) ;ZIPの取り出しプログラム M言語FHIR(HL7)の歴史
HL7 V3 XML対応を目指す
2000年頃から開発が始まる
参照情報モデル(RIM)
RIM̶> XMLメッセージを設計する
当時の感想：同じ電磁方程式を使っているからといって、１００ボルトと２００ボルト電流に互換性はない

FHIR(HL7)の歴史
2012年から開発が始まる
2019年 v4.0.1 現在

ネット世代の時代の要請
外部の使えるものは使う姿勢に変わる。
普通のプログラマが参入できる土壌を作る。
アクセス方式は、REST
セキュリティは外部規格に合わせる。
データ表現は、XMLからJSONの階層データ表現に変更された。
なぜJSONか
最近のコンピュータ言語はJSONの扱いが容易になっている
JSONを取り込めばその言語で操作する構文が用意されている。自前で構文解析をする必要がない。
問題点：JSONには、なぜか世界共通の定義方式がない。
FHIRでは、特別な定義方式を採用している仕様の決め方: ネット公開の場で規格を決める。

FHIRの定義
http://hl7.org/fhir/

MMLDBからFHIRへの変換の仕組み
0. FHIRの本来の流れとしては、サイトから部品をダウンロードして利用することなのだろうが、EHR3の仕組みと適合するかは見通せなかった。
今はIRIS for HealthにFHIR用の部品も数多く用意されているがまだだった。
今回は独自方式ではじめた。
1. FHIR JSON構造のレンダラの作成
FHIR規格の取り出し
扱いやすいように変換（８パス）
コンパイラの作成
JSONレンダラの生成̶->これでJSON構造は出力できる
2. MMLからデータの取り出し
FHIRに適合するようにMMLテーブルからデータを取り出し、必要ならば変換をする

MMLサーバーからFHIRへの変換

FHIR仕様(Patient) 取り出し定義体
表 3 Patient リソース 患者情報
No

要素 Lv1

1

resourceT ype

2

meta

2.1

3

要素

要素Lv2

Lv3

pro letext

多重度型

1..1

Meta

1..1

canonical( Structure*De nition)

値

説明

Patient

Patient リソースであることを示す

http://jpfhir.jp/fhir/ePrescription
本リソースのプロファイルを識別する/StructureDe nition/JP̲Patient̲eP
URLrescriptionDataを指定する。値は固定。

0..1

Narrative

3.1

status1..1

code

generated

本リソースをテキストで表現したものを入れてもよい。
固定値。テキスト内容の全てがリソースのコンテンツから生成されたことを示す。

3.2

div

1..1

xhtml

<div

値は例示。

xmlns="http://www.w3.org/1999/ xhtml">xxx</div>
4identi er

0..1

Identi er

医療機関における患者番号。

*4.1

system1..1

urn:oid:1.2.392.100495.20.3.51.1付番方法については「9.1 識別子名前空間一覧」を参照。値は例示。OID の末尾は患者番号を付番した医療機関

4.2

value

1..1

1311234567
10

4.3

assigner

0..1

Reference (Organizat ion)

1..1string

1..1

HumanNa me

4.3.1
5

referen ce
name

患者番号の文字列。値は例示。
患者番号を付番した医療機関情報への参照。

urn:uuid:179f9f7f-e546-04c2-医療機関情報（Organization）への fullUrl。
6888-a9e0b24e5720

患者氏名 漢字表記*5.1

extensio n

1..1

Extension

氏名が漢字表記かカナ表記かを区別するための拡張「iso21090-EN-representation」。

*
5.1.1

url

1..1

uri

http:// 拡張を識別する URL。固定値。

5.1.2

valueC ode

1..1

code

hl7.org/fhir/StructureDe nition/is o21090-EN-representation
IDE
漢字表記であることを示す固定値。

1..1

code

o cial5.2

use

氏名が正式名称であることを明示するために、
NameUse バリューセット（http://string

東京 太郎

氏名全体の文字列を text 要素に入れる。氏名の姓と名が分離できない場合は本要素のみを使用する。姓と名の間に

5.4

family0..1

string

東京

氏名の姓。

fi

1..1

ffi

textfi

fi

fi

fifi

ffi

hl7.org/fhir/ValueSet/name-use）より「o cial」を必須で設定する。
5.3.

FHIR仕様(Patient) 変換後の定義文書#####表3 Patient リソース 患者情報
modulename Patient3; set status=$$No001(obj); set status=$$No002(obj); set status=$$No003(obj); set status=$$No004(obj); set status=$$No005(obj); set status=$$No007(obj); set status=$$No008(obj); set status=$$No009(obj); quit $$$OK; ;No001 resourceType 型=string 多重度=1..1 値="Patient" 固定値 ; Patient
No002 meta 多重度=1..1 call=No002001(1..1)
No002001 pro le 型=string 多重度=1..1* array 値="http://jpfhir.jp/fhir/ePrescription/StructureDe nition/JP̲Patient̲ePrescriptionData" 固定値 ; http://jpfhir.jp/fhir/ePrescription/StructureDe nition/
JP̲Patient̲ePrescriptionDataNo003 text 多重度=0..1 call=No003001(1..1),No003002(1..1)
No003001 status 型=string 多重度=1..1 値="generated" 固定値 ; generated
No003002 div 型=xhtml 多重度=1..1
No004 identi er 多重度=0..1* array call=No004001(0..1),No004002(0..1),No004003(0..1)
No004001 system 多重度=0..1
No004002 value 多重度=0..1
No004003 assigner 多重度=0..1 call=No004003001(1..1)
No004003001 reference 型=string 多重度=1..1 ; urn:uuid:179f9f7f-e546-04c2-6888-a9e0b24e5720
No005 name 多重度=1..1* array virtual call=No005A(1..1),No006(0..1)
virtual:No005A virtual:name 多重度=1..1* array call=No005001(1..1),No005002(1..1),No005003(1..1),No005004(0..1),No005005(0..1) ; 患者氏名漢字表記
No005001 extension 多重度=1..1* array call=No005001001(1..1),No005001002(1..1)
No005001001 url 型=string 多重度=1..1 値="http://hl7.org/fhir/StructureDe nition/iso21090-EN-representation" 固定値 ; http://hl7.org/fhir/StructureDe nition/iso21090-EN-representation
No005001002 valueCode 型=string 多重度=1..1 値="IDE" 固定値 ; IDE
No005002 use 型=code 多重度=1..1 ; o cial
No005003 text 型=string 多重度=1..1 ; 東京太郎
No005004 family 型=string 多重度=0..1 ; 東京
No005005 given 型=string 多重度=0..1* array ; 太郎
virtual:No006 virtual:name 多重度=0..1* array call=No006001(1..1),No006002(1..1),No006003(1..1),No006004(1..1),No006005(1..1)
No006001 extension 多重度=1..1 call=No006001001(1..1),No006001002(1..1)
No006001001 url 型=string 多重度=1..1 値="http://hl7.org/fhir/StructureDe nition/iso21090-EN-representation" 固定値 ; http://hl7.org/fhir/StructureDe nition/iso21090-EN-representation
No006001002 valueCode 型=string 多重度=1..1 値="SYL" 固定値 ; SYL
No006002 use 型=code 多重度=1..1 ; o cial
No006003 text 型=string 多重度=1..1 ; トウキョウタロウ
No006004 family 型=string 多重度=1..1 ; トウキョウ
No006005 given 型=string 多重度=1..1* array ; タロウ
No007 gender 型=code 多重度=1..1No008 birthdate 型=dateTime 多重度=1..1No009 address 多重度=0..1* array call=No009001(1..1),No009002(1..1),No009003(1..1)
No009001 text 型=string 多重度=1..1No009002 postalCode 型=string 多重度=1..1No009003 country 型=string 多重度=1..1 ; JPfi

fififfi

ffififiendFHIR仕様(Patient) IRISソース
FHIRrPRPatient3(obj,loopcnt) ;Copyright JapanDynaSystems Inc. Toshiaki Suzuki 2023
;表3 Patient リソース 患者情報
#include MMLinclude
new status;
set status=$$No001(.obj,loopcnt)
set status=$$No002(.obj,loopcnt)
set status=$$No003(.obj,loopcnt)
set status=$$No004(.obj,loopcnt)
set status=$$No005(.obj,loopcnt)
set status=$$No007(.obj,loopcnt)
set status=$$No008(.obj,loopcnt)
set status=$$No009(.obj,loopcnt)
quit $$$OK;;C No001 resourceType type 多重度=1..1xvalue 固定値 done

; Patient
No001(resourceTypeObj,loopcnt) ;new defPosition,element,retStatus,status, xvalue,getvalue,gettype, xtype,deftype,n,exit,jsonpos
set ModuleName="Patient3"
set defPosition="No001"
set element="resourceType"set retStatus=$$$OK
set deftype="string"set

xtype="string", xvalue="Patient"set gettype= xtype
set data= xvalue
do. if $g(%bool)=1 do kill %bool quit. . if data="true"

do resourceTypeObj.%Set("resourceType","1","boolean") kill data quit

. . if data="false"

do resourceTypeObj.%Set("resourceType","0","boolean") kill data quit

. if data=""do resourceTypeObj.%Set("resourceType","","null") kill data quit

. if $isvalidnum(data)=1 do resourceTypeObj.%Set("resourceType",+data,"number") kill data quit
. if $isvalidnum(data)=0 do resourceTypeObj.%Set("resourceType",data,"string") kill data quit

fi

fi

fi

fi

fi

fi

fi

quit retStatus

FHIR仕様(Patient) IRISソース;A No006003 text type 多重度=1..1 done; トウキョウタロウ
No006003(textObj,loopcnt) ;new defPosition,element,retStatus,status,gettype,getvalue,deftype,n,exit,jsonpos
set ModuleName="Patient3"
set defPosition="No006003"
set element="text"
set n=SP new SP set SP=n+1 set %parent(SP)=element
set n=PATH new PATH set PATH=n̲"/"̲element
set retStatus=$$$OK
set deftype="string"
set %st=$$No006003^FHIRrPRPatient3Utl(ModuleName,PATH,defPosition,element,deftype,loopcnt,.data) <--ここでMMLデータを取り出す
if %st=$$$NOTOK quit $$$NOTOKdo. if $g(%bool)=1 do kill %bool quit
. . if data="true"

do textObj.%Set("text","1","boolean") kill data quit

. . if data="false"

do textObj.%Set("text","0","boolean") kill data quit

. if data=""do textObj.%Set("text","","null") kill data quit

. if $isvalidnum(data)=1 do textObj.%Set("text",+data,"number") kill data quit
. if $isvalidnum(data)=0 do textObj.%Set("text",data,"string") kill data quit
quit retStatus;

シンプルなデモFHIR規格の調査で判明したこと対応がない項目（値）への対応をどうするか
処方箋番号等
マスタ利用への対応
JAMI標準用法コード（内服・経口・１日３回８時間毎、１日３回毎食後）等
変換プログラムの実装（文字列̶>code）
リソースへの分岐選択
例：分割処方、分割処方でないものでリソースが異なる
分岐条件を見つけれれるか
サーチパラメータへの対応
バージョンの付加、セキュリティアップの仕組みの導入 病院内だけ使うにはいいけど広域となると不十分では？
全ての実装はすぐにはできない
要請のあったサーチパラメータを優先実装することになるだろう
医療情報の統一ができれば応用が容易になる
医療情報ビッグデータの応用を考える時期に来ている参考資料

http://lh7.org/fhir/
数多くの資料がある。
https://www.mhlw.go.jp/content/12600000/000622524.pdf
HL7 FHIRに関する調査研究一式
最終報告書
令和2年3月株式会社富士通総研
今回の参照した資料
処方でつかっている患者情報を利用した
https://std.jpfhir.jp/stddoc/ePrescriptionDataFHIR̲v1x.pdf
処方情報 HL7FHIR記述仕様
第1版
日本医療情報学会
2021年10月