SDA-FHIR 変換
インターシステムズでは、データ変換言語 (DTL) を使用して SDA オブジェクトを HL7® FHIR® リソースに (またはその逆に) 変換することができます。SDA は、ある標準から別の標準へと簡単に移行できる中間の臨床形式です。例えば、HL7v2 を FHIR に直接変換するのではなく、HL7v2 を SDA に変換してから、SDA を FHIR に変換できます。SDA の詳細は、"SDA : インターシステムズの臨床データ形式" を参照してください。
双方向の SDA-FHIR 変換は、以下を含むさまざまなユース・ケースで役立つ機能を提供できます。
-
SDA 対応システムからコンテンツを取得して、FHIR システムに提供する
-
SDA 対応システムからコンテンツを取得して、FHIR リポジトリに保存する
-
複数の SDA 対応システムからコンテンツを取得して、FHIR システムで使用または保存するために正規化する
-
FHIR システムからコンテンツを取得して、SDA 対応システムに提供する
SDA と FHIR 間の変換は、FHIR R4 以前では利用できますが、FHIR R5 ではサポートされていません。
SDA オブジェクトを FHIR リソースに、またはその逆に変換する DTL 変換を起動するためのオプションは 2 つあります。つまり、組み込みのビジネス・プロセスを相互運用プロダクションに追加して DTL 変換を起動するか、カスタム・ビジネス・プロセスなどから変換 API を直接呼び出すかのいずれかです。
変換ビジネス・プロセス
組み込みのビジネス・プロセスを使用して、SDA から FHIR への変換プロダクションまたは FHIR から SDA への変換プロダクション内で SDA-FHIR 変換を起動できます。例えば、プロダクションでは、HL7 メッセージを利用し、ビジネス・プロセスを使用して HL7 を SDA に変換し、さらに組み込みの SDA-FHIR ビジネス・プロセスを使用して SDA を FHIR に変換できます。
組み込みのビジネス・プロセスで使用される基礎となる変換コードの詳細は、"変換 API" を参照してください。これらの API はカスタム・ビジネス・プロセスから直接呼び出すことができます。
SDA から FHIR への変換プロダクション
組み込みのビジネス・プロセスである HS.FHIR.DTL.Util.HC.SDA3.FHIR.ProcessOpens in a new tab は、プロダクションに追加して SDA オブジェクトやコンテナを FHIR バンドルに変換できます。このプロダクションは、Foundation ネームスペースに存在する必要があります。
プロダクションに追加したら、ビジネス・プロセスでは以下が可能になります。
-
SDA コンテナを入力として受け付けて、含まれる各オブジェクトをループする
-
SDA コンテナを FHIR BundleOpens in a new tab リソース形式の FHIR コンテンツに変換する
-
TargetConfigName 設定で指定されたビジネス・ホストに FHIR コンテンツを転送する
-
ビジネス・ホストから応答を受信する
-
応答 (受信した内容に基づく) を、最初にそれを呼び出したビジネス・ホストに返す
SDA から FHIR への変換プロダクションのビジネス・プロセスは HS.FHIR.DTL.Util.API.Transform.SDA3ToFHIROpens in a new tab クラスのメソッドを呼び出して変換を実行します。このクラスによる変換の処理方法の詳細は、"変換の詳細" を参照してください。
ビジネス・プロセスの追加
最初に、管理ポータルの [プロダクション構成] ウィンドウでプロダクションを開き、HS.FHIR.DTL.Util.HC.SDA3.FHIR.ProcessOpens in a new tab ビジネス・プロセスを追加します。追加したら、変換に影響を与えるビジネス・プロセスの設定を変更できます。ビジネス・プロセスの相互運用プロダクションへの追加方法の概要は、"InterSystems IRIS の基礎 : 相互運用プロダクションを使用したシステムの接続" を参照してください。
ビジネス・プロセスの設定
SDA から FHIR への変換に影響を与える HS.FHIR.DTL.Util.HC.SDA3.FHIR.ProcessOpens in a new tab の設定には、以下があります。
-
TargetConfigName — HS.FHIR.DTL.Util.HC.SDA3.FHIR.ProcessOpens in a new tab が出力を送信するビジネス・ホストを指定します。この設定は、[プロダクション構成] ウィンドウの [設定] タブの [基本設定] セクションにあります。
-
TransmissionMode — このビジネス・プロセスが追加処理のために FHIR バンドルを送信する方法を指定します。
-
transaction — このビジネス・プロセスは、リソースのバンドルを単一の相互作用で送信し、処理はバンドル全体を対象として成功または失敗します。1 つのリソースの処理に失敗した場合、その他のリソース (およびバンドル全体) の処理が停止します。これが既定値です。
-
individual — このビジネス・プロセスは、バンドルからの各リソースを専用の相互作用として個別に送信します。
この設定は、[プロダクション構成] ウィンドウの [設定] タブの [追加設定] セクションにあります。
-
-
FullTransactionResponse — 選択した場合、このプロセスが送信する FHIR 要求メッセージは、"PREFER" ヘッダの値が "return=representation" に設定されて作成されます。FHIR 仕様に基づき、このヘッダは、FHIR サーバに対して、作成または更新された各リソースを、保存されているまますべて (すなわち、サーバにより適用されたすべての変更を含む) 返す必要があることを示します。サーバが実際にこれを行うかどうかはサーバによります。一般に、この情報を要求すると FHIR サーバからの応答時間が増大する傾向があるため、この設定は、デバッグ中、または FHIR クライアントに作成/更新したリソースを受信するという特定のニーズがある場合を除き、チェックを付けないままにする必要があります。この設定は、[プロダクション構成] ウィンドウの [設定] タブの [追加設定] セクションにあります。
-
FHIRFormat — コンテンツが XML 形式と JSON 形式のどちらであるかを指定します。この設定は、[プロダクション構成] ウィンドウの [設定] タブの [追加設定] セクションにあります。
-
FormatFHIROutput — コンテンツを読みやすい形式にするかどうかを指定します。この設定を選択すると、パフォーマンスが影響を受けます。そのため、開発時およびテスト時にのみ有効にしてください。この設定は、[プロダクション構成] ウィンドウの [設定] タブの [追加設定] セクションにあります。
-
CallbackClass — 非推奨。
-
ValidResourceRequired — 非推奨。
-
OutputToQuickStream — 選択した場合、このビジネス・プロセスにより送信された FHIR ペイロードは HS.SDA3.QuickStream オブジェクトに配置され、QuickStream オブジェクトの ID は要求メッセージの QuickStreamId プロパティに配置されます。選択しないままにすると、変換からの FHIR 出力は、要求メッセージの Payload プロパティに配置されます。この設定は、[プロダクション構成] ウィンドウの [設定] タブの [追加設定] セクションにあります。
-
TransformClass — 変換を実行するクラスの名前を指定します。HS.FHIR.DTL.Util.API.Transform.SDA3ToFHIROpens in a new tab のサブクラスを作成して変換動作をカスタマイズする場合は、そのサブクラスの名前を指定する必要があります。
-
FHIRMetadataSet — パッケージに基づいて送信 FHIR のバージョンを指定します。使用可能なすべてのパッケージがドロップダウン・リストに表示されます。
-
FHIREndpoint — FHIR サーバのエンドポイントを指定します。この設定は、ビジネス・プロセスが送信 FHIR を HS.FHIRServer.Interop.Operation ビジネス・オペレーションを経由して FHIR サーバのサービスに送信する場合に必要です。
患者 ID の割り当て
HS.FHIR.DTL.Util.HC.SDA3.FHIR.ProcessOpens in a new tab に送信される SDA メッセージの AdditionalInfo プロパティを使用して、SDA-FHIR 変換で作成された Patient リソースに ID を割り当てることができます。SDA メッセージに PatientResourceId という AdditionalInfo 項目が含まれる場合、変換で PatientResourceId の値が取得され、生成された Patient リソースの ID フィールドに割り当てられます。
変換ビジネス・プロセスで使用される基礎となるクラス HS.FHIR.DTL.Util.API.Transform.SDA3ToFHIROpens in a new tab には、オーバーライドして Patient リソースを含むリソースに ID を割り当てることができるメソッドが含まれています。詳細は、"変換 API クラスのカスタマイズ" を参照してください。
メッセージ
HS.FHIR.DTL.Util.HC.SDA3.FHIR.ProcessOpens in a new tab への要求メッセージは、Ens.Container または HS.Message.XMLMessage です。
HS.FHIR.DTL.Util.HC.SDA3.FHIR.ProcessOpens in a new tab からの応答メッセージはありません。代わりに、成功または失敗のステータスを返します。
FHIR から SDA への変換プロダクション
組み込みのビジネス・プロセスである HS.FHIR.DTL.Util.HC.FHIR.SDA3.ProcessOpens in a new tab は、プロダクションに追加して FHIR リソースやバンドルを SDA オブジェクトやコンテナに変換できます。このプロダクションは、Foundation ネームスペースに存在する必要があります。
プロダクションに追加したら、ビジネス・プロセスでは以下が可能になります。
-
FHIR のリソースまたはバンドルを入力として受け付ける
-
FHIR コンテンツを SDA コンテナに変換する
-
TargetConfigName 設定で指定されたビジネス・ホストにそのコンテナを転送する
-
ビジネス・ホストから応答を受信する
-
FHIR の応答 (受信した内容に基づく) を、最初にそれを呼び出したビジネス・ホストに返す
SDA から FHIR への変換プロダクションのビジネス・プロセスは HS.FHIR.DTL.Util.API.Transform.FHIRToSDA3Opens in a new tab クラスのメソッドを呼び出して変換を実行します。このクラスによる変換の処理方法の詳細は、"変換の詳細" を参照してください。
ビジネス・プロセスの追加
最初に、管理ポータルの [プロダクション構成] ウィンドウでプロダクションを開き、HS.FHIR.DTL.Util.HC.FHIR.SDA3.ProcessOpens in a new tab ビジネス・プロセスを追加します。追加したら、変換に影響を与えるビジネス・プロセスの設定を変更できます。ビジネス・プロセスの相互運用プロダクションへの追加方法の概要は、"機能紹介 : 相互運用プロダクションを使用したシステムの接続" を参照してください。
ビジネス・プロセスの設定
FHIR から SDA への変換に影響を与える HS.FHIR.DTL.Util.HC.FHIR.SDA3.ProcessOpens in a new tab の設定には、以下があります。
-
TargetConfigName — DTL 変換により FHIR から変換された後、SDA3 ストリームを含む XMLMessage が送信されるビジネス・ホストを指定します。この設定は、[プロダクション構成] ウィンドウの [設定] タブの [基本の設定] セクションにあります。
-
CallbackClass — 非推奨。
-
OutputToQuickStream — 既定で、HS.FHIR.DTL.Util.HC.FHIR.SDA3.ProcessOpens in a new tab の出力は、DTL 変換により生成される SDA3 ストリームを含む HS.Message.XMLMessageOpens in a new tab オブジェクトです。この設定にチェックが付いている場合、SDA3 ストリームは個別の HS.SDA3.QuickStreamOpens in a new tab オブジェクトに配置され、QuickStream オブジェクトの QuickStreamID は XMLMessage の AdditionalInfoItem プロパティに配置されます。この設定が選択されていない場合、SDA3 ストリームは XMLMessage の ContentStream プロパティに配置されます。この設定は、[プロダクション構成] ウィンドウの [設定] タブの [追加の設定] セクションにあります。
-
TransformClass — 変換を実行するクラスの名前を指定します。HS.FHIR.DTL.Util.API.Transform.FHIRToSDA3Opens in a new tab のサブクラスを作成して変換動作をカスタマイズする場合は、そのサブクラスの名前を指定する必要があります。
-
FHIRMetadataSet — パッケージに基づいて受信 FHIR のバージョンを指定します。使用可能なすべてのパッケージがドロップダウン・リストに表示されます。
変換 API
アプリケーションは、SDA から FHIR への変換 API および FHIR から SDA への変換 API の両方にアクセスできます。
SDA から FHIR への変換 API
SDA から FHIR に変換するためにコードで使用する API は、HS.FHIR.DTL.Util.API.Transform.SDA3ToFHIROpens in a new tab にあります。アプリケーションは、SDA が %Stream.ObjectOpens in a new tab と SDA オブジェクトのどちらに存在するのかに応じて、TransformStream() または TransformObject() メソッドを呼び出すことができます。
これらのメソッドはどちらも、その bundle プロパティに FHIR 出力を含む変換オブジェクト (HS.FHIR.DTL.Util.API.Transform.SDA3ToFHIROpens in a new tab) を返します。また、そのタイプは %DynamicObject です。このバンドルには、変換によって生成されたすべてのリソース (すべての参照は解決済み) が含まれます。
コードに以下のコードを追加することで、ダイナミック・オブジェクトから JSON または XML まで、この bundle プロパティをシリアル化できます。これは、SDA3ToFHIRObject が、いずれかの変換メソッドから返される変換オブジェクトであることを前提としています。
Set stream = ##class(%Stream.TmpCharacter).%New()
Set metadataSetKey = "R5"
If format="JSON"
{
Do SDA3ToFHIRObject.bundle.%ToJSON(stream)
}
ElseIf format="XML"
{
Set schema = ##class(HS.FHIRServer.Schema).LoadSchema(metadataSetKey)
Do ##class(HS.FHIRServer.Util.JSONToXML).JSONToXML(SDA3ToFHIRObject.bundle, stream, schema)
}
Do stream.Rewind()
TransformStream メソッドの使用法
HS.FHIR.DTL.Util.API.Transform.SDA3ToFHIROpens in a new tab の TransformStream() メソッドは、%Stream として SDA を取得し、それを FHIR バンドルに変換します。そのシグニチャは、以下のとおりです。
ClassMethod TransformStream(stream As %Stream.Object,
SDAClassname As %String,
fhirVersion As %String,
patientId As %String = "",
encounterId As %String = "") {}
パラメータ :
-
stream — SDA オブジェクトまたはコンテナの %Stream 表現。
-
SDAClassname — ストリームに含まれるオブジェクトのクラス名 (HS.SDA3.Container など)。
-
fhirVersion — 変換によって生成される FHIR のバージョン。STU3 や R5 など。
-
patientId — このオプションのパラメータを指定した場合、生成された Patient リソースの Id フィールドに指定された値が入ります。
-
encounterId — このオプションのパラメータを指定した場合、生成された Encounter リソースの Id フィールドに指定された値が入ります。stream パラメータが SDA コンテナである場合、このパラメータは無視されます。これは、コンテナには、複数の Encounter を含めることができるので、どの FHIR Encounter に指定のリソース ID を付与するのか判断できないためです。
TransformObject メソッドの使用法
HS.FHIR.DTL.Util.API.Transform.SDA3ToFHIROpens in a new tab の TransformObject() メソッドは、コンテナやオブジェクト・クラスとして SDA を取得し、それを FHIR バンドルに変換します。そのシグニチャは、以下のとおりです。
ClassMethod TransformObject(source,
fhirVersion As %String,
patientId As %String = "",
encounterId As %String = "") {}
パラメータ :
-
source — FHIR に変換される SDA コンテナまたは SDA オブジェクト・クラス。
-
fhirVersion — 変換によって生成される FHIR のバージョン。STU3 や R4 など。
-
patientId — このオプションのパラメータを指定した場合、生成された Patient リソースの Id フィールドに指定された値が入ります。
-
encounterId — このオプションのパラメータを指定した場合、生成された Encounter リソースの Id フィールドに指定された値が入ります。stream パラメータが SDA コンテナである場合、このパラメータは無視されます。これは、コンテナには、複数の Encounter を含めることができるので、どの FHIR Encounter に指定の ID を付与するのか判断できないためです。
変換の詳細
以下に SDA から FHIR への変換の既定の動作を説明します。オーバーライドして変換動作をカスタマイズできるメソッドの概要は、"オーバーライド可能な SDA から FHIR への変換メソッド" を参照してください。
-
受信ストリームまたはオブジェクトは個々のストリームレットに分割され、それらが FHIR リソースに変換されます。
-
既定では、UUID が生成され、Bundle リソースの fullUrl フィールドに割り当てられます。この場合、リソース自体には Id はありません。リソース ID を提供する場合は、GetId メソッドをオーバーライドします。この場合、fullUrl の値は baseURL/resourceType/id で、リソース参照は resourceType/id になります。
-
これらのメソッドは、既定では受信 URL を一切変更しません。この動作を GetBaseURL() メソッドでオーバーライドできます。例えば、特定のリポジトリにポストする場合、そのリポジトリの URL 接頭語を指定できます。
-
ID を割り当てるために使用されたメカニズムに関係なく、リソースには他のリソースへの参照が含まれます。
-
Patient および Encounter のストリームレットを使用して、利用可能なすべてのリソースに Patient および Encounter の参照が追加されます。Encounter の参照は、SDA ストリームレットの EncounterNumber フィールドが使用されている場合にのみ、正常に作成できます。これらが空の場合、参照は生成されません。
-
Organization、Practitioner、Medication などの共有リソースの場合、各リソースの先頭 32 キロバイトのハッシュがハッシュ・テーブルに追加されます。それ以降の各共有リソースは、直接一致するものをハッシュ・テーブルで検索することで、重複がないかどうかが確認されます。一致が見つかった場合、リソースは重複としてマークされます。この動作は、IsDuplicate() メソッドをオーバーライドすることにより変更できます。
-
各リソースは、バンドルに追加される前に検証されます。リソースが検証に失敗すると、エラーがスローされ、処理が停止します。つまり、バンドルは返されません。この既定の動作は、HandleInvalidResource() メソッドをオーバーライドすることにより変更できます。
-
1 つ以上の SDA プロパティがターゲット・スキーマの FHIR リソース・フィールドにマップされない場合は、変換により、SDA データが FHIR 拡張にマップされます。詳細は、"FHIR 拡張" を参照してください。
-
特定の SDA オブジェクトやプロパティがターゲットの FHIR リソースやフィールドにマップされる方法の詳細は、"SDA-FHIR マッピングの理解" を参照してください。
FHIR から SDA への変換 API
FHIR から SDA に変換するためにコードで使用する API は、HS.FHIR.DTL.Util.API.Transform.FHIRToSDA3Opens in a new tab にあります。このクラスには、ユース・ケースに応じて、FHIR から SDA への変換に使用できる複数の API が含まれています。
ほとんどの場合、アプリケーションで単一の FHIR リソースまたはバンドルの変換が必要な際には、FHIR が %Stream.ObjectOpens in a new tab とダイナミック・オブジェクトのどちらに存在するのかに応じて、TransformStream() または TransformObject() クラス・メソッドを呼び出す必要があります。ただし、連続して複数の FHIR バンドルやリソースを変換する場合は、変換クラスを一旦インスタンス化してから、Transform() メソッドを複数回呼び出すと、より効率的です。
これらの変換メソッドはすべて、その container プロパティに SDA 出力を含む変換オブジェクト (HS.FHIR.DTL.Util.API.Transform.FHIRToSDA3Opens in a new tab) を返します。また、そのタイプは HS.SDA3.ContainerOpens in a new tab です。変換オブジェクトの object プロパティには、変換によって最後に生成された SDA コンテナまたはオブジェクトが含まれます。最後の入力がバンドルの場合は、object プロパティは SDA コンテナになります。最後の入力が個々のリソースである場合は、object は SDA オブジェクトになります。
TransformStream メソッドの使用法
HS.FHIR.DTL.Util.API.Transform.FHIRToSDA3Opens in a new tab の TransformStream() メソッドは、%Stream として表現される FHIR リソースやバンドルを取得し、それを SDA コンテナに変換します。FHIR バンドルがメソッドに渡される場合にのみ、リソース参照は処理されます。そのシグニチャは、以下のとおりです。
ClassMethod TransformStream(stream As %Stream.Object,
fhirVersion As %String,
fhirFormat As %String) {}
パラメータ :
-
stream — FHIR リソースまたはバンドルの %Stream 表現。
-
fhirVersion — 変換される FHIR リソースまたはバンドルのバージョン。"STU3" や "R4" など。
-
fhirFormat — FHIR リソースまたはバンドルの形式を指定します。許容値は "JSON" と "XML" です。
TransformObject メソッドの使用法
HS.FHIR.DTL.Util.API.Transform.FHIRToSDA3Opens in a new tab の TransformObject() メソッドは、ダイナミック・オブジェクトとして FHIR リソースやバンドルを取得し、それを SDA コンテナに変換します。バンドルがメソッドに渡される場合にのみ、リソース参照は処理されます。そのシグニチャは、以下のとおりです。
ClassMethod TransformObject(source As %DynamicObject,
fhirVersion As %String) {}
パラメータ :
-
source — ダイナミック・オブジェクトとして表現される FHIR リソースまたはバンドル。
-
fhirVersion — 変換される FHIR リソースまたはバンドルのバージョン。"STU3" や "R4" など。
Transform メソッドの使用法
HS.FHIR.DTL.Util.API.Transform.FHIRToSDA3Opens in a new tab の Transform() メソッドは、ダイナミック・オブジェクトとして FHIR バンドルを取得し、それを SDA コンテナに変換します。バンドルがメソッドに渡される場合にのみ、リソース参照は処理されます。
Transform() は、FHIR を SDA に変換するクラス・メソッドによって呼び出されるメソッドです。連続して複数の FHIR リソースを変換する場合に直接呼び出すことができるので、HS.FHIR.DTL.Util.API.Transform.FHIRToSDA3Opens in a new tab オブジェクトを毎回インスタンス化する必要はありません。例えば、以下のコードでは、同一の変換オブジェクトを使用して、Patient リソース、Encounter リソース、および Observation リソースを変換します。
set r4schema = ##class(HS.FHIRServer.Schema).LoadSchema("R4")
set transformer = ##class(HS.FHIR.DTL.Util.API.Transform.FHIRToSDA3).%New(r4Schema)
do transformer.Transform(patient)
do transformer.Transform(encounter)
do transformer.Transform(Observation)
Transform() メソッドのシグニチャは次のとおりです。
ClassMethod Transform(source As %DynamicObject) {}
パラメータ :
-
source — ダイナミック・オブジェクトとして表現される FHIR リソースまたはバンドル。
変換の詳細
以下に、FHIR から SDA への変換の既定の動作の概要を示します。オーバーライドして変換動作をカスタマイズできるメソッドの概要は、"オーバーライド可能な FHIR から SDA への変換メソッド" を参照してください。
-
受信 FHIR バンドルは個々のリソースに分割され、それらが SDA3 ストリームレットに変換されます。
-
受信 FHIR バンドル内で別のリソースによって参照されているリソースがバンドルに存在しない場合、バンドルの変換は続行されます。この動作を変更するには、HandleMissingResource() メソッドをオーバーライドします。
-
参照をオブジェクトに変換しようとしても、以下の場合には、SDA ストリームレットにオブジェクトは作成されません。
-
サブ変換が存在するが、マッピングがあるどの要素についても、参照されているリソースに値がない。
-
参照されているリソース・タイプから SDA3 オブジェクトのデータ型へのサブ変換がない。
-
-
Encounter ストリームレットの EncounterNumber フィールドは 1 から入力され、Encounter が処理されるたびに増やされます。Encounter リソースを参照する以降のリソースは、SDA3 への変換時に、リソース ID に基づいてルックアップを実行し、使用すべき Encounter 番号を特定します。Encounter 番号の割り当ては、GetIdentifier() メソッドでオーバーライドできます。変換されるリソースのコンテンツにアクセスすると、返すべき EncounterNumber の決定に役立ちます。インスタンス・プロパティ %currentReference には、ダイナミック・オブジェクトとしてリソースを取得するために、インスタンス・メソッド GetResourceFromReference() に渡すことができる FHIR 参照オブジェクトが含まれています。
-
Encounter 番号と同じように、HealthConcern リソースと Goal リソースの ExternalID の値も、既定では 1 から入力されます。この動作は、GetIdentifier() メソッドでオーバーライドできます。
-
SDA Container:SendingFacility プロパティの値は次のように設定されます。Patient の managingOrganization フィールドに Organization への参照が含まれており、その Organization が Bundle に存在する場合は、それが使用されます。そうでない場合は、患者識別子で MRN と割り当て機関が検索され、その割り当て機関が使用されます。いずれの項目も見つからない場合は、文字列 FHIR が使用されます。この動作は、GetSendingFacility() メソッドでオーバーライドできます。
-
SDA3 拡張は使用されません。SDA3 にフィールドが存在しない場合、その内容は削除されます。
-
Patient リソースなしでバンドルを受信した場合、エラーがスローされます。それ以外には、コンテナに対して検証は実行されません。単に、受信したままの状態で返されます。
-
包含関係に関する情報を確認するには、Bundle リソースの管理ポータルで FHIR アノテーション ([Health]→[FHIR アノテーション]) を参照します。
-
特定の FHIR リソースまたはフィールドが SDA オブジェクトやプロパティにマップされる方法の詳細は、"SDA-FHIR マッピングの理解" を参照してください。
SDA-FHIR マッピングの理解
SDA-FHIR 変換を実行するために変換 API と組み込みのビジネス・プロセスのどちらを使用するにしても、FHIR アノテーション・ツールを使用すると、SDA または FHIR データが目的の形式にどのように変換されたのかについて正確に把握することができます。このツールでは、特定の FHIR リソースにマップされた SDA オブジェクト (またはその逆) の概要を確認できると同時に、マッピングをドリルダウンして、SDA オブジェクトのプロパティがどのようにして FHIR リソースのフィールドに取り込まれたか (またはその逆) について正しく把握できます。FHIR アノテーション・ツールを使用する場合、SDA プロパティはフィールドとして参照されます。例えば、マッピングはプロパティとフィールドではなく、フィールドとフィールドとして参照されます。また、ルックアップ・テーブルを使用して SDA と FHIR 間でコードをマップする方法について調べ、変換に関わるデータ型について学習し、変換に使用された ObjectScript メソッドを検出することもできます。
マッピングの背後にあるロジックを把握するには、"マッピング規則" を参照してください。
FHIR アノテーション・ツールへのアクセス
FHIR アノテーション・ツールにアクセスするには、以下の手順に従います。
-
管理ポータルに %Ens_EDISchemaAnnotations ロールを持つユーザとしてログインします。
-
[Health]→[MyFHIRnamespace] に移動します。
-
[スキーマ・ドキュメント] メニュー・オプションを展開して、[FHIR アノテーション] をクリックします。
マッピングの調査を開始するには、[マッピングまたは情報] ドロップダウン・リストを使用して、変換元と変換先を選択します。例えば、SDA3 から FHIR R4 へのマッピングが目的の場合は、[SDA3 —> FHIR4] を選択します。

FHIR アノテーション・ツールを使用して SDA-FHIR マッピングを調べるときには、[ヘルプ] ボタンと [FAQ] ボタンを選択すると、ツールのユーザ・インタフェースの使用および解釈方法についてのガイダンスが表示されます。また、ユーザ・インタフェースの多くの要素について、カーソルを合わせると情報が表示されます。
マッピングの概要
特定のマッピング (フィールド間マッピングなど) の詳細にまでドリルダウンする前に、SDA オブジェクトと FHIR リソース間のすべてのマッピングの概要を入手しておくと役に立つ場合があります。オブジェクトとリソース相互のマッピング方法のリストを表示するには、[変換された <transform> をリスト] を選択します。

マッピングの詳細
特定の SDA オブジェクトまたは FHIR リソースがどのように目的の形式にマップされているのか詳しく知りたい場合は、ドロップダウン・リストから該当のオブジェクトまたはリソースを選択できます。例えば、Appointment リソースの SDA3 へのマッピングを表示するには、[名前別の FHIR4] ドロップダウン・リストから [Appointment] を選択します。

各マッピングは、SDA フィールドと FHIR フィールド間のマッピング、ソース・フィールドのカーディナリティ、ソース・フィールドのデータ型、およびその他の有用な情報をすべて表示するテーブルに表示されます。テーブルの要素の詳細を確認するには、以下のようにします。
-
テーブルの各要素の上にカーソルを移動して、追加情報を取得します。
-
[アクション] 列のアイコンなどのリンクをクリックして、要素の詳細を開きます。例えば、データ型をクリックして、そのデータ型のマッピング方法を調べることができます。
-
[マッピング定義] アイコン (
) をクリックして、マッピングの技術的詳細まで掘り下げます。[マッピング定義] が開いたら、FHIR データ型をクリックして、正式な FHIR 仕様で表示することができます。また、マッピングで使用されるカーディナリティ、既定値、サブ変換やクラス・メソッドなどの技術的詳細も表示できます。場合によっては、マッピングの説明を補足するその他のメモもあります。
以下は、マッピング・テーブルの [アクション] 列にあるアイコンの凡例です。
アイコン | 意味 |
---|---|
![]() |
マッピング定義の詳細を表示します。 |
![]() |
サブ変換またはクラス・メソッドを使用します。 |
![]() |
このフィールドの設定条件を使用して、マッピングの使用を制御します。 |
![]() |
FHIR 拡張をターゲットとして使用します。 |
![]() |
ソースに見つからないまたは無効なデータが含まれている場合は、既定値がターゲットに割り当てられます。 |
![]() |
マッピングが使用されている場合は、変換により、新しいターゲット・オブジェクトが作成されるのではなく、既存のターゲット・オブジェクトにデータが追加されます。 |
![]() |
FHIR リソース・フィールドのサブフィールドのマッピングを表示します。 |
ルックアップ・テーブルのマッピング
FHIR アノテーション・ツールでは、SDA と FHIR 間でコードをマップするルックアップ・テーブルを表示できます。例えば、HS.SDA3.AlertOpens in a new tab オブジェクトの Status プロパティにあるコード A は、FHIR event-status 値セットの in-progress コードにマップされていることがわかります。ソースからターゲットへのコードのマップに使用されるルックアップ・テーブルを調べるには、[<transform> ルックアップ・テーブルの表示] を選択します。
![アノテーション・ツールの [<transform> ルックアップ・テーブルの表示] ボタン](images/view_lookup.png)
ルックアップ・テーブルをカスタマイズするには、"ルックアップ・テーブルのカスタマイズ" を参照してください。
マッピング規則
このセクションでは、SDA-FHIR マッピングの背後にあるロジックについて説明します。
フィールド間マッピング
ほとんどのマッピングはフィールド間のマッピングです。マッピングによってソース・フィールドでデータ値を見つけ、その値をターゲット・フィールドに割り当てます。例えば、SDA プロパティの値は FHIR フィールドに割り当てられます。
条件付きマッピング
一部のフィールド間マッピングは条件付きです。特定の条件が満たされた場合にのみ、値がターゲット・フィールドに割り当てられます。この情報を提示する場合、FHIR アノテーション・ツールに [このフィールドの設定条件] というラベルが表示されます。DTL の <if> 要素により、これをコード内で制御します。
リテラル値
定義済みマッピングの中には、リテラル値からターゲット・フィールドへのマッピングがあります。これらのマッピングの目的の 1 つは、ターゲットで必要なデータを提供できるフィールドがソース・オブジェクト定義に含まれない場合に、必要なターゲット・フィールドの値を提供することです。
多くの場合、このタイプのマッピングは条件付きで定義され、必要時にのみ使用されます。
除外されるフィールド
臨床的な意義がないメタデータを含む SDA フィールドは、FHIR フィールドにマップされません。例えば、UpdatedOn プロパティは FHIR に変換されません。
また、クラス・リファレンス内で使用されていませんとマークされている SDA フィールドは、FHIR に変換されません。例えば、LabResultItem の ExternalId プロパティは、Observation リソースのフィールドにマップされません。
単一値からリストへのマッピング
ソース・フィールドが単一値であるのにターゲット・フィールドがリストの場合、ソース項目は、変換により、ターゲット・リストの最初のエントリにマップされます。変換後、リストには 1 つのエントリのみが含まれます。 この機能は、変換用コードの生成中に自動的に処理されます。単一値からリストへの場合、マッピング定義に特別な注意は必要ありません。
リストから単一値へのマッピング (値)
ソース・フィールドが値のリストで、ターゲット・フィールドが単一値に制限されている場合、変換により、値のリストは、リストの各値をセミコロンとスペースで区切った 1 つの値に連結されます。
リストから単一値へのマッピング (オブジェクト)
SDA から FHIR の場合 : 受信 SDA がオブジェクトのリストで、ターゲット FHIR のオブジェクトが 1 つのみである場合、マッピング・テーブルには、ソース・リスト・フィールドに対するマッピング・エントリが 2 つ含まれます。
-
一方のマッピングは、ソース・リスト・フィールドをターゲットの単一値フィールドにマップします。このマッピングから生成される変換は、単に最初のリスト・エントリをターゲット・フィールドに配置します。
-
もう一方のマッピングでは、オブジェクトの完全リストを格納するターゲット FHIR 拡張にソース・リスト・フィールドをマップします。FHIR 拡張の URL は完全なソース・フィールド名です。これはリソース名を含みますが、ハイフンで区切ったすべて小文字のテキストを使用します。
FHIR から SDA の場合 : 受信 FHIR にオブジェクトのリストがあり、SDA のオブジェクトが 1 つである場合、変換では最初のオブジェクトが使用され、他はすべて削除されます。
SDA CodeTableDetail の FHIR コードへのマッピング
変換により、SDA CodeTableDetail (またはそのサブクラスの 1 つ) は、以下のように Coding や CodeableConcept などの FHIR コード化オブジェクトにマップされます。
-
Code 値は code フィールドに割り当てられます。
-
Description は display フィールドに割り当てられます。
-
OriginalText フィールドが存在する場合は、text フィールドにマップされます。
ルックアップ・テーブルを使用したコード値の FHIR へのマッピング
マッピングは、ルックアップ・テーブルを参照して、このマッピングにおいてソース・スキーマ (SDA または FHIR) のコード値をターゲット・スキーマ (FHIR または FHIR DSTU2) のコード値にマップするエントリを見つけます。
マッピングでルックアップ・テーブルが見つからない場合、またはルックアップ・テーブルに一致エントリが見つからず、空以外の既定値が定義されている場合、既定値がコード・フィールドに適用されます。それ以外の場合、ターゲットはこのマッピングから値を受け取りません。
マッピングが SDA から FHIR で、ソース・フィールドに空以外の値が含まれる場合は、規約により、このソース・フィールドに対してマッピング・エントリが 2 つ存在します。両方のエントリは、同じ [このフィールドの設定条件] に従って実行されます。
-
一方のエントリは、ルックアップを実行して、ターゲット・フィールドに割り当てる値を取得します。
-
もう一方は、元のソース・フィールドの値を文字列値の FHIR 拡張に格納します。
どちらの場合も、Description または OriginalText が Code 値と共に存在する場合、可能であれば FHIR にマップされます。
FHIR コードの SDA CodeTableDetail へのマッピング
FHIR プリミティブ・コードまたはコード化オブジェクト (Coding、CodeableConcept など) がコード値を FHIR から SDA に変換するためにルックアップを使用しない場合、以下のように SDA CodeTableDetail (またはそのサブクラスの 1 つ) に変換されます。
-
CodeableConcept.text は HS.SDA3.CodeTableTranslated.OriginalText に変換されます。
-
CodeableConcept.coding.display (または Coding.display) は HS.SDA3.CodeTableDetail.Description に変換されます。
-
CodeableConcept.coding.code (または Coding.code、あるいは単に code) は HS.SDA3.CodeTableDetail.Code に変換されます。
-
CodeableConcept.coding.system (または Coding.system) の GetCodeforURI は HS.SDA3.CodeTableDetail.SDACodingStandard に変換されます。
-
CodeableConcept.coding.version (または Coding.version) は HS.SDA3.CodeTableDetail.CodeSystemVersionId に変換されます。
ルックアップ・テーブルを使用した FHIR コード値の SDA へのマッピング
FHIR から SDA 用のコード・ルックアップ・テーブルをマッピングに使用したい場合、マッピング・テーブルにソース・フィールドのマッピング・エントリが 2 つ含まれています。
-
2 つのエントリの一方は、ルックアップ・テーブルを参照して、FHIR のコード値を SDA の Code にマップするエントリを見つけます。
-
このペアのもう一方のマッピング・エントリは、ルックアップ・テーブルのエントリが利用できないか一致を提供しない場合に処理を引き継ぎます。このエントリは、前述のようにソースの FHIR コード値 (変更なし) を SDA の CodeTableDetail オブジェクトにマップします。つまり、FHIR の code が Coding オブジェクトまたは CodeableConcept オブジェクトの内部にある場合は、FHIR の code、display、system、version、および text の値はすべて SDA CodeTableDetail フィールドに適切にマップされます。
SDACodingStandard のマッピング
変換で、SDA オブジェクトの SDACodingStandard プロパティが検出されると、SDACodingStandard 値が OID レジストリに存在するかが確認され、以下のいずれかが実行されます。
-
SDACodingStandard 値が URL を含む OID レジストリのエントリである場合は、変換により、FHIR Coding リソースの system フィールドがその URL に設定されます。
-
SDACodingStandard 値が URL を定義していない OID レジストリのエントリである場合は、変換により、FHIR Coding リソースの system フィールドがその OID に設定されます。
-
SDACodingStandard 値が OID レジストリのエントリでない場合は、変換により、FHIR 拡張に値が保存されます。
文字列値の数値へのマッピング
ターゲットが FHIR で、文字列値が数値にマップされている場合、文字列に単位や命令などの非数値テキストが含まれることがあります。これを処理するため、ソース・リスト・フィールドに以下の 2 つのマッピング・エントリがあります。
-
2 つのエントリの一方は常に、ソース文字列値を、1 つの文字列値フィールドで構成される FHIR 拡張に割り当てます。
-
もう一方のマッピング・エントリは、ソース文字列値をテストして数値かどうかを確認します。数値であれば、この数値をターゲットの数値フィールドにマップします。
FHIR コード・オブジェクトのマルチパート・リテラル値
Coding オブジェクトまたは CodeableConcept オブジェクトである一部の FHIR ターゲット・フィールドでは、リテラル値からの一連のマッピングにより、必要に応じてフィールドに割り当てられるマルチパート値が形成されます。このようなオブジェクトが格納できるフィールドの完全なセットは、code、system、display、text、version、および userSelected です。
これに該当する場合、このコードが、マルチパート・リテラル値を受け取る Coding オブジェクトまたは CodeableConcept オブジェクト内に存在することが、code フィールドの DTL アノテーション要素で説明されます。このコードに関連するリテラル値マッピングのセットはすべて、[このフィールドの設定条件] で同じ値を持つことが [FHIR アノテーション] に示されます。
FHIR 拡張へのマッピング
変換ターゲットが FHIR である場合、1 つ以上の SDA プロパティがターゲットの FHIR スキーマ内に対応するフィールドを持っていないことがあります。その場合、変換により、SDA データは FHIR 拡張にマップされます。この拡張の URL 接頭語は http://intersystems.com/fhir/extn/sda3/lib です。完全 URL は完全な SDA プロパティ名です。これはリソース名を含みますが、ハイフンで区切ったすべて小文字のテキストを使用します。
例えば、SDA プロパティ HS.SDA3.Administration:AdministeredAmount の FHIR 拡張は次のようになります。
-
拡張名 : administration-administered-amount
-
FHIR 拡張の完全な URL : http://www.intersystems.com/fhir/extn/sda3/lib/administration-administered-amount
SDA CustomPairs のマッピング
変換では、タイプ HS.SDA3.SuperClassOpens in a new tab の SDA クラスの古い CustomPairs プロパティがサポートされます。
CustomPairs はタイプ HS.SDA3.NVPairs のオブジェクトのコレクションで、そのそれぞれに 2 つのプロパティ Name と Value があります。変換コードが顧客の SDA データ内でこのプロパティを検出し、ターゲットが FHIR である場合、Parameters リソースを格納する FHIR 拡張にコレクションはマップされます。この Parameters リソースは、ペアになったフィールド name と valueString のコレクションです。
以下の例では、カスタマイズされた SDA Encounter オブジェクトに、3 つのメンバを持つ SDA CustomPairs コレクションがあり、それぞれに PlanOfCareInstructionsText という名前が付いています。
{ "resourceType": "Encounter", "contained": [ { "resourceType": "Parameters", "id": "63", "parameter": [ { "name": "PlanOfCareInstructionsText", "valueString": "Doctor recommends at least 30 minutes of exercise per day" }, { "name": "PlanOfCareInstructionsText", "valueString": "Use sports heart rate monitor to aid in monitoring effort level" }, { "name": "PlanOfCareInstructionsText", "valueString": "Read \"South Beach Diet\"" } ] } ], "extension": [ { "url": "http://intersystems.com/fhir/extn/sda3/lib/encounter-custom-pairs", "valueReference": { "reference": "#63" } } ], "id": "914" }
変換のカスタマイズ
SDA-FHIR 間の各変換では、データ変換言語 (DTL) クラスを使用して、SDA オブジェクトを FHIR リソース (またはその逆) にマップします。DTL エディタを使用して、これらの DTL をカスタマイズできます。
より高度なカスタム変換動作を実装したい場合は、適切な変換 API クラスのサブクラスを作成し、そのメソッドをオーバーライドします。詳細は、"変換 API クラスのカスタマイズ" を参照してください。従来の FHIR の実装から新しいカスタマイズ・アーキテクチャへのアップグレードの詳細は、"従来の変換のアップグレード" を参照してください。
インターシステムズ製品はまた、変換で使用されるルックアップ・テーブルをカスタマイズするメカニズムも提供します。
各ネームスペースで異なるカスタマイズができるよう、インスタンス全体に対してではなく、特定のネームスペース内で変換をカスタマイズします。複数のネームスペースが同じようにカスタマイズした変換を持つようにするには、各ネームスペースでカスタマイズ・プロセスを繰り返す必要があります。
カスタム DTL の実装
SDA から FHIR に (またはその逆に) 変換するために使用される DTL をカスタマイズするストラテジには、標準 DTL のコピーの作成とその変更が含まれます。カスタム DTL のパッケージを手動で指定すると、変換により、標準の DTL ではなく、カスタム DTL が自動的に選択されます。
カスタム DTL のパッケージの指定
DTL をカスタマイズする前に、カスタマイズされるすべての DTL クラスのための単一のパッケージを指定する必要があります。クラス・パッケージには HS.Local.FHIR.DTL という名前を付けることをお勧めします。すべてのカスタム DTL に使用されるパッケージを決定したら、InterSystems ターミナルを使用して、このパッケージを指定する必要があります。カスタム DTL パッケージを指定するには、以下の手順に従います。
-
InterSystems ターミナルを開きます。
-
SDA-FHIR 変換を含むネームスペースに移動します。例を以下に示します。
set $namespace = "Myfhirnamespace"
-
カスタム DTL パッケージが既に存在しているかどうかを確認するには、以下のように入力します。
Write ##class(HS.FHIR.DTL.Util.API.ExecDefinition).GetCustomDTLPackage()
-
カスタム DTL パッケージがまだ存在しない場合は、以下のコマンドを入力します。HS.Local.FHIR.DTL はカスタム DTL パッケージの名前に置き換えます。
set status = ##class(HS.FHIR.DTL.Util.API.ExecDefinition).SetCustomDTLPackage("HS.Local.FHIR.DTL")
-
パッケージが正常に定義されたことを確認するには、以下のように入力します。
write status
応答は 1 になります。
カスタム DTL の作成
既存の標準の DTL のコピーを保存してから編集し、カスタム DTL を作成します。変換する際に、標準の DTL ではなく、カスタムの DTL を使用することがわかるように、カスタム DTL のパッケージと名前は名前付け標準に準拠する必要があります。カスタム DTL を作成するには、以下の手順に従います。
-
管理ポータルを開き、FHIR ネームスペースに移動します。
-
[相互運用性]→[リスト]→[データ変換] の順に選択します。
-
カスタマイズする変換の名前を見つけます。例えば、SDA から FHIR STU3 への変換は、先頭に HS.FHIR.DTL.SDA3.vSTU3 が付きます。一方、FHIR STU3 から SDA への変換は、先頭に HS.FHIR.DTL.vSTU3.SDA3 が付きます。
-
カスタマイズする変換の名前をダブルクリックして、DTL エディタで開きます。
-
InterSystems ターミナルを開きます。
-
カスタマイズされた DTL クラスに必要な名前を取得するには、ターミナルで以下のように入力します。
Write ##class(HS.FHIR.DTL.Util.API.ExecDefinition).PreviewDTLCustomClass("standard_class_name")
standard_class_name は、カスタマイズしている変換のフルネーム (パッケージを含む) です。これは、DTL エディタで開いている変換の名前です。[変換] タブで名前を参照できますが、拡張子 .dtl は含まれていません。
-
ターミナルでの応答を必ずメモしてください。カスタマイズされた DTL クラスにこの名前を付ける必要があります。
-
DTL エディタで、[名前を付けて保存] をクリックします。
-
[パッケージ] フィールドで、ターミナルに表示されたカスタマイズされた DTL クラスの名前にあるパッケージを入力します。例えば、ターミナルに表示されたカスタマイズされたクラス名が HS.Local.FHIR.DTL.SDA3.vSTU3.Address.Address の場合、HS.Local.FHIR.DTL.SDA3.vSTU3.Address と入力します (実際のクラス名を除く)。
-
[名前] フィールドに、カスタマイズされたクラスの名前を入力します。例えば、ターミナルに表示されたカスタマイズされたクラス名が HS.Local.FHIR.DTL.SDA3.vSTU3.Address.Address の場合、Address と入力します。
-
説明を入力し、[OK] をクリックします。
カスタム・クラスのミラー・メンバへのコピー
ご使用の環境でミラーリングを使用しており、カスタマイズのパッケージがミラーリングされていないデータベースに存在する場合、カスタマイズされた DTL クラスを、各ミラー・メンバのカスタム・パッケージにコピーする必要があります。例えば、カスタマイズされたクラスのパッケージを HS.Local.FHIR.DTL と定義した場合、HS.Local はミラーリングされていない HSCUSTOM ネームスペースに存在するため、このカスタマイズされた DTL クラスを、各ミラー・メンバの HS.Local.FHIR.DTL にコピーする必要があります。カスタム・パッケージがミラーリングされるデータベースに存在する場合、これ以上のアクションは必要ありません。
変換 API クラスのカスタマイズ
変換 API クラスには、カスタムの変換動作を実装するためにオーバーライドできる複数のメソッドが含まれています。メソッドをオーバーライドするには、HS.FHIR.DTL.Util.API.Transform.SDA3ToFHIROpens in a new tab または HS.FHIR.DTL.Util.API.Transform.FHIRToSDA3Opens in a new tab のサブクラスを作成し、カスタム・メソッドを記述します。例えば、条件に基づいて DTL を選択する場合は、GetDTL() メソッドをオーバーライドできます。以下に、オーバーライド可能な変換メソッドの概要を簡単に説明します。
オーバーライド可能な SDA から FHIR への変換メソッド
HS.FHIR.DTL.Util.API.Transform.SDA3ToFHIROpens in a new tab クラスの以下のメソッドは、カスタムの変換動作を実装するためにオーバーライドできます。
所定の SDA オブジェクトの変換に使用する DTL クラスを指定します。カスタム DTL を使用するためにこのメソッドをオーバーライドする必要はありません。カスタム DTL パッケージを指定すると、GetDTL() メソッドにより、標準の DTL を使用する前に、カスタムの DTL が検索されます。ただし、条件に基づいて複数の候補から DTL を 1 つ選択する場合は、このメソッドをオーバーライドできます。
バンドル内の別のリソースによって参照される生成済みのリソースが既に存在するかどうかを変換で確認する方法を変更するには、このメソッドをオーバーライドします。例えば、Organization、Practitioner、または Medication などの共有リソースを重複として識別するための要件を緩和したい場合があります。既定では、共有リソースの先頭の 32 KB はハッシュ・テーブルにハッシュとして追加されます。それ以降の共有リソースへの各参照については、JSON の直接一致がないかハッシュ・テーブルを検索することにより、参照されているリソースが重複かどうかが変換によって判断されます。
IsDuplicate() メソッドにより、参照されているリソースが既に存在すると判断された場合、そのリソースはバンドル出力には含まれません。
既定では、ResourceLookup() メソッドが呼び出されると、変換によって作成されたバンドルのみを対象に、指定のリソースがないか検索されます。ただし、リポジトリやバンドル出力に指定のリソースがないかアプリケーションで検索したい場合などには、このメソッドをオーバーライドできます。
別のストリームレットへの参照を含む SDA を変換する場合、このメソッドは、参照対象の SDA オブジェクト用に作成された FHIR リソースへの参照を返します。例えば、EncounterNumber がこのメソッドに渡されると、指定の EncounterNumber によって参照された SDA Encounter に対応する FHIR Encounter リソースへの参照が返されます。このメソッドをオーバーライドして、指定の FHIR リソースへのカスタム参照を生成します。
既定では、変換によってバンドルが生成される場合、個々のリソースに id は割り当てられません。GetId() メソッドをオーバーライドして、バンドル内のリソースに id を割り当てます。この場合、バンドルの fullUrl フィールドの値は baseURL/resourceType/id で、バンドル内のリソース参照は resourceType/id になります。
GetBaseURL() メソッドをオーバーライドして、各リソースの URL 接頭語を変更します。例えば、FHIR リソースを特定のリポジトリにポストする場合は、リポジトリを識別する URL 接頭語を指定できます。
変換では、各リソースをバンドル出力に追加する前に、それぞれのリソースを検証します。HandleInvaidResource() メソッドをオーバーライドして、検証に失敗したリソースをどのように処理するかをカスタマイズします。既定では、エラーがスローされ、処理が停止します。つまり、バンドルは返されません。
オーバーライド可能な FHIR から SDA への変換メソッド
HS.FHIR.DTL.Util.API.Transform.FHIRToSDA3Opens in a new tab クラスの以下のメソッドは、カスタムの変換動作を実装するためにオーバーライドできます。
所定の FHIR リソースの変換に使用する DTL クラスを指定します。カスタム DTL を使用するためにこのメソッドをオーバーライドする必要はありません。カスタム DTL パッケージを指定すると、GetDTL() メソッドにより、標準の DTL を使用する前に、カスタムの DTL が検索されます。ただし、条件に基づいて複数の候補から DTL を 1 つ選択する場合は、このメソッドをオーバーライドできます。
このメソッドでは、バンドル内の別のリソースによって参照されているリソースを、変換で検索する場所を制御します。例えば、このメソッドをオーバーライドして、同じバンドル内ではなく、リポジトリ内で参照されているリソースを検索することができます。
このメソッドをオーバーライドして、SDA SendingFacility プロパティの値を設定する方法をカスタマイズします。
既定では、SendingFacility プロパティは次のように設定されます。Patient の managingOrganization フィールドに Organization への参照が含まれており、その Organization が Bundle に存在する場合は、それが使用されます。そうでない場合は、患者識別子で MRN と割り当て機関が検索され、その割り当て機関が使用されます。いずれの項目も見つからない場合は、文字列 FHIR が使用されます。
このメソッドをオーバーライドして、特定の識別子が SDA プロパティに割り当てられる方法をカスタマイズします。
例えば、このメソッドをカスタマイズして、値を Encounter ストリームレットの EncounterNumber フィールドに割り当てることができます。この場合、変換されるリソースのコンテンツにアクセスすると、返すべき EncounterNumber を決定するのに役に立ちます。インスタンス・プロパティ %currentReference には、ダイナミック・オブジェクトとしてリソースを取得するために、インスタンス・メソッド GetResourceFromReference() に渡すことができる FHIR 参照オブジェクトが含まれています。既定では、EncounterNumber プロパティの値は、1 から順に割り当てられます。
このメソッドのオーバーライドは、SDA HealthConcern または Goal の ExternalID 値の割り当てにも役立ちます。既定では、ExternalID プロパティの値は、1 から順に割り当てられます。
既定では、受信 FHIR バンドル内で別のリソースによって参照されているリソースがバンドルに存在しない場合、バンドルの変換は続行されます。不明のリソースがバンドルにある場合の処理方法を変更するには、HandleMissingResource() メソッドをオーバーライドします。
ルックアップ・テーブルのカスタマイズ
FHIR アノテーション・ツールを使用すると、変換でソース・データ形式のコードをターゲット形式のコードにマップするのに使用されるルックアップ・テーブルを調べることができます。これらのルックアップ・テーブルは、InterSystems ターミナル・ユーティリティを使用するか、ルックアップ・テーブルを含む JSON ファイルを手動で変更することにより、カスタマイズできます。
ターミナル・ユーティリティを使用したルックアップ・テーブルのカスタマイズ
インターシステムズでは、ルックアップ・テーブルのカスタマイズ・プロセスを導くユーティリティを用意しています。カスタマイズ・ユーティリティを実行するには、以下の手順に従います。
-
InterSystems ターミナルを開きます。
-
FHIR ネームスペースを変更するには、以下のように入力します。
set $namespace = "Myfhirnamespace"
Myfhirnamepace は、作成した FHIR ネームスペースです。
-
ユーティリティを開始するには、以下のように入力します。
do ##class(HS.FHIR.DTL.Util.API.LookupTable).EditLookupTable()
-
カスタマイズしているルックアップ・テーブルのマッピング・ソースを入力します。例えば、値を SDA3 から STU3 へマッピングするルックアップ・テーブルをカスタマイズしている場合は、SDA3 と入力します。
-
カスタマイズしているルックアップ・テーブルのマッピング・ターゲットを入力します。例えば、値を SDA3 から STU3 へマップするルックアップ・テーブルをカスタマイズしている場合は、STU3 と入力します。
-
カスタマイズするルックアップ・テーブルのマッピング・ソースの値セットに対応する数を入力します。
-
マッピング・ソースの値セットを含むルックアップ・テーブルが 1 つだけ存在する場合、マッピング・ターゲットの値セットは自動的に選択され、次の手順に進むことができます。それ以外の場合、カスタマイズするマッピング・ターゲットの値セットに対応する数を入力します。
-
編集するコードからコードへのマッピングを選択します。ルックアップ・テーブルに新しいコードからコードへのマッピングを追加するには、+ を入力します。
-
コードからコードへのマッピングのターゲットの値を編集している場合は、マッピングの新しいターゲット値を入力します。
コードからコードへのマッピングのソースの値を編集する場合は、- を入力して、コードからコードへのマッピング全体を削除し、ユーティリティを再実行して、正しいソースおよびターゲットの値で新しいマッピングを追加する必要があります。
Lookup.json の編集によるルックアップ・テーブルのカスタマイズ
ターミナル・ユーティリティを使用するのではなく、変換で使用されるルックアップ・テーブルのすべてが含まれる JSON ファイルで、キーと値のペアを追加、削除、または編集することにより、ルックアップ・テーブルをカスタマイズできます。それを開始する前に、提供された Lookup.json ファイルのカスタム・コピーを作成して、カスタム・ディレクトリのネームスペース固有のディレクトリに配置する必要があります。
カスタム Lookup.json ファイルの作成
ルックアップ・テーブルにアクセスする際に変換で使用するカスタム JSON ファイルを永続的な場所に作成するには以下の手順に従います。
-
使用している FHIR ネームスペース用のカスタム・ディレクトリを永続的な場所に作成します。
-
キットのインストールでは以下のように指定します。
<install-dir>\dev\fhir\lookup\custom\<MYFHIRNAMESPACE>
-
コンテナでは以下のように指定します。
<ISC_DATA_DIRECTORY>\dev\fhir\lookup\custom\<MYFHIRNAMESPACE>
<MYFHIRNAMESPACE> は使用する FHIR ネームスペースの名前です。すべて大文字で記述します。例えば、FHIR プロダクションを含むネームスペースが Myfhirnamespace と呼ばれている場合、MYFHIRNAMESPACE というディレクトリを作成します。
-
-
<install-dir>\dev\fhir\lookup ディレクトリから、作成した新しいカスタム・ネームスペース・ディレクトリに Lookup.json をコピーします。
これで、新しい Lookup.json のコピーで、ルックアップ・テーブルの編集を開始できます。
カスタムの Lookup.json ファイルの編集
ルックアップ・テーブルのカスタマイズを開始するには、以下の 4 つの情報を収集する必要があります。
-
マッピング・ソース
-
マッピング・ターゲット
-
マッピング・ソースの値セット
-
マッピング・ターゲットの値セット
これらの値は、管理ポータルの [FHIR アノテーション] にあります。これらの値を確認するには、以下の手順に従います。
-
管理ポータルを開き、FHIR ネームスペースに移動します。
-
ホーム・ページから、[Health]→[スキーマ・ドキュメント]→[FHIR アノテーション] を選択します。
-
最初のドロップダウン・リストで、カスタマイズしているルックアップ・テーブルを含む変換のタイプを選択します。例えば、ルックアップ・テーブルでの SDA3 と FHIR STU3 のコードの相互マッピング方法が目的の場合は、[FHIR3–>SDA3] を選択します。
マッピング・ソースとマッピング・ターゲットをメモします。変換ペアの最初のインタフェース形式がマッピング・ソースです。2 番目のインタフェース形式がマッピング・ターゲットです。例えば、[FHIR3—>SDA3] を選択する場合、vSTU3 がマッピング・ソースで、SDA3 がマッピング・ターゲットです。
-
[<transformation> ルックアップ・テーブルの表示] ボタンをクリックします。ボタンのフルネームは選択した変換ペアによります。
-
[ルックアップ・テーブルの表示] ダイアログで、ドロップダウン・リストを使用してマッピング・ソースの値セットとマッピング・ターゲットの値セットをメモします。マッピング・ソースの値セットは左側のドロップダウン・リスト内の名前です。マッピング・ターゲットの値セットは右側のドロップダウン・リスト内の名前です。
これで、マッピング・ソース、マッピング・ターゲット、マッピング・ソースの値セット、およびマッピング・ターゲットの値セットを取得したので、カスタムの Lookup.json ファイルで適切なキーと値のペアを追加、削除、または編集することにより、ルックアップ・テーブルを編集できます。
Lookup.json の最上位のキーと値のペアは、マッピング・ソースからマッピング・ターゲットへのリレーションシップに対応します。例えば、SDA3 から FHIR STU3 への変換で使用されるルックアップ・テーブルは以下のようになります。
"SDA3" : {
"vSTU3" : {
次のレベルのキーと値のペアは、マッピング・ソースの値セットからマッピング・ターゲットの値セットへのリレーションシップに対応します。対応するキーと値のペアを探すことで、正しいルックアップ・テーブルを検索します。以下に例を示します。
"HS.SDA3.Alert:Status" :
{"event-status" : {
ルックアップ・テーブルを見つけたら、コードからコードへのマッピングに対応するキーと値のペアを追加、削除、または編集できます。
"A":"in-progress",
"C":"unknown",
"I":"aborted",
"INT":"completed"
カスタムの Lookup.json ファイルのロード
Lookup.json をカスタマイズしたら、SDA-FHIR 変換で使用する前に、ターミナルを使用してロードしておく必要があります。JSON ファイルをロードするには、以下の手順に従います。
-
ターミナルを開きます。
-
FHIR ネームスペースに移動します。例を以下に示します。
set $namespace = "Myfhirnamespace"
-
次のコマンドを実行します。
set status = ##class(HS.FHIR.DTL.Util.API.LookupTable).ImportLookupJSONToGlobal()