ユースケース: アプリ駆動型分析、相互運用性、モダナイゼーション
製品: MongoDB Atlas、 MongoDB Atlas Search
パートナー: openEHP
ソリューション概要
openEHP は、アプリケーションとデータベースが変化しても、その医療的意味で一貫性が保たれるように診断レコードを構造化する方法です。これは、観察、医療、または診断などの実際の概念をモデル化するために使用される医療定義とは、レコードの安定した技術構造を分離します。
技術的には、openEHP はモデル駆動型の EHP アーキテクチャです。その参照モデルは、医療レコードの安定した構造を定義しますが、 アーカイブタイプ と テンプレートは、医療的な意味と実装制約を追加します。プライマリレコードユニットは であり、その内容はCOMPOSITION AQL を通じてクエリされる階層型の診断ドキュメントです。 AQL は、ストレージモデルとは独立しています。 SQLのような句と階層的なパスとネストされた医療構造に対するCONTAINS 述語を組み合わせます。これらのクエリを効率的にスケーリングするのは困難です。
実際には、OpenEHPリポジトリは多くの場合、次のクエリ ファミリーをサポートする必要があります。最初の は、単一クライアントの検索に対応します。例、既知のユーザーのチャートを開いたり、1 つの EHP 内の特定の診断ドキュメントを検索したりします。 2 つ目の値は、コストをまたいだ操作での取得であり、コストの例、安全性ルールを満たすクライアントの検索、ワークリストの生成、医療提供中に同様のケースの識別などです。これらの運用クエリは、レイテンシが低く予測可能な 、アプリケーションワークフローに近い状態で実行する必要があります。
多くの実装では、両方のクエリ パターンを効率的にサポートするのに困難が生じています。リレーショナル アプローチはユーザー スコープの取得には適していますが、大規模なクロス整合性クエリでは、結合、スキーマチャーン、テンプレートの違いによる負荷が発生することが多いです。これらのワークロードを別の分析プラットフォームにオフロードすると、回帰的な分析に役立ちますが、 重複 が発生し、レイテンシが増加し、ガバナンスと監査するログが付与され、統合 AQL クエリ インターフェイスの目的が付与されます。また、ドキュメントが過度にフラット化されている場合は、関連する医療コンテキストを削除することもできます。
クリティカル クエリ ファミリーの調整
このソリューションは、 MongoDBのドキュメントファーストの半フラット化された永続性モデルで問題に対処します。半フラット化とは、各要素を配列のノードとしてフラット化しますが、それぞれが元の構造で完全なJSONペイロードを保持することを意味します。ドキュメント ファーストとは、アーカイブタイプごとに 1 つのテーブルやパスごとの 1 行に分割されるのではなく、オープン EHP 構成のそれぞれが 1 つのMongoDBドキュメントとして保持されることを意味します。同時に、構成は再構築可能なノード配列としてマテリアライズドされるため、構成を操作単位として放棄することなく、効率的なパスベースのクエリが可能になります。
保存された各ノードは、次のキー要素を保持します。
ローカル診断サブツリーなので、元の意味とコンテキストは引き続き利用できます。
位置メタデータ、構造と順序を再構築できます。
逆 AQL パス。これにより、変数深度パス制約の効率的な一致が可能になります。
逆パスは、クライアントをスコープとした実行ルートとクロスクライアントの実行ルートの両方で構造述語を効率的に評価するために使用される一般的なクエリ キーです。正規表現ベースの一致や、検索インデックスのワイルドカード スタイルのパス解決など、さまざまな実行戦略間でのパス制限された一致をサポートします。述語が他のテキストパスコンポーネントまたはテキスト条件を使用する場合でも、同じクエリ パターンを適用できます。
このモデルでは、QL 句はMongoDBクエリ ステージに確定的にコンパイルできます。 FROM、CONTAINS、WHERE の制約は、ノードパスと値を対象とする述語になります。このアプローチでは、 構成 をプライマリの診断コンテナとして完全に維持すると同時に、 操作上の取得を増やすに 実行可能にします。
図の 1。各ノードが独自のコンテキストと値、および逆方向の AQL パスを保持する半フラット化された構成の表現
ワークロードによるルーティング
多くのリポジトリでは、単一の半フラット化されたコレクションとワイルドカード インデックスで十分です。大規模な配置の場合、モデルは、クロスバッチ フィルタリングに必要なデータのみを含むストリーム検索プロジェクションを使用できます。クエリ実行はスコープによってルーティングされます。ストリーム検索プロジェクションは、広範なクロス整合性フィルタリングに必要なノードフィールドのみを保存する小規模な派生コレクションです。メインの 構成ドキュメントを置き換えるものではありません。幅広い運用クエリでインデックスの幅と検索コストが削減されます。
したがって、次のモーダルを提供します。
クライアントスコープ クエリは、
ehr_idやreversed_pathなどのフィールドの複合インデックスなどの ターゲット インデックス を使用して、メインの 構成コレクションで実行されます。クロス整合性クエリは、よりスロープロジェクションに対して実行され、パス制約をワイルドカードまたは逆パス上の一致にコンパイルし、値述語は等価、範囲、または検索演算子に変換されます。
この実行モデルは 1 つのクエリインターフェイスを提供し、ワークロードのサイズと選択性に基づいて異なる物理アクセスパスを許可します。
操作コスト クエリのサポートが重要な理由
最近の医療アプリケーションでは、同じプラットフォーム上の両方のクエリ ファミリーが必要になります。医療提供者は、1 つの診断レコードをすぐに開き、次のような質問をする必要がある場合があります。
特定の時間ウィンドウ内で特定の試行回数を受け取ったユーザーは?
どのユーザーがプロトコルまたは安全性ルールに一致するか?
このケースに開発的に類似している過去のケースはどれですか。
これらの運用上の質問では、反復されるETLサイクルを通じてデータを別個のシステムにプッシュせずに回答が必要です。
ドキュメントファーストの半フラット化モデルは、openEHP の強度を維持し、それらのワークロードを実用的にします。これにより、構成を権限のある操作単位として維持し、再構築可能な構造によって医療忠実度を維持し、アプリケーションチームにペインテッド ストアと別の クロスパッチ プラットフォームのどちらかを選択を強制するのを回避します。小規模なリポジトリはシンプルなままで、半フラット化されたコレクション1 つだけで済みます。リポジトリが大きいほど、プロジェクションが小さくなり、広範な運用フィルタリングのコストを削減できます。
評価では、このアプローチは両方のワークロードタイプにわたって終了から終了までのレイテンシが低く、 かつ 、大増やすな場合でも、ページング クエリとクロスクライアント クエリの応答時間は低くなります。この効率は、それを 1 つのプラットフォームから操作的検索、の出所対応プロセシング、セマンティック豊富化、およびAI駆動型ワークフローをサポートする必要がある OpenEHR リポジトリの実用的な基礎として検証します。
注意
本番環境での検証点: このアーキテクチャは、永続化されたドキュメントが1.2 を超えるリポジトリで本番環境で検証されています。
このパターンは、実験的な参照ランタイムとドキュメントプライマリデータ戦略用のツールキーであるカーネルで調べることができます。
このアプローチに従うと、次のような実用的なメリットが得られます。
構成の忠実度を維持する、再構築可能な半フラット化モデル。
医療ドキュメントのリレーショナル シャードを強制しないで、効率的なクライアント スコープのクエリ。
倉庫優先アーキテクチャにデフォルト設定せずに、クロスクライアント操作検索をサポートします。
重複したストアとフラグメント化されたロジックの代わりに、アプリケーションチームの 1 つの運用クエリ表。
ETLオーバーヘッド、ガバナンスドリフト、総所有コストを削減するパス。
カーネルとは何であり、それを使用する理由
カーネルは、医療データモデルを運用機能に変える戦略ランタイムです。カーネルが存在するのは、ヘルスヘルスデータモデルを定義するだけでは十分ではないためです。チームは、データを検証し、運用表現に変換し、データを取り込み、クエリを実行し、維持し、要件の変化に応じて開発するための再現可能な方法も必要です。その 実行レイヤーがない場合、モデルは多くの場合、ドキュメント、ストレージスキーマ、または分離された仕様のままになります。
目的は OpenEHRエンジン を構築するよりも幅広いです。 Kernel は、API、ツール、 AIワークフロー全体で医療データモデルを実行可能、検査可能、再利用可能にするための再現可能なドキュメントファーストのアプローチを提供します。時間の経過とともに、同じランタイム パターンは、FHIR、合成データ ワークフロー、セマンティック カタログ、自然言語検索、その他のドメイン固有のツールなど、他のモデルファミリーや運用戦略をサポートすることができます。
カーネルは、それぞれの永続性戦略のニーズに合わせてカスタマイズできる公開ワークフローを基づいて設計されています。各戦略は、一貫したランタイムモデルを使用しながら、独自のアクティベーション、検証、取り込み、変換、クエリ、合成データ、およびメンテナンス操作を定義できます。
OpenEHP は要求が高く、セマンティックが多いモデルであるため、カーネルは OpenEHP で起動します。これには、アーカイブタイプ、テンプレート、パス、用語、複雑なクエリ動作が含まれます。そのため、モデル駆動型ランタイム アプローチを提供するための強力な基盤となります。
このソリューションでは、Kernel はドキュメントファーストの永続性パターンの参照ランタイムとツールキーとして機能します。
図の 2。 Kernel CLI のスクリーンショット
参照アーキテクチャ
図 3 は、標準の OpenEHP 入力からルーティングされたクエリ実行まで、カーネルにおけるこの戦略のエンドツーエンドのフローを示しています。
図の 3。 AQL コンパイラーとルーティング ランタイム(カーネル)
1レイヤー: データソースは、標準の OpenEHP 構成、運用テンプレートのモデルカタログ、増やすテストに使用されるオプションの合成データで始まります。 Opt は、アーティタイプとテンプレートから派生したコンパイルされたランタイム アーティファクトです。運用システムは、検証とパス認識処理に opt を使用します。
2レイヤー: 変換パイプラインは、各受信構成をこの戦略で使用される永続化表現に変換します。半フラット化ステップでは、構成階層をスキャンし、パスとコードのエンコーディングを適用し、マッピング ルールを使用してクエリ可能なノードを具体化します。その結果、ローカル カスタム サブツリー、位置メタデータ、および逆パス キーを保持する保存済みノードを含む、コンフィギュレーションごとに 1 つの半フラット化されたMongoDBドキュメントが生成されます。
3レイヤー: _codes_shortcuts辞書とマッピングは、この戦略に必要なヘルパーアーティファクトを保存します。 と は、圧縮パスの解決とエンコーディングをサポートしています。マッピングは、変換とクエリのコンパイルを実行する戦略固有のルールを保存します。
4レイヤー: MongoDBコレクションに永続性オプションが表示されます。プライマリ構成コレクションehr_id cn.pには、半フラット化された構成ドキュメントが保存され、 と の複合インデックスを通じてクライアントスコープの実行が提供されます。大規模なリポジトリの場合、オプションの 検索コレクションには、クロス整合性フィルタリングに必要なノードデータ ポイントの合理的なプロジェクションが保存されます。このコレクションはMongoDB Atlas Searchでインデックス付けされています。デュアル コレクション パターンにより、検索マッピングがより絞り込まれ、検索コストが低くなります。
5レイヤー: ehr_idクエリエンジンは、カーネルが AQL を解析してルーティングする場所です。ランタイムは、AQL ステートメントを受け入れ、AST を検証し、エイリアスと安全なプロジェクションを解決し、クエリが永続的かどうかを検出し、適切なMQLルートを出力します。クエリに が含まれている場合、ランタイムは通常、$match $project、 、$sort 、 などのステージを使用して、$limit 構成コレクションに対してクライアントスコープの集計パイプラインを出力します。クエリがクロス互換性がある場合、ランタイムは 複合フィルター 内でembeddedDocument wildcard、 、range 、equals などの演算子を使用して、プロジェクションを超える検索最初のパイプラインを出力します。ただし、template/time/order 述語が一致対応している場合、基本コレクションにいくつかのクロス整合性クエリを保持できます。
6レイヤー: ランタイム インターフェースは、 kernel CLI とHTTP API の両方でこの戦略を公開します。 CLI は、環境設定、戦略のアクティブ化、コンパイル、クエリ実行などの演算子ワークフローをサポートします。このAPI は、統合、オートメーション、およびインタラクティブ ドキュメントの同じランタイム機能を提供します。
この階層型設計は、アプリケーションチームに 1 つの論理的な運用クエリ表を提供し、リポジトリサイズ、クエリ範囲、ワークロードの選択性に基づいて異なるアクセス パスを可能にします。
データモデルアプローチ
各コンフィギュレーションを 1 つのMongoDBドキュメントとして保存し、半フラット化された形式で永続化します。保存された各ノードには次のものが含まれます。
ローカル承認のサブツリー
逆方向のパスキー
再構築用の位置メタデータ
この構造により、モデルはドキュメントが優先され、増やすでクエリ可能になります。アーティタイプごとのテーブル レイアウトを作成したり、すべてのクエリで元のネストされたJSONシェイプのみを使用するように強制したりすることは避けます。
このモデルでは、オープン EHP パスはファーストクラスのままになります。永続化されたドキュメントは構成を操作単位として保持し、ノード配列はコンパイラーにクエリのための決定的な構造を提供します。
次の簡略化されたドキュメントは、読み取り可能な 永続化された構成の例を示しています。説明用にフォーマットされているため、圧縮された本番環境のエンコーディングよりもフィールド名とパス値を従うのが簡単です。
{ "_id": "...", "ehr_id": "patient-001", "composition_id": "c-001", "template_id": "openEHR-EHR-COMPOSITION.vaccination_list.v0", "version": 1, "cn": [ { "p": "ACTION.medication.v1.SECTION.immunisation_list.v0.COMPOSITION.vaccination_list.v0", "kp": "content[0]/items[0]", "pi": [0,0], "bk": "b1", "data": { "time": { "value": "2026-01-15T10:30:00Z" }, "other_participations": { "performer": { "identifiers": { "id": "038321545" } } }, "code": { "value": "J07BX03" } } } ] }
このドキュメントの読み方
1 つのMongoDBドキュメントは1 つのオープン EHP 構成を表します。 cn 配列は、その構成から抽出されたクエリ可能なノードを保存します。各ノードは、data にローカル診断サブツリー、p に逆パスキー、および kp、pi、bk などの位置メタデータを保持するため、元の構造を再構築できます。
公開例では、翻訳を見つけやすくするために、パスキーを読み取り可能な形式で表示しています。本番環境では、辞書でエンコードされた圧縮トークンと同じパスを保存して、パス サイズとインデックスのフットプリントを削減できます
逆パスエンコーディング
保存されたパスフィールドは、キーの最適化を表します。参照モデル属性とアーカイブタイプノード識別子はオープン EHP パスを構築します。このソリューションでは、保存されたパスの逆を使用するため、リージョン ワイルドカード スキャンではなくプレフィックス対応のマッチングで含まれ制約を評価できます。この設定は、クライアントスコープ ルートでは標準の正規表現ベースの一致と、検索ルートではワイルドカード スタイルの一致で機能します。
決定的なQLからMQLへの変換
AQL はストレージ モデルとは独立しているため、決定的なコンパイルが効果的です。 SQL句は次のようにMQLに変換されます。
FROMとCONTAINSは構造パス述語になります。WHEREは、一致したノードペイロードの値述語になります。SELECTはプロジェクションになります。ORDER BYはソートになります。
次の例は、AQL クエリを示しています。
SELECT e/ehr_id/value AS ehrId, c/uid/value AS compositionId, med_ac/description[at0017]/items[at0140]/items[at0141]/value/defining_code/code_string AS locationCode FROM EHR e CONTAINS COMPOSITION c[openEHR-EHR-COMPOSITION.vaccination_list.v0] CONTAINS ( CLUSTER adminInfo[openEHR-EHR-CLUSTER.admin_salut.v0] AND SECTION[openEHR-EHR-SECTION.immunisation_list.v0] AND ACTION med_ac[openEHR-EHR-ACTION.medication.v1] ) WHERE med_ac/time/value >= '2000-04-13T07:54:16.345Z' AND med_ac/time/value <= '2026-02-13T07:54:16.345Z' AND adminInfo/items[at0007]/items[at0014]/value/defining_code/code_string = 'E08019820' AND med_ac/other_participations/performer/identifiers/id = '038321545' ORDER BY med_ac/time/value DESC
この AQL に求められる内容
このクエリは、構造ベースと値ベースの制約を組み合わせたものです。CONTAINS $次に、WHERE 句は、アクション時間、実行者識別子、および管理コードに関する述語を追加します。
このクエリ タイプは、決定的なコンパイルのメリットがあります。これは、階層的な診断構造とノード ローカルの値に対する条件を表します。
コンパイラーが AQL をMQLにマッピングする方法
コンパイルされたMQL は、 AQL と同じロジックに従います。
最上位の
ehr_idフィルターにより、クエリは永続的になります。$all句では、QL によって記述されるすべての構造ブランチが同じ構成要素に存在する必要があります。各
$elemMatchはパス述語とその値述語を同じ保存済みノードにバインドします。pの述語は、構造化されたCONTAINSロジックのコンパイル済み形式です。データの下の述語は、
WHERE条件をコンパイルされた形式です。完全なパイプラインでは、コンパイラーは
SELECTとORDER BYに対応するプロジェクションステージとソート ステージを追加します。
次の例は、上記の AQL クエリから生成された、クライアントを対象とした簡素化されたMQLパターンを示しています。これは、バイト単位のランタイムペイロードではなく、コンパイラーロジックを示します。
// Simplified compiler output for a single-EHR query. // Projection and sorting stages are omitted here for clarity. db.compositions.aggregate([ { "$match": { "ehr_id": "b416bc97-de39-43f5-9d47-712af6688947~r1", "cn": { "$all": [ { "$elemMatch": { "p": { "$regex": /^ACTION\.medication\.v1(?:\.[^.]+)*\.SECTION\.immunisation_list\.v0(?:\.[^.]+)*\.COMPOSITION\.vaccination_list\.v0$/ }, "data.time.value": { "$gte": ISODate("2000-04-13T07:54:16.345Z"), "$lte": ISODate("2026-02-13T07:54:16.345Z") }, "data.other_participations.performer.identifiers.id": "038321545" } }, { "$elemMatch": { "p": { "$regex": /^at0014\.at0007\.CLUSTER\.admin_salut\.v0(?:\.[^.]+)*\.COMPOSITION\.vaccination_list\.v0$/ }, "data.value.defining_code.code_string": "E08019820" } } ] } } } ]);
同じロジックが検索ルートにどのように移行するか
論理的な翻訳はクロスクライアント ルートでは同じままです。違いは物理的な実行の違いです。メインの 構成コレクションを照合する代わりに、コンパイラーは 最小検索プロジェクションを対象とします。逆パスの構造制約はワイルドカード フィルターになり、値述語は範囲フィルターと等価フィルターになります。
次の例では、1 人のユーザーにバインドされていない AQL から生成されたMQLパターンを示しています。以前と同様に、ここではバイト単位のランタイム ペイロードではなく、コンパイラー ロジックが示されます。
{ "$search": { "index": "search_nodes_index", "compound": { "filter": [ { "embeddedDocument": { "path": "sn", "operator": { "compound": { "filter": [ { "wildcard": { "path": "sn.p", "query": "ACTION.medication.v1*SECTION.immunisation_list.v0*COMPOSITION.vaccination_list.v0" } }, { "range": { "path": "sn.data.time.value", "gte": ISODate("2000-04-13T07:54:16.345Z"), "lte": ISODate("2025-04-13T07:54:16.345Z") } }, { "equals": { "path": "sn.data.other_participations.performer.identifiers.id", "value": "038321545" } } ] } } } } ] } } }
反復される構造と同じパスのシーケンス
一部の OpenEHP 構造には、同じ有効パスを持つ繰り返しのノードを含めることができます(例、EVENTs が繰り返されるなど)。このような場合は、コンパイラーが述語をより深くプッシュして、条件が同じ反復項目によって満たされるようにする必要があります。標準の集計では、 はより深くネストされた $elemMatch を意味します。検索ルートでは、同等の は embeddedDocument です。これは複数の条件を同じ埋め込み配列要素にバインドします。
ソリューションのビルド
このリポジトリで入手可能なカーネルを、このパターンの参照ランタイムとツールキーとして使用します。カーネルは、標準の OpenEHP 構成を取り込み、運用クエリを正しい実行パスにルーティングするために使用される戦略ライフサイクル、検証フロー、半フラット化パイプライン、および AQL コンパイル パスを提供します。
アクティベーション時に、カーネルは manifest.json を通じて戦略を公開し、defaults.json をアクティベーション ベースラインとして使用し、schema.json でオーバーライドを検証し、戦略実装と spec.json によって記述されたストレージとインデックスのプランを適用します。推奨されるパスは、最初にMongoDBでコレクションと B ツリー インデックスを手動で作成するのではなく、アクティブな構成からカーネルにコレクションとB木インデックスを作成できるようにするものです。
リポジトリは、カーネルをデモンストレーション、教育、Rapid プロトタイプ作成、概念実証の実験的なランタイムとして機能します。このソリューションを自分の環境で再現するには、次の手順に従います。
GitHubリポジトリをクローンし、カーネルを起動する
リポジトリをクローンし、./startKehrnel でランタイムを開始します。このエントリポイントは、ローカル環境を自動的に準備し、最初の実行を簡単に維持します。
git clone https://github.com/mongodb-industry-solutions/kehrnel cd kehrnel ./startKehrnel export RUNTIME_URL="${RUNTIME_URL:-http://localhost:8080}" Alternative direct API entrypoint: uvicorn kehrnel.api.app:app --reload --port 8080
スタートアップ後 、ランタイムが到達可能であることを確認し、ワークフローの残りの部分のコントロール プレーンとしてカーネルを使用します。
起動されると、カーネルはルート http://localhost:8080 / ガイドで Dockerus サイトを公開します。図の4 は サイトを示しています。
図の 4。カーネルのドキュメント
CLI コンテキストを構成し、環境を作成する
CLI を実行中のランタイムに差し向け、ターゲット環境を作成して検査します。環境は、カーネル内の起動の単位です。これにより、戦略コードの変更を強制せず、戦略構成、バインディング、生成されたアーティファクト、運用状態を分離します。
Point the CLI at the running kehrnel runtime kehrnel context set --runtime-url "$RUNTIME_URL" kehrnel core health kehrnel core env create --env dev --name "Development" kehrnel core env list kehrnel core env show --env dev
戦略を検出して有効化
カーネルは複数の環境、ドメイン、戦略をサポートしています。このウォークスルーでは、opener ドメインと openehr.rps_dual 戦略を明示的に選択します。
ベースライン構成として src/kehrnel/engine/strategies/openehr/rps_dual/defaults.json を使用し、コレクション名、フィールドラベル、検索有効化、辞書、区切り文字、コーディング ポリシー、またはマッピングを変更する場合にのみ、小さなオーバーライドファイルを追加します。
アクティブ化は、カーネルがアクティブな戦略構成から構成されたコレクションとB木インデックスを具体化するステップです。パッケージ化された参照の例では、アクティベーション オーバーライドファイルはstrategy をパッケージ化されたプロジェクションマッピングに向けます。次に、戦略のアクティベーション設定に従って辞書ブートストラップが適用されます。
注意
完全なopenehr.rps_dual 構成画面と適用可能なサポートされている変更については、 戦略構成ガイド を参照してください。このガイドでは、コレクション名、フィールドラベル、検索側の有効化、辞書シード、パス区切り、コーディング ポリシーなど、戦略ベースラインの各設定が制御する内容について説明します。
mkdir -p .kehrnel Local plaintext MongoDB bindings for the walkthrough cat > .kehrnel/bindings.mongo.yaml <<EOF db: provider: mongodb uri: ${MONGODB_URI} database: ${MONGODB_DB} EOF Packaged activation override for the reference dual-collection example kehrnel core env activate \ --env dev \ --domain openehr \ --strategy openehr.rps_dual \ --config src/kehrnel/engine/strategies/openehr/rps_dual/samples/reference/activation.config.json \ --allow-plaintext-bindings \ --bindings .kehrnel/bindings.mongo.yaml \ --force Ensure bundled dictionaries are present kehrnel run ensure_dictionaries --env dev --domain openehr Generate the Atlas Search definition derived from the active mappings kehrnel strategy build-search-index \ --env dev \ --domain openehr \ --strategy openehr.rps_dual \ --out .kehrnel/search-index.json
テンプレート、マッピング、標準構成を準備する
src/kehrnel/engine/strategies/openehr/rps_dual/samples の下の戦略所有のサンプルアセット、または独自の標準 OpenEHP 入力と連携します。
OPT テンプレートを使用して構成を検証または生成します。
取り込みおよび検索インデックスの生成を実施するのと同じ構成で検索側のコレクションを構築する場合は、パッケージ化されたプロジェクションマッピングを使用します。
SAMPLES_ROOT="src/kehrnel/engine/strategies/openehr/rps_dual/samples/reference" Inspect the packaged reference assets ls "$SAMPLES_ROOT/templates" ls "$SAMPLES_ROOT/queries" ls "$SAMPLES_ROOT/envelopes" ls "$SAMPLES_ROOT/projection_mappings.json" \ "$SAMPLES_ROOT/search_index.definition.json" \ "$SAMPLES_ROOT/manifest.json" Optional: generate and validate a sample composition from a packaged OPT kehrnel common generate -- \ -t "$SAMPLES_ROOT/templates/sample_laboratory_v0_4.opt" \ -o .kehrnel/composition.json \ --random kehrnel common validate -- \ -c .kehrnel/composition.json \ -t "$SAMPLES_ROOT/templates/sample_laboratory_v0_4.opt" \ --stats Optional: generate a starter source-to-canonical mapping skeleton kehrnel common map-skeleton -- \ "$SAMPLES_ROOT/templates/sample_laboratory_v0_4.opt" \ -o .kehrnel/mapping.skeleton.yaml \ --macros
取り込み量
戦略を通じて構成を取り込みます。パッケージ化された NJSON エンベロープは、マスクされたコンフィギュレーションと、ehr_id、template_id、composition_version、time_committed などのメタデータを含む標準の OpenEHP 複合ラッパーです。
ここでは カーネルを実行しますが、このウォークスルーは標準の OpenEHP エンベロープから始まり、半フラット化されたベースドキュメントと、テンプレートにマッピングが存在する場合は、任意の 検索側プロジェクションドキュメントを生成するための 戦略が必要です。
以下のローカルファイル フラグは、ランタイムが作業ツリーからパッケージ化されたサンプルNJSON を読み取れるようにする文字列のみです。
テンプレートにマッピングが存在する場合、カーネルは compositions_search に任意の検索サイドドキュメントも作成します。テンプレートにマッピングが存在しない場合は、空の配列が生成される代わりにそのサイドカーをスキップします。
The CLI expands the local NDJSON into documents before sending the request. kehrnel run ingest \ --env dev \ --domain openehr \ --strategy openehr.rps_dual \ --set file_path="$SAMPLES_ROOT/envelopes/all.ndjson"
AQL のコンパイルと検査
実行前に一般的な AQL をコンパイルします。
解決されたスコープ、出力されたMQL、および選択された実行パスを確認します。
このコンパイル ステップは、パターンのキー操作契約です。アプリケーションは AQL に残りますが、カーネルはストレージモデルに対して決定的な変換と実行計画を処理します。
Compile only: inspect the execution plan without running the query kehrnel core env compile-query \ --env dev \ --domain openehr \ --aql "$SAMPLES_ROOT/queries/patient_laboratory_by_ehr.aql" kehrnel core env compile-query \ --env dev \ --domain openehr \ --aql "$SAMPLES_ROOT/queries/cross_patient_laboratory_by_performing_centre.aql"
運用クエリの実行
同じ環境に対して、クライアント スコープ クエリとクロスクライアント クエリの両方を実行します。この実行は、パターンの主要値である: 1 つの運用クエリサブスクリプションであり、ランタイムはワークロードに適切な物理的な実行パスを選択していることを示しています。
クライアントスコープのクエリの場合、ランタイムはインデックス付きの $match、$project、$sort、$limit ステージを持つメインの半フラット化されたコレクションを対象にすることができます。より広範囲の操作取得では、クエリシェイプがメリットを得る場合、ランタイムは検索指向パスをルーティングできます。
Execute both representative queries kehrnel core env query \ --env dev \ --domain openehr \ --aql "$SAMPLES_ROOT/queries/patient_laboratory_by_ehr.aql" kehrnel core env query \ --env dev \ --domain openehr \ --aql "$SAMPLES_ROOT/queries/cross_patient_laboratory_by_performing_centre.aql"
生成されたアーティファクトを探索
生成されたMongoDBドキュメント、オプションの 検索サイドプロジェクション、および Atlas Searchインデックス定義を調査して、ドキュメントファーストの設計を検証します。
標準構成がどのようにソース入力のままであるか、半フラット化された形式がどのように決定的なクエリをサポートするか、およびマッピングがドキュメント全体を識別していないように複製するのではなく、検索側のプロジェクションを動作させる方法がわかります。
Inspect the generated base and search-side documents mongosh "$MONGODB_URI/$MONGODB_DB" <<'MONGOSH' db.compositions_rps.findOne({}, { ehr_id: 1, tid: 1, time_c: 1, cn: { $slice: 3 } }) db.compositions_search.findOne({}, { ehr_id: 1, comp_id: 1, tid: 1, sort_time: 1, sn: 1 }) MONGOSH Inspect the generated Atlas Search definition cat .kehrnel/search-index.json
CLI を使用してパターンを拡張する
ベースフローが動作したら、カスタムAPI接続に直接移行するのではなく、CLI を続行します。 CLI はすでに主要な運用ビルド ブロックを公開しています。
環境ライフサイクル
戦略の起動
辞書設定
検索インデックスの生成
クエリのコンパイル
クエリ実行
このツールキーは、カーネルを戦略が機能するための自然なコントロール プレーンにします。別のアプリケーションまたはUI をその上に配置できますが、戦略自体は引き続き移植性があり、検査可能で、ランタイムと CLI で直接操作可能です。
Continue through the CLI for strategy operations and discovery kehrnel op capabilities --env dev kehrnel op schema synthetic_generate_batch --strategy openehr.rps_dual kehrnel run rebuild_codes --env dev --domain openehr kehrnel run rebuild_shortcuts --env dev --domain openehr kehrnel run build_search_index_definition \ --env dev \ --domain openehr \ --strategy openehr.rps_dual
注意
ガイド付きサンドボックスでこのパターンを試してみてくださいか。ヘルスケア データ ラボは、この OpenEHR 永続性アプローチを含む、ドキュメント ファーストの医療データ戦略のモデル化、クエリ、テストを行うチームに役立ちます。現在、プライベート プレビューで利用可能です。アクセスをリクエストには、 MongoDB のアカウント担当者に問い合わせてください。
キーポイント
構成を半フラット化されたドキュメントとして永続化: 構成ごとに 1 つのMongoDBドキュメントを保持しますが、ネストされた未加工のペイロードではなく、再構築可能な半フラット化された形式で保存します。
効率的な一致のためにパスをエンコードしてパスを逆にします: AQL 構造パスを圧縮された逆トークンに変換して、
CONTAINSがプレフィックス対応述語にマッピングできるようにします。スコープごとに AQL をルーティングします:
ehr_idを使用して、クライアントスコープのクエリをローカルに保持し、必要に応じて複数のクエリを Atlas Search に送信します。増やすに基づいて 1 つのコレクションまたは 2 つのコレクションを選択します。単一の半フラット化されたコレクションは十分に機能しますが、非常に大規模なリポジトリでは 合理的な検索プロジェクションのメリットが得られます。
1 つの運用クエリ表を保持する: ランタイムが決定的なコンパイルと実行計画を処理する間、アプリケーションチームが AQL に存在できるようにします。
作成者
Francesc Mateu Amengual, MongoDB
Giovanni Rodriguez, MongoDB
Greg Cox、 MongoDB
MongoDB 、10 のクロスリー