FHIRPath
FHIRPath は XPath に似た言語です。これを使用すると、パス、関数、演算を含む簡単な構文を使用して、FHIR® リソースをナビゲートし、データを評価したり、そのフィールドからデータを抽出することができます。例えば、Patient の指定の名前に値が含まれているかどうか評価できます (Patient.name.given.empty())。または、Patient リソースの telecom フィールドの値を抽出することもできますが、official が、その use フィールドの値である場合に限ります (Patient.telecom.where(use = 'official'))。
FHIRPath では、式はコレクション・ベースです。 各関数は 1 つの入力コレクションに対して機能し、各二項演算子は 2 つの入力コレクションに対して作用し、式から返される値は出力コレクションにまとめられます。一部の関数や演算は、入力コレクションのサイズに制約を課します。
式の構築方法など、FHIRPath の詳細は、HL7 FHIRPath の仕様Opens in a new tabを参照してください。インターシステムズでは、仕様で定義されている関数と演算のサブセットをサポートしています。
ワークフロー
インターシステムズのテクノロジにより、FHIRPath を使用してリソースのデータを評価して抽出するプロセスは簡単に実行できます。
以下のセクションでは、ワークフローの各手順を詳細に説明します。
HS.FHIRPath.API のインスタンス化
FHIRPath を使用してリソースのデータを評価して抽出するプロセスは、HS.FHIRPath.API.getInstance()Opens in a new tab の呼び出しから始まります。このメソッドを呼び出す場合は、FHIR のバージョンに対応する FHIR パッケージを指定する必要があります。例えば、評価しているリソースが FHIR R4 に準拠している場合、対応するパッケージの ID は、現在、hl7.fhir.r4.core@4.0.1 になります。この場合、HS.FHIRPath.API のインスタンス化は、次のようになります。
set fhirPathAPI = ##class(HS.FHIRPath.API).getInstance($lb("hl7.fhir.r4.core@4.0.1"))
管理ポータルまたは ObjectScript を使用して、現在ロードされているパッケージの ID を取得できます。
-
管理ポータル — [ホーム] → [Health] → [MyFHIRNamespace] → [FHIR 構成] に移動し、[パッケージ構成] カードを選択します。@ 記号とバージョン番号をパッケージの名前に追加すると、パッケージの ID になります。例えば、以下のパッケージの ID は hl7.fhir.r4.core@4.0.1 です。
-
ObjectScript — パッケージの ID をプログラムによってリストするには、"利用可能なパッケージのリスト" を参照してください。
HS.FHIRPath.API オブジェクトには、FHIRPath 式を解析し、リソースを評価するのに使用されるメソッドが含まれています。このオブジェクトはまた、FHIRPathAPI プロパティの HS.FHIRMeta.API オブジェクトにプロパティとしても含まれます。
FHIRPath 式の解析
HS.FHIRPath.API オブジェクトをインスタンス化したら、FHIRPath 式を解析する準備は完了です。式を解析するメソッド HS.FHIRPath.API.parse()Opens in a new tab は、リソースを評価するメソッドで使用されるツリー構造を返します。例えば、前のセクションで示したように、インスタンス化された fhirPathAPI という名前のオブジェクトがあるとした場合、以下のようになります。
set tree = fhirPathAPI.parse("name.given.empty()")
リソースの評価
FHIRPath 式を解析したら、そのツリー構造を使用して、リソースのデータを評価または抽出できます。次の 2 つの評価メソッドを使用できます。
-
HS.FHIRPath.API.evaluate()Opens in a new tab — evaluate() メソッドは、多次元配列で評価結果を返します。
-
HS.FHIRPath.API.evaluateToJson()Opens in a new tab — evaluateToJson() メソッドは、ダイナミック配列でコレクションを返します。
どちらの場合も、評価されるリソースはダイナミック・オブジェクトとしてメソッドに渡されます。parse() メソッドによって返されたツリーもまた、引数として渡されます。例を以下に示します。
set tree = fhirPathAPI.parse("name.given.empty()")
// myResource is a dynamic object
do fhirPathAPI.evaluate(myResource, tree, .OUTPUT)
set DynArray = fhirPathAPI.evaluateToJson(myResource, tree)
追加のメソッド HS.FHIRPath.API.evaluateArray()Opens in a new tab を使用して、evalaute() メソッドから返される多次元配列を解析できます。
結果の操作
evaluateToJson() によって生成されたダイナミック配列で結果を操作することにはメリットがあります。evaluate() によって生成された多次元配列には、他では入手できない追加情報が含まれます。以下に、多次元配列のデータに関する指針を示します。evaluate() に対する応答は OUTPUT という名前の変数で返されたものとします。
ノード | 説明 |
---|---|
OUTPUT | 配列内の値を含むノード数。 |
OUTPUT(n) | 配列の n 番目の要素の値。 |
OUTPUT(n,"t") | FHIR データ型の識別を含む、配列の n 番目の要素のデータ型。 |
返された多次元配列は、evaluateArray() メソッドを使用してさらに解析することができます。
対照的に、evaluateToJson() を使用してダイナミック配列を生成する場合、配列内の値を見ると、データ型が文字列、ブーリアン、数字、またはオブジェクトのどれであるかは判断できますが、FHIR データ型は判断できません。
ワークフローの例 : evaluate() メソッド
この例には、評価されるリソース、リソースの評価に必要な ObjectScript、および評価によって生成される多次元配列の確認が含まれます。
set myResource = {
"resourceType":"Patient",
"telecom": [
{
"system": "phone",
"value": "(03) 5555 6473",
"use": "official"
},
{
"system": "phone",
"value": "(03) 5555 6473",
"use": "home"
},
{
"system": "email",
"value": "myName@email.com",
"use": "official"
}
]
}
set fhirVersion = $lb("hl7.fhir.r4.core@4.0.1")
set fhirPathAPI = ##class(HS.FHIRPath.API).getInstance(fhirVersion)
set tree = fhirPathAPI.parse("telecom.where(use = 'official')")
do fhirPathAPI.evaluate(myResource, tree, .OUTPUT)
InterSystems ターミナルで zw OUTPUT コマンドを使用して、evaluate() から返された多次元配列を表示する場合、結果は以下のようになります。
OUTPUT=2
OUTPUT(1)={"system":"phone","value":"(03) 5555 6473","use":"official"}
OUTPUT(1,"t")="ContactPoint"
OUTPUT(2)={"system":"email","value":"myName@email.com","use":"official"}
OUTPUT(2,"t")="ContactPoint"
値は、ContactPoint FHIR データ型として識別されることに注意してください。
ワークフローの例 : evaluateArray() メソッド
この例では、上記の evaluate() 例の評価で生成された多次元配列を入力として使用し、結果として生じる配列の評価に必要な ObjectScript を示し、評価によって生成される多次元配列を表示します。
Merge INPUT = OUTPUT
Kill OUTPUT
Set tree = fhirPathAPI.parse("ContactPoint.value")
do fhirPathAPI.evaluateArray(.INPUT, tree, .OUTPUT)
InterSystems ターミナルで zw OUTPUT コマンドを使用して、evaluateArray() から返された多次元配列を表示する場合、結果は以下のようになります。
OUTPUT=2
OUTPUT(1)="(03) 5555 6473"
OUTPUT(1,"t")="string"
OUTPUT(2)=”myName@email.com"
OUTPUT(2,"t")="string"
値は、ObjectScript データ型 (文字列、ブーリアン、数字、またはオブジェクト) によって識別されることに注意してください。
ワークフローの例 : evaluateToJson() メソッド
この例には、評価されるリソース、リソースの評価に必要な ObjectScript、および評価によって生成されるダイナミック配列の確認が含まれます。
set myResource = {
"resourceType":"Patient",
"name": [
{
"family": "Cooper",
"given": [
"James",
"Fenimore"
]
}]
}
set fhirVersion = $lb("hl7.fhir.r4.core@4.0.1")
set fhirPathAPI = ##class(HS.FHIRPath.API).getInstance(fhirVersion)
set tree = fhirPathAPI.parse("name.given.empty()")
set dynArray = fhirPathAPI.evaluateToJson(myResource, tree)
InterSystems ターミナルで zw dynArray コマンドを使用してダイナミック配列を表示する場合、結果は以下のようになります。
dynArray=[false]
関数
FHIRPath 仕様では、式に使用できる幅広い関数を定義しています。インターシステムズでは、これらの関数のサブセットをサポートします。
関数 | 例 |
---|---|
[ ] (インデックス)Opens in a new tab | Practitioner.name[1] |
aggregateOpens in a new tab | item.factor.aggregate($total+$this,0) |
asOpens in a new tab | Condition.abatement.as(string) |
childrenOpens in a new tab | children().ofType(Reference) |
descendantsOpens in a new tab | descendants().ofType(Reference) |
emptyOpens in a new tab | name.empty() |
endsWithOpens in a new tab | 'abcdefg'.endsWith('efg') |
existsOpens in a new tab | Patient.telecom.exists(system = 'phone') |
extensionOpens in a new tab | extension('http://intersystems.com/fhir/extn/sda3/lib/code-table-detail-care-provider-description').value as string |
hasExtensionOpens in a new tab | 指定した URL による拡張が入力コレクションのいずれかにある場合は true が返されます (FHIRPath v2.0.0 仕様には、この関数がありません)。 |
iifOpens in a new tab | iif(1=1,2,3) |
indexOfOpens in a new tab | 'abcdefg'.indexOf('cd') |
isOpens in a new tab | Condition.abatement.is(dateTime) |
notOpens in a new tab | gender.not() |
ofTypeOpens in a new tab | Bundle.entry.resource.ofType(Patient) |
resolveOpens in a new tab | Organization.partOf.resolve() |
startsWithOpens in a new tab | 'abcdefg'.startsWith('abc') |
substringOpens in a new tab | 'abcdefg'.substring(1, 2) |
unionOpens in a new tab | Practitioner.name.family.union(Practitioner.id) |
whereOpens in a new tab | Patient.telecom.where(use = 'official') |
演算
FHIRPath 仕様では、式に使用できる幅広い演算を定義しています。インターシステムズでは、これらの演算のサブセットをサポートします。
演算 | 例 |
---|---|
+ (加算)Opens in a new tab |
8 + 3 5 seconds + 3 seconds 'string1' + ' and ' + 'string2' |
& (文字列連結)Opens in a new tab | 'string1' & ' and ' & 'string2' |
= (等しい)Opens in a new tab |
Practitioner.name[0].family = 'Cooper' Practitioner.meta.versionId = 10 |
!= (等しくない)Opens in a new tab | Practitioner.name[1].family != 'Smith' |
| (和集合)Opens in a new tab | Practitioner.name.family | Practitioner.id |
andOpens in a new tab | true and false |
asOpens in a new tab | 実装の注意点を参照してください。 |
impliesOpens in a new tab | Patient.name.given.exists() implies Patient.name.family.exists() |
isOpens in a new tab | Practitioner.name[0] is HumanName |
orOpens in a new tab | true or false |
xorOpens in a new tab | true xor false |
FHIRPath 仕様によると、asOpens in a new tab 演算の左のオペランドは、単一項目のコレクションである必要があります。ただし、インターシステムズの FHIRPath の実装では、このコレクションは複数の値を持つことができます。例えば、ある Patient を参照する複数の拡張を持つ Observation があるとします。インターシステムズの FHIRPath の実装では、extension.value as Reference という式はまだ有効です。
パフォーマンスの向上
インターシステムズでは、解析した FHIRPath 式を格納できるメモリ内キャッシュを提供することにより、一連の式が頻繁に繰り返される場合のパフォーマンスを向上させます。キャッシュを有効にすると、キャッシュがクリアされるまで、parse() メソッドによって生成されたツリー構造が格納されます。
メモリ内キャッシュを有効にするには、以下を呼び出します。
do fhirPathAPI.enableCache(1)
キャッシュを無効にするには、以下を呼び出します。
do fhirPathAPI.enableCache(0)