単純なObjectScript永続クラスをFHIRのコードシステムと値セットとして公開する
FHIR Terminology Serviceの仕様には、 CodeSystem、ValueSet、およびConceptMapリソースでの一連の演算子が記述されています。 これらの演算子の内、以下の4つの演算子が最も広く採用されているようです。
CodeSystem | ValueSet |
---|---|
$lookup $validate-code |
$expand $validate-code |
IRIS for Health 2020.1で導入された新しいFHIRフレームワークを学ぶには、仕様の部分的な実装を開発するのが最も効果的と言えます。 実装には上記の4つの演算が含まれており、CodeSystemとValueSetリソースでreadとsearch操作がサポートされています。
実装には単純なObjectScript永続クラスがソース用語テーブルとして使用されていることに注意することが重要です。
サンプルストラテジーを使ったインストールとテスト
以下のリストでは、インストールと基本的なテスト手順を説明しています。
- IRIS for Health 2020.1以降をインストールします。
- ポータルの
システム管理
>構成
>システム構成
>ネームスペース
メニューを使用して、またはHSLIBネームスペースでdo ##class(HS.HC.Util.Installer).InstallFoundation("<name for the new namespace>")
コマンドを実行して、新しいネームスペースをセットアップします。 その後、 intersystems-ru/fhir-terminology-service GitHubリポジトリのsrc/clsとsamples/clsフォルダからクラスをインポートします。 - 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
ディレクトリにあります。
- 新しいメタデータセットとSample.iscru.fhir.fts.SimpleStrategyクラスに基づく新しいFHIRエンドポイントを作成します。 これについても、インタラクティブユーティリティを使用するか、次のコマンドを実行します。
do ##class(HS.FHIRServer.Installer).InstallInstance("<web app URI, e.g. /csp/terminology>", "Sample.iscru.fhir.fts.SimpleStrategy", "")
- 新しいエンドポイントに認証なしアクセスを許可します。インタラクティブユーティリティを使用するか、次のコマンドを実行してください。
set strategy = ##class(HS.FHIRServer.API.InteractionsStrategy).GetStrategyForEndpoint("<web app URI>")
set config = strategy.GetServiceConfigData()
set config.DebugMode = 4
do strategy.SaveServiceConfigData(config)
- Sample.iscru.fhir.fts.model.CodeTableにデータを入力します。
do ##class(Sample.iscru.fhir.fts.model.CodeTable).Populate(10)
- 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()
クラスメソッド:code
とdisplay
概念要素に対応するクラスプロパティの名前を返します。 各クラスには、用語コード/ディスプレイ要素にマッピングされたそれぞれのプロパティがあります。
以下は、オーバーライドした方が適切だと思われる 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リソースに表示されないようにするには、オーバーライドする必要があります。 デフォルトでは、このメソッドは、Collection
、Identity
、Internal
、MultiDimensional
、およびPrivate
プロパティを除外します。 フレームワークでは、オブジェクト参照とストリームプロパティは現在サポートされていないため、無視されることに注意してください。 -
codeSystemUrlPREFIX
とvalueSetUrlPREFIX
クラスパラメーター、およびgetCodeSystemForClassname()
、getValueSetForClassname()
、determineCodeTableClassname()
、およびdetermineCodeSystemForValueSet()
メソッド: クラス名をどのように 正規URLと関連付けるかを制御します。 デフォルトでは、正規URLには、次の命名スキームが使用されています。CodeSystem ValueSet urn:CodeSystem:<short class name>
urn:ValueSet:<short class name>
CodeSystem/ValueSetリソースの論理ID(またはサーバーID)は、対応するクラスの完全な名前と同じです。
今後の課題
現在不足しているのは、コードシステムのバージョン管理、概念階層と $subsumes
演算子、ConceptMapリソースなど多くのものに対するサポートです。 皆さんのアイデア、そしてプルリクエストをぜひお待ちしています!