Riduzione delle query FHIR

Il folding in Power Query è il meccanismo usato da un connettore di Power Query per trasformare le trasformazioni dei dati in query inviate all'origine dati. Questo meccanismo di riduzione consente a Power Query di delegare il più possibile la selezione dei dati alla fonte dati anziché recuperare grandi quantità di dati non necessari solo per scartarli nel client. Il connettore Power Query per FHIR include funzionalità di riduzione delle query, ma a causa della natura della ricerca FHIR, è necessario prestare particolare attenzione alle espressioni di Power Query per garantire che la riduzione delle query venga eseguita quando possibile. Questo articolo illustra le nozioni di base del folding di FHIR per Power Query e fornisce linee guida ed esempi.

FHIR e riduzione delle query

Si supponga di costruire una query per recuperare le risorse "Paziente" da un server FHIR e di essere interessati ai pazienti nati prima dell'anno 1980. Una query di questo tipo potrebbe essere simile alla seguente:

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"

Anziché recuperare tutte le risorse Patient dal server FHIR e filtrarle nel client (Power BI), è più efficiente inviare una query con un parametro di ricerca al server FHIR:

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

Con una query di questo tipo, il client riceverà solo i pazienti di interesse e non dovrà eliminare i dati nel client.

Nell'esempio di data di nascita, il folding della query è semplice. Tuttavia, in generale, è difficile in FHIR perché i nomi dei parametri di ricerca non corrispondono sempre ai nomi dei campi dati e spesso più campi dati contribuiscono a un singolo parametro di ricerca.

Si consideri ad esempio la Observation risorsa e il category campo. Il campo Observation.category è un CodeableConcept in FHIR, che contiene il campo coding, che a sua volta include i campi system e code (tra gli altri). Si supponga di essere interessati solo ai segni vitali. Potresti essere interessato alle Osservazioni in cui Observation.category.coding.code = "vital-signs", ma la ricerca FHIR avrebbe un aspetto simile a https://myfhirserver.azurehealthcareapis.com/Observation?category=vital-signs.

Per ottenere la riduzione delle query nei casi più complessi, il connettore Power Query per FHIR corrisponde alle espressioni di Power Query con un elenco di modelli di espressione e li converte in parametri di ricerca appropriati. I modelli di espressione vengono generati dalla specifica FHIR.

Questa corrispondenza con i criteri di espressione funziona meglio quando qualsiasi espressione di selezione (filtro) viene eseguita il prima possibile nei passaggi di trasformazione dei dati prima di qualsiasi altra forma dei dati.

Annotazioni

Per consentire al motore di Power Query di eseguire il folding delle query, è consigliabile eseguire tutte le espressioni di selezione dei dati prima di qualsiasi data shaping.

Esempio di piegatura delle query

Per illustrare un'efficace ottimizzazione delle query, consideriamo l'esempio di recuperare tutti i segni vitali dalla risorsa Observation. Il modo intuitivo per eseguire questa operazione consiste nell'espandere prima il Observation.category campo e quindi espandere Observation.category.coding e quindi filtrare. La query sarà simile alla seguente:

// 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

Sfortunatamente, il motore di Power Query non riconosce più quello come un criterio di selezione che corrisponde al parametro di ricerca category, ma se si ristruttura la query in:

// 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

La query /Observation?category=vital-signs di ricerca viene inviata al server FHIR, riducendo la quantità di dati ricevuti dal client dal server.

Mentre la prima e la seconda espressione di Power Query generano lo stesso set di dati, quest'ultima, in generale, produce prestazioni di query migliori. È importante notare che la seconda versione, più efficiente, della query non può essere ottenuta esclusivamente tramite il data shaping con l'interfaccia utente grafica (GUI). È necessario scrivere la query nell'editor avanzato di Power Query.

L'esplorazione iniziale dei dati può essere eseguita con l'editor di query dell'interfaccia grafica utente, ma è consigliabile effettuare il refactoring della query tenendo presente l'ottimizzazione delle query. In particolare, le query selettive (filtro) devono essere eseguite il prima possibile.

Ricerca di modelli di piegatura

Il connettore Power Query per FHIR sarà in grado di eseguire la riduzione delle query solo se le espressioni di Power Query corrispondono ai parametri di ricerca noti definiti dalla FHIR. Se ti chiedi se il ripiegamento delle query è possibile, è consigliabile consultare la specifica FHIR. Ogni risorsa elenca un set di parametri di ricerca nella parte inferiore della pagina delle specifiche. È anche possibile consultare la pagina dei modelli di query pieghevoli per esempi di come scrivere espressioni di Power Query piegabili per FHIR.

Debugging del "query folding"

Se si sta tentando di determinare se una determinata espressione di Power Query viene piegata e qual è l'espressione di ricerca FHIR risultante, è possibile avviare Fiddler durante la modellazione delle query in Power BI Desktop.

Riassunto

Il raggruppamento delle query offre espressioni di Power Query più efficienti. Power Query creato correttamente consente il folding delle query e quindi l'off-load di gran parte del carico di lavoro del filtro dei dati all'origine dei dati.

Passaggi successivi

In questo articolo hai imparato come usare la riduzione delle query nel connettore Power Query per FHIR. Quindi, esplora l'elenco dei modelli di riduzione di Power Query FHIR.