Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

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 を使用してリソースのデータを評価して抽出するプロセスは簡単に実行できます。

Instantiate FHIRPath object, parse FHIRpath expression, evaluate a resource, and work with collection of results

以下のセクションでは、ワークフローの各手順を詳細に説明します。

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 です。

    name of FHIR package: hl7.fhir.r4.core

  • 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 つの評価メソッドを使用できます。

どちらの場合も、評価されるリソースはダイナミック・オブジェクトとしてメソッドに渡されます。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 仕様では、式に使用できる幅広い関数を定義しています。インターシステムズでは、これらの関数のサブセットをサポートします。

サポートされている 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 仕様では、式に使用できる幅広い演算を定義しています。インターシステムズでは、これらの演算のサブセットをサポートします。

サポートされている 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
as に関する実装の注意点

FHIRPath 仕様によると、asOpens in a new tab 演算の左のオペランドは、単一項目のコレクションである必要があります。ただし、インターシステムズの FHIRPath の実装では、このコレクションは複数の値を持つことができます。例えば、ある Patient を参照する複数の拡張を持つ Observation があるとします。インターシステムズの FHIRPath の実装では、extension.value as Reference という式はまだ有効です。

パフォーマンスの向上

インターシステムズでは、解析した FHIRPath 式を格納できるメモリ内キャッシュを提供することにより、一連の式が頻繁に繰り返される場合のパフォーマンスを向上させます。キャッシュを有効にすると、キャッシュがクリアされるまで、parse() メソッドによって生成されたツリー構造が格納されます。

メモリ内キャッシュを有効にするには、以下を呼び出します。

do fhirPathAPI.enableCache(1)

キャッシュを無効にするには、以下を呼び出します。

do fhirPathAPI.enableCache(0)
FeedbackOpens in a new tab