記事
Toshihiko Minamoto · 2021年3月29日 10m read

単純なObjectScript永続クラスをFHIRのコードシステムと値セットとして公開する

FHIR Terminology Serviceの仕様には、 CodeSystemValueSet、およびConceptMapリソースでの一連の演算子が記述されています。 これらの演算子の内、以下の4つの演算子が最も広く採用されているようです。

IRIS for Health 2020.1で導入された新しいFHIRフレームワークを学ぶには、仕様の部分的な実装を開発するのが最も効果的と言えます。 実装には上記の4つの演算が含まれており、CodeSystemValueSetリソースでreadsearch操作がサポートされています。

実装には単純なObjectScript永続クラスがソース用語テーブルとして使用されていることに注意することが重要です。

サンプルストラテジーを使ったインストールとテスト

以下のリストでは、インストールと基本的なテスト手順を説明しています。

  1. IRIS for Health 2020.1以降をインストールします。
  2. ポータルの システム管理 > 構成 > システム構成 > ネームスペース メニューを使用して、またはHSLIBネームスペースで do ##class(HS.HC.Util.Installer).InstallFoundation("<name for the new namespace>") コマンドを実行して、新しいネームスペースをセットアップします。 その後、 intersystems-ru/fhir-terminology-service GitHubリポジトリのsrc/clssamples/clsフォルダからクラスをインポートします。
  3. dummy-search-parameters.jsonで定義された追加の検索パラメーターを使って、R4セットに基づく独自のFHIRメタデータセットを作成します。 これは、##class(HS.FHIRServer.ConsoleSetup).Setup() インタラクティブユーティリティを使うか、次のコマンドを実行します。
do ##class(HS.FHIRServer.Installer).InstallMetadataSet("", "", "HL7v40", $lb("<directory with dummy-search-parameters.json>"), 1)
  • これは、$expand$validate-code 演算子がHTTP GETリクエストをサポートするため必要な手順です。
  • InterSystems IRISにパッケージ化されたFHIRメタデータセットファイルは、<installation directory>/dev/fhir/fhir-metadata ディレクトリにあります。
  1. 新しいメタデータセットとSample.iscru.fhir.fts.SimpleStrategyクラスに基づく新しいFHIRエンドポイントを作成します。 これについても、インタラクティブユーティリティを使用するか、次のコマンドを実行します。
do ##class(HS.FHIRServer.Installer).InstallInstance("<web app URI, e.g. /csp/terminology>", "Sample.iscru.fhir.fts.SimpleStrategy", "")
  1. 新しいエンドポイントに認証なしアクセスを許可します。インタラクティブユーティリティを使用するか、次のコマンドを実行してください。
set strategy = ##class(HS.FHIRServer.API.InteractionsStrategy).GetStrategyForEndpoint("<web app URI>")
set config = strategy.GetServiceConfigData()
set config.DebugMode = 4
do strategy.SaveServiceConfigData(config)
  1. Sample.iscru.fhir.fts.model.CodeTableにデータを入力します。
do ##class(Sample.iscru.fhir.fts.model.CodeTable).Populate(10)
  1. fhir-terminology-service.postman_collection.jsonファイルをPostmanにインポートし、コレクション内に定義されている url 変数を調整して、単純な永続クラスである Sample.iscru.fhir.fts.model.CodeTable に対してサービスをテストします。

サポートされているFHIR操作

CodeSystemとValueSetで現在サポートされている検索パラメーターは、url のみです。

HTTP GETとHTTP POSTメソッドは、上記の4つの演算子でサポートされています。

以下の表には、Sample.iscru.fhir.fts.model.CodeTableクラスに対して行えるHTTP GETリクエストをいくつか示しています。

URI
http://<server>:<port><web app URI> の後に続く)
説明
/metadata エンドポイントの機能宣言リソースを取得します。
/CodeSystem/Sample.iscru.fhir.fts.model.CodeTable Sample.iscru.fhir.fts.model.CodeTableクラスに対応するCodeSystemリソースを読み取ります。
/ValueSet/Sample.iscru.fhir.fts.model.CodeTable Sample.iscru.fhir.fts.model.CodeTableクラスに対応するValueSetリソースを読み取ります。
/CodeSystem?url=urn:CodeSystem:CodeTable CodeSystemリソースをURLで検索します。
/CodeSystem 使用可能なすべてのCodeSystemリソースを出力します。
/ValueSet?url=urn:ValueSet:CodeTable ValueSetリソースをURLで検索します。
/ValueSet 使用可能なすべてのValueSetリソースを出力します。
/CodeSystem/$lookup?system=urn:CodeSystem:CodeTable&code=TEST あるシステムとコードで、概念に関するすべての詳細を取得します。
/ValueSet/$expand?url=urn:ValueSet:CodeTable ValueSetを展開します。
/CodeSystem/Sample.iscru.fhir.fts.model.CodeTable/$validate-code?code=TEST コードがコードシステムにあることを検証します。

カスタムストラテジーの作成

独自の永続クラスをFHIRコードシステム/値セットとして公開するには、iscru.fhir.fts.FTSStrategyをサブクラス化してカスタムストラテジークラスを作成し、その新しいカスタムストラテジーに基づいてFHIRエンドポイントを作成する必要があります(上記手順4のインストール手順を参照)。

1つのクラスパラメーターと少なくとも3つのメソッドをストラテジークラスでオーバーライドする必要があります。

  • StrategyKey クラスパラメーター: いくつかの一意の値を割り当てる必要があります。 現在のクラスの名前が適当でしょう。
  • getCodeTablePackage() クラスメソッド: 正規URLで識別される特定のコードシステム(または値セット)のパッケージ名を返す必要があります。 一般的に、すべての用語クラスは1つのパッケージに属しているため、このメソッドは通常、引数の値に関係なく1つの同じパッケージ名を返します。
  • getCodePropertyName() および getDisplayPropertyName() クラスメソッド: codedisplay 概念要素に対応するクラスプロパティの名前を返します。 各クラスには、用語コード/ディスプレイ要素にマッピングされたそれぞれのプロパティがあります。

以下は、オーバーライドした方が適切だと思われる iscru.fhir.fts.FTSStrategy のその他のメソッドとパラメーターです。

  • listCodeTableClasses() クラスメソッド: 使用可能なすべてのコードシステム(または値セット)を返す検索リクエストをサポートするには、オーバーライドする必要があります。 このメソッドは、使用可能なすべての用語クラスのクラス名のリストを返します。 Sample.iscru.fhir.fts.SimpleStrategyには、次のように、このメソッドの基本的な実装が含まれます。
/// 使用可能なすべてのコードテーブルクラスのリストを返します。
ClassMethod listCodeTableClasses() As %List
{
    #dim sql As %String = "SELECT name FROM %Dictionary.ClassDefinition WHERE name LIKE '" _ ..#codeTablePACKAGE _ ".%' ORDER BY name"
    #dim resultSet As %SQL.StatementResult = ##class(%SQL.Statement).%ExecDirect(, sql)
    if (resultSet.%SQLCODE '= 0) && (resultSet.%SQLCODE '= 100) $$$ThrowStatus($$$ERROR($$$SQLError, resultSet.%SQLCODE, resultSet.%Message))

    #dim return As %List = ""
    while resultSet.%Next()
    {
        set return = return _ $lb(resultSet.name)
    }

    quit return
}
  • isExcludedProperty() クラスメソッド: 永続クラスの特定のプロパティをCodeSystemリソースに表示されないようにするには、オーバーライドする必要があります。 デフォルトでは、このメソッドは、CollectionIdentityInternalMultiDimensional、およびPrivateプロパティを除外します。 フレームワークでは、オブジェクト参照とストリームプロパティは現在サポートされていないため、無視されることに注意してください。

  • codeSystemUrlPREFIXvalueSetUrlPREFIX クラスパラメーター、および getCodeSystemForClassname()getValueSetForClassname()determineCodeTableClassname()、および determineCodeSystemForValueSet() メソッド: クラス名をどのように 正規URLと関連付けるかを制御します。 デフォルトでは、正規URLには、次の命名スキームが使用されています。

    CodeSystem ValueSet
    urn:CodeSystem:<short class name> urn:ValueSet:<short class name>

CodeSystem/ValueSetリソースの論理ID(またはサーバーID)は、対応するクラスの完全な名前と同じです。

今後の課題

現在不足しているのは、コードシステムのバージョン管理、概念階層と $subsumes 演算子、ConceptMapリソースなど多くのものに対するサポートです。 皆さんのアイデア、そしてプルリクエストをぜひお待ちしています!

00
2 0 0 10
Log in or sign up to continue