Share via


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 伺服器擷取所有病患資源,並在用戶端中篩選它們,更有效率地將具有搜尋參數的查詢傳送至 FHIR 伺服器:

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

透過這類查詢,用戶端只會接收感興趣的患者,且不需要捨棄用戶端中的數據。

在出生日期範例中,查詢折疊很簡單。 但一般而言,FHIR 具有挑戰性,因為搜尋參數名稱不一定會對應至數據功能變數名稱,而且經常有多個數據欄位會參與單一搜尋參數。

例如,讓我們考慮 Observation 資源和 category 欄位。 欄位 Observation.categoryCodeableConcept FHIR 中的 ,其具有 coding 字段,且具有 systemcode 欄位(以及其他欄位)。 假設您只對生命跡象感興趣。 您會對觀察感興趣,其中 Observation.category.coding.code = "vital-signs",但 FHIR 搜尋看起來會像 https://myfhirserver.azurehealthcareapis.com/Observation?category=vital-signs

為了能夠在更複雜的案例中達成查詢折疊,適用於 FHIR 的 Power Query 連接器會比對 Power Query 運算式與表達式模式清單,並將其轉譯為適當的搜尋參數。 表達式模式是從 FHIR 規格產生。

當任何選取表達式(篩選)在數據轉換步驟中儘早完成任何數據成形之前,與表達式模式的比對效果最好。

注意

若要讓 Power Query 引擎有執行查詢折疊的最佳機會,您應該先執行所有數據選取表示式,再進行任何數據成形。

查詢折疊範例

為了說明有效率的查詢折疊,我們會逐步解說從觀察資源取得所有重要跡象的範例。 這樣做的直覺方式是先展開 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 伺服器,以減少客戶端從伺服器接收的數據量。

雖然第一個和第二個 Power Query 表達式會產生相同的數據集,但後者通常會導致更好的查詢效能。 請務必注意,第二個更有效率的查詢版本無法純粹透過使用圖形使用者介面的數據成形來取得。 您必須在Power Query 進階編輯器中撰寫查詢。

初始數據探索可以使用 GUI 查詢編輯器來完成,但建議您使用折迭查詢來重構查詢。 具體而言,應儘早執行選擇性查詢(篩選)。

尋找折疊模式

Power Query 連接器 for FHIR 只有在 Power Query 表達式對應至 FHIR 規格所定義的已知搜尋參數時,才能執行查詢折疊。 如果您想知道查詢折疊是否可行,建議您參閱 FHIR 規格。 每個資源都會在規格頁面底部列出一組搜尋參數。 您也可以參閱 折疊查詢模式 頁面,以取得如何撰寫 FHIR 可折疊 Power Query 表達式的範例。

偵錯查詢折疊

如果您嘗試判斷指定的 Power Query 運算式是否已折疊,以及產生的 FHIR 搜尋表達式為何,您可以在 Power BI Desktop 中塑造查詢時啟動 Fiddler

摘要

查詢折疊可提供更有效率的Power Query表達式。 正確製作的Power Query 可讓查詢折疊,因而將大部分的數據篩選負擔卸除至數據源。

下一步

在本文中,您已瞭解如何在Power Query連接器 for FHIR 中使用查詢折疊。 接下來,探索 FHIR Power Query 折疊模式的清單。