FHIR クエリ フォールディング

Power Query フォールディングは、データ変換をデータ ソースに送信されるクエリに変換するために Power Query コネクタによって使用されるメカニズムです。 このフォールディング メカニズムにより、 Power Query は、不要なデータを大量の取得してクライアントで破棄するのではなく、できるだけ多くのデータ選択をデータ ソースにオフロードすることができます。 FHIR の Power Query コネクタには、クエリ フォールディング機能が含まれていますが、FHIR 検索の性質上、Power Query の式には、可能な限りクエリ フォールディングを確実に実行するための特別な注意が必要です。 この記事では、FHIR Power Query フォールディングの基本について説明し、ガイドラインと例を示します。

FHIR とクエリ フォールディング

FHIR サーバーから "患者" のリソースを取得するクエリを作成していて、1980 年以前に生まれた患者に関心があるとします。 このようなクエリは次のようになります。

let
    Source = Fhir.Contents("https://myfhirserver.azurehealthcareapis.com", null),
    Patient1 = Source{[Name="Patient"]}[Data],
    #"Filtered Rows" = Table.SelectRows(Patient1, each [birthDate] < #date(1980, 1, 1))
in
    #"Filtered Rows"

FHIR サーバーからすべての患者のリソースを取得し、クライアント (Power BI) でフィルター処理するのではなく、検索パラメーターを含むクエリを FHIR サーバーに送信する方が効率的です。

GET https://myfhirserver.azurehealthcareapis.com/Patient?birthdate=lt1980-01-01

このようなクエリでは、クライアントは目的の患者だけを受信し、クライアント内でデータを破棄する必要はありません。

生年月日の例では、クエリ フォールディングは簡単です。 しかし、一般的に FHIR では、検索パラメーター名が常にデータ フィールド名に対応しているとは限らず、複数のデータ フィールドが単一の検索パラメーターに関与することが多いため困難です。

たとえば、Observation リソースと category フィールドを考えてみましょう。 Observation.category フィールドは FHIR の CodeableConcept です。これには coding フィールドがあり、この中に systemcode フィールドがあります (他にもフィールドがあります)。 バイタル サインのみに関心があるとします。 Observation.category.coding.code = "vital-signs" の Observations に関心があるでしょうが、FHIR 検索は https://myfhirserver.azurehealthcareapis.com/Observation?category=vital-signs のようになります。

より複雑なケースでクエリ フォールディングを実現するために、FHIR 用の Power Query コネクタでは、Power Query 式が式パターンの一覧と照合され、適切な検索パラメーターに変換されます。 式パターンは FHIR 仕様から生成されます。

この式パターンを使用した照合は、データの他の整形を行う前に、データ変換手順でできるだけ早く選択式 (フィルター処理) を行う場合に最も機能します。

Note

Power Query エンジンでクエリ フォールディングを行う最適な機会が得られるようにするには、データを整形する前に、すべてのデータ選択式を行う必要があります。

クエリ フォールディングの例

効率的なクエリ フォールディングを説明するために、Observation リソースからすべてのバイタル サインを取得する例を見てみましょう。 これを行う直感的な方法では、最初に Observation.category フィールドを展開してから、Observation.category.coding を展開して、フィルター処理を行うでしょう。 クエリでは次のようになります。

// Inefficient Power Query
let
    Source = Fhir.Contents("https://myfhirserver.azurehealthcareapis.com", null),
    Observation = Source{[Name="Observation"]}[Data],
    ExpandCategory = Table.ExpandTableColumn(Observation, "category", {"coding"}, {"category.coding"}),
    ExpandCoding = Table.ExpandTableColumn(ExpandCategory, "category.coding", {"system", "code"}, {"category.coding.system", "category.coding.code"}),
    FilteredRows = Table.SelectRows(ExpandCoding, each ([category.coding.code] = "vital-signs"))
in
    FilteredRows

残念ながら、Power Query エンジンでは、category 検索パラメーターにマップする選択パターンとしてそれが認識されなくなりましたが、クエリを再構築すると、次のようになります。

// Efficient Power Query allowing folding
let
    Source = Fhir.Contents("https://myfhirserver.azurehealthcareapis.com", null),
    Observation = Source{[Name="Observation"]}[Data],
    FilteredObservations = Table.SelectRows(Observation, each Table.MatchesAnyRows([category], each Table.MatchesAnyRows([coding], each [code] = "vital-signs"))),
    ExpandCategory = Table.ExpandTableColumn(FilteredObservations, "category", {"coding"}, {"category.coding"}),
    ExpandCoding = Table.ExpandTableColumn(ExpandCategory, "category.coding", {"system", "code"}, {"category.coding.system", "category.coding.code"})
in
    ExpandCoding

検索クエリ /Observation?category=vital-signs は、FHIR サーバーに送信されます。これにより、サーバーからクライアントが受信するデータ量が減ります。

最初と 2 番目の Power Query 式は同じデータ セットになりますが、一般的に、後者の方がクエリのパフォーマンスが向上します。 クエリの 2 番目のより効率的なバージョンは、グラフィカル ユーザー インターフェイス (GUI) を使用したデータ整形だけでは、取得できないことに注意することが重要です。 "Power Query 詳細エディター" でクエリを記述する必要があります。

最初のデータ探索は GUI クエリ エディターを使用して行うことができますが、クエリ フォールディングを念頭に置いてクエリをリファクタリングすることをおすすめします。 具体的には、選択度の高いクエリ (フィルター処理) をできるだけ早く行う必要があります。

フォールディング パターンの検索

FHIR 用の Power Query コネクタは、Power Query 式が FHIR 仕様で定義されている既知の検索パラメーターにマップされている場合にのみ、クエリ フォールディングを行うことができます。 クエリ フォールディングが可能かどうかが不明な場合は、FHIR 仕様を参照することをお勧めします。 各リソースでは、仕様ページの下部に検索パラメーターのセットが一覧表示されます。 FHIR 用のフォールディングが可能な Power Query 式を記述する方法の例については、クエリのフォールディング パターンに関するページを参照してください。

クエリ フォールディングのデバッグ

特定の Power Query 式が折りたたまれるかどうか、および結果の FHIR 検索式がどのようなものかを判断しようとしている場合は、Power BI Desktop でクエリを整形するときに Fiddler を開始することができます。

まとめ

クエリ フォールディングにより、さらに効率的な Power Query 式が提供されます。 適切に作成された Power Query を使用すると、クエリ フォールディングが有効になり、データのフィルター処理の負荷のほとんどがデータソースにオフロードされます。

次のステップ

この記事では、FHIR 用の Power Query コネクタでクエリ フォールディングの使い方について学習しました。 次に、FHIR Power Query のフォールディング パターンの一覧を調べます。