2018年12月15日 星期六

HL7 FHIR Server初體驗 - 查詢篇 - 戰技之2

戰技之1只討論了查詢參數的資料型態。另外,共用性查詢參數也得要進行討論。
因為,還沒有講解Resource結構,在這邊的理解度上,可能會有所不足。
得說聲抱歉,有結構性的系列文件,還在思考中。真的,文件太多了。
==========

共用性查詢參數

這部份又可以分成兩塊,查詢前與查詢後。

  1. 查詢前
    • _id
    • _lastUpdated
    • _tag
    • _profile
    • _security
    • _text
    • _content
    • _list
    • _has
    • _type
    • _query
  2. 查詢後
    • _sort
    • _count
    • _include
    • _revinclude
    • _summary
    • _elements
    • _contained
    • _containedType

=====
查詢前
=====

  • _id

就是查詢id,只不過利用Router的設定,可以變成uri的一部分。也就是說,下兩個查詢模式是一樣的。

GET [base]/Patient?_id=23


GET [base]/Patient/23

  • _lastUpdated, _tag, _profile, _security
每一個資源都是繼承於DomainResource,而DomainResource又繼承於Resource
Resource有一個element叫meta,他的資料型態是Meta。Meta的element結構為:
Structure

NameFlagsCard.TypeDescription & Constraints
.. MetaΣElementMetadata about a resource
Elements defined in Ancestors: id, extension
... versionIdΣ0..1idVersion specific identifier
... lastUpdatedΣ0..1instantWhen the resource version last changed
... profileΣ0..*uriProfiles this resource claims to conform to
... securityΣ0..*CodingSecurity Labels applied to this resource
All Security Labels (Extensible)
... tagΣ0..*CodingTags applied to this resource
Common Tags (Example)

是的,所有資源都會有,這四個查詢參數,就是來設定這四個欄位的。注意,這四個要用相對應的查詢資料型態:
  • lastUpdated -> Date/DateTime
  • profile -> Token, URI
  • servurity -> Token
  • tag -> Token
範例
GET [base]/Observation?_lastUpdated=gt2010-10-01
GET [base]/Condition?_tag=http://acme.org/codes|needs-review
GET [base]/DiagnosticReport?_profile=http://hl7.org/fhir/StructureDefinition/lipid
GET [base]/DiagnosticReport?_profile=Profile/lipid

  • _text, _content

這兩個傢伙是用來查詢narrative的部分。前段說,所有資源都繼承於DomainResource。而DomainResource有個屬性text,就是攜帶Human Readable的部分。可以想像,這就是全文檢索之意。至於_text與_content之差異,抱歉,我看不出來也理解不出來。
Structure
NameFlagsCard.TypeDescription & Constraintsdoco
.. DomainResourceIResourceA resource with narrative, extensions, and contained resources
+ If the resource is contained in another resource, it SHALL NOT contain nested Resources
+ If the resource is contained in another resource, it SHALL NOT contain any narrative
+ If a resource is contained in another resource, it SHALL NOT have a meta.versionId or a meta.lastUpdated
+ If the resource is contained in another resource, it SHALL be referred to from elsewhere in the resource
Elements defined in Ancestors: id, meta, implicitRules, language
... textI0..1NarrativeText summary of the resource, for human interpretation
... contained0..*ResourceContained, inline Resources
... extension0..*ExtensionAdditional Content defined by implementations
... modifierExtension?!0..*ExtensionExtensions that cannot be ignored
範例
GET [base]/Condition?_text=(bone OR liver) AND metastases  --> 原文是and,我改成AND。

  • _list

用在List資源打包回資源,他是有順序性的。用這個可以取出特定的那一個。
範例
GET [base]/Patient?_list=42

  • _has

這是個限定搜尋的概念。可是他又引入一個新觀念稱之為Reverse Chaining。看範例先。
ET [base]/Patient?_has:Observation:patient:code=1234-5
這個若看得懂,那HL7 FHIR的功力應該超人一等。
他的意思是說,我要找Patient這個資源,但是,用了_has,也就是說,這個Pateint必須要有Observation。那我怎麼知道這個Observation是哪個Patient呢?那就是利用了Observation的查詢參數patient,而且呀,要求這個Observation的code這個欄位必須等於1234-5。
再看這範例(看看什麼叫做Chain)
GET [base]/Patient?_has:Observation:patient:_has:AuditEvent:entity:user=MyUserId
抓Patient,但需要有Observation,透過patient查詢參數連結。而這個Observation需要有AuditEvent,透過entity查詢參數連結,而且AuditEvent的查詢參數user必須等於MyUserId。

  • _type
一般而言,我們的查詢的URI是長這樣子:GET [base]/Observation?params... 也就是說,每次只能針對一種Resource來處理。如果,我們想一次抓好幾種Resource時,就要用這個查詢參數。
GET [base]/?_type=Observation,Condition&other params...

  • _query
這個也不是很懂。總之,就是預先定義好查詢條件,並且設定名稱。然後就可以直接使用。語法結構如下。照文件說是要與OperationDefinition這個Resource配合。


 GET [base]/Patient?_query=name&parameters...
=====
查詢後
=====

  • _sort

把查詢所得進行排序。其中前置符號有-,表示遞減排序。
GET [base]/Observation?_sort=status,-date,category

  • _count
這個不是只有多少筆數,而是頁數。什麼意思呢?例如透過Bundle回來的資源筆數非常多,我們可以切成批次,也就是分成數頁,每一次只傳回固定的項目。那_count就是告訴我們,調回來的資源被切成了幾頁是要求Server每一頁要有多少筆。(實作後之認知)

  • _include, _revinclude

Resource常常會參照到其他的Resource。如何在調閱時,也希望把相關參照到的資源也一塊調回來,就可以用_include。至於要找反過來被參考到的,則是用_revinclude。(沒實作過,不太清楚運作結果,已實作)

  • _summary

這個是非常重要的查詢參數,可以決定回傳資料包含哪些。範例
 GET [base]/ValueSet?_summary=true

value可以設定下列值:
    • true:Resource定義中,欄位被設定要放入summary者。
    • text:只傳回text, id, meta等Top-level的必要element。
    • data:不包含text element。也就是Human Readable那塊。
    • count:只傳回合乎條件的資源筆數,Resource沒傳回。
    • false:什麼都要傳。

有點要注意,當設_summary=text時,就不能合併_include與_revinclude。這個應該可以想得通吧。
  • _elements


如果覺得_summary所指定的element還是不適用,那就可以利用這個查詢參數來指定要哪些element回來。不過,那些必要的element,還是會一起回來。

  • _contained, _containedType

這個是講到串連條件的問題,誰包含誰。抱歉,我還是看不懂。

沒有留言:

張貼留言