2018年12月21日 星期五

HL7 FHIR Server初體驗 - 查詢篇 - 實戰之1

講了一些查詢的文法,最終還是要上線玩一玩才有感覺。
==========
為了讓查詢更加豐富,endpoint轉到官方提供的平台:https://vonk.fire.ly/前端工具仍然使用Postman
(R4也快公告了。此篇以後,都會採用R4的版本)
==========

暖身

  1. 抓Patient資源。因為沒有設定ID,所以取回全部。
  2. 目前這台FHIR Server上有199筆Patient Resource。用Bundle Resource打包多個Patient Resource。
別忘了,3.1.1查詢文件中,有3.1.1.1 Summary Table,裡面可以使用的參數。還要問問Patient Resource,可有哪些查詢參數。
(補充說明:這是R4的版本。Patient Resource已經是Normative,但是,查詢參數卻還是Trial Use)

  • ID
現能理解/ID與查詢參數是一樣的東西。前者是被預設成路徑的一部分。

  • _lastUpdated
_lastUpdate處理的是日期格式。那我們想知道2018年上半年有異動過的Resource。
  1. 輸入查詢參數。他是name=value的結構。value可以有prefix。
  2. 回傳用Bundle打包。總計30筆。
  3. 這些Patient Resource都會落在這個日期區間。

  • _tag, _profile, _security
Server上的所有Patient Resource,都沒有這三個欄位,無法進行實戰展示。

  • _text, _content
這兩個也不容易測試。兩者差異應是_text只會全文檢索,DomainResource.text的部分。而_content則是全部資源內容皆會。
這個功能不好測試,目前所使用https://vonk.fire.ly/的伺服器好像沒有支援。等有適當的案例時,再來補充。

  • _list

這個要跟List資源一起看。可是呢,在List那邊又說盡量用_list查詢。
目前,也還沒有實作成功,並沒有找出適當的展示案例,待補充之。

  • _has

這也是有點難理解的查詢條件,引入了Reverse Chaining的觀念。用以下這個範例來說明:

GET [base]/Patient?_has:Observation:patient:code=1234-5

目標是要取得Patient,但是這個Patient是被用在Observation中,真正去搜尋的是Observation。也就是說,去搜尋Observation,然後使用其查詢參數patient,來回傳所得到之Patient。但是,這邊對Observation又進一步的過濾,也就是,只需要code等於1234-5的Observation,然後傳給我這個Patient是誰。
為了實作這個,我們得先去找適當的Observation來測試。
首先我們要知道Observation有什麼查詢參數可用。上述範例用的是code。一查確實有。
code TUtokenThe code of the observation typeObservation.code13 Resources
<!--
當然,也有patient。
patient TUreferenceThe subject that the observation is about (if patient)Observation.subject.where(resolve() is Patient)
(Patient)
33 Resources
-->
等等,他是資料型態是token。那就要去看看在name=value的value部分,應該要長什麼樣子。其中有一個格式最簡單:
  • [parameter]=[code]: the value of [code] matches a Coding.code or Identifier.value irrespective of the value of the system property
也就是範例中所呈現的樣子。
接著,我們先來看看Server有哪些Observation。
  1. 這個URI會取回所有Observation Resource。
  2. 我們找任意一筆。有個code的編碼85354-9。待會要用這個當查詢值。
  3. 順便看一下,這個Observation所參照的病患是誰。他的ID是example。等等,這只能說這一筆。說不一定其他筆就不是這個patient。查詢完再來驗證。
有這些資料後,我們就可以開始下_has的查詢條件了。(補充說明,這些流程是為了解說查詢,實務上不是如此)

  1. 再用查詢code=85354-9來看看。
  2. 總共有6筆。
這六筆的subject(Patient)分別是(用剪貼,順便比較不同的表達方式):
"subject": {
                    "reference": "https://vonk.fire.ly/Patient/example"
                },
"subject": {
                    "identifier": {
                        "value": "547741699393"
                    }
                },
"subject": {
                    "reference": "https://vonk.fire.ly/547741699393"
                },
 "subject": {
                    "reference": "https://vonk.fire.ly/Patient/example"
                },
"subject": {
                    "reference": "https://vonk.fire.ly/Patient/example"
                },
"subject": {
                    "reference": "https://vonk.fire.ly/Patient/example"
                },
所以,實際上病患只有三個。所以,待會下_has的查詢時,應該會回傳三筆Patient資料。(希望能成功)
  1. URI的長相。
  2. 注意參數設定方式。
  3. 可惜,只有找回一筆。
  4. 此病患的ID是example。
為什麼只有一個呢?哈~回去看那六筆資料,其實只有一筆才是符合規範。


  • _type

這傢伙是用來調出指定之Resource。若只有指定單一Resource,那個標準URI格式所得是一樣的。我們來試試除了Patient也要Observation。(應該要很多)
  1. URI。注意,各資源只有逗號,不可有空白。
  2. 總共取回2305筆。其中Patient是232筆,Observation是2073筆。
==========
這是實作查詢,對終端使用者來說,不會是這樣的流程。但是,如果你要發展Client端或Server端的程式,我想這個基礎功應該不可避免。


沒有留言:

張貼留言