2019年8月9日 星期五

HL7 FHIR 核心觀念 - References

References的機制是造成CDA R2與FHIR最大差異點之一。
先就從Document的角度來看。CDA R2很明確,就是當時事件發生時,把所有的資料打包成一份完整的xml文件。FHIR的話,你要視為文件,那就建議採用Composition這個Resource。其中section的元素結構如下(Composition的結構有點大,就不列出)

這個就是對應到CDA R2的Section,也就是Level 2。在往下看,有一個entry,他就叫對應到Level 3的部分。但注意看其資料型態是Reference(Any),這是說可以連結到任何Resource。

所以,這時候有一個很詭異的點,也是初學實作FHIR者常犯的錯誤。在產生這份FHIR文件之前,這些被Reference的Resource必須要先存在。(這也是我要強調的,搞好FHIR的大前提是有一個功能完整的EMR System)。你可以說他們叫low couple。
細節就不想討論了。回歸正題,References機制到底有幾種。注意,R3與R4的描述有差異。這邊討論的是R4。
  1. Resource references:也就是R3所說的內部參照。
  2. Canonical references:也就是R3所說的外部參照。
還是先看看References的結構
Structure
NameFlagsCard.TypeDescription & Constraints
.. ReferenceΣINElementA reference from one resource to another
+ Rule: SHALL have a contained resource if a local reference is provided
Elements defined in Ancestors: idextension
... referenceΣI0..1stringLiteral reference, Relative, internal or absolute URL
... typeΣ0..1uriType the reference refers to (e.g. "Patient")
ResourceType (Extensible)
... identifierΣ0..1IdentifierLogical reference, when literal reference is not known
... displayΣ0..1stringText alternative for the resource

  1. 他繼承了Element,所以他是Data Tyep。自然會有Element的屬性。
  2. reference:這是指向參考的位置。其型態是string,所以彈性很大。這邊可以動很多手腳。
  3. type:這個是用來定義是指向哪種Resource。
  4. identifier:這個真的要好好解釋(很多人觀念都錯了)。這個不是Logic Id,他不是FHIR Server給的。而是EMR、LIS或者其他產生這個Resource案例的資料源所給定的ID。若是LIS,他有可能是一個檢驗單號。
  5. display:就是顯示名稱。有完HTML的話,就是包覆在<a>與</a>中間的文字。

有了以上的基礎後,再來看看,各種參考模式要如何套用。
最簡單且常用的模式,在同一台FHIR Server上,採用相對路徑指向另一個Resource案例。
<subject>
    <reference value="Patient/034AB16" />
  </subject>
當然,這個參照並不一定要掛Resource,可用絕對路徑指向符合URL的資源。
{
  "profile" : {
    "reference" : "http://fhir.hl7.org/svc/StructureDefinition/c8973a22-2b5b-4e76-9c66-00639c99e61b"
  }
}
若指向的參照有版本的話,其URL就把版次的語法拿來用即可。
<target>
    <reference value="http://example.org/fhir/Observation/1x2/_history/2" />
  </target>
以上這幾種情境,都叫做Literal References。
還有一種情境,我們並不知道Resource案例,只知道要參考資訊來源。這種叫Logical References。
<patient>
    <identifier>
      <system value="http://hl7.org/fhir/sid/us-ssn" />
      <value value="000111111" />
    </identifier>
  </patient>
無論是Literal還是Logical,都可以補上簡短描述。
<custodian>
    <reference value="Organization/123" />
    <display value="HL7, Inc" />
  </custodian>
最後還有一種情境,跟上面完全不同。上面都是主體與參考分開來。接著要題的是參考的Resource,合併在主體上。直接看範例。
<Condition xmlns="http://hl7.org/fhir">
  <contained>
    <Practitioner>
      <id value="p1"/>
      <name>
        <family value="Person"/>
        <given value="Patricia"/>
      </name>
    </Practitioner>
  </contained>
  <!-- other attributes -->
  <asserter>
    <reference value="#p1" />
  </asserter>
  <!-- other attributes -->
 </Condition>
  1. Reference的value是被參照resource的Id前加"#"。
  2. 要被參照的Resource,整個放在contained元素之下。
  3. 被參照元素的id不是FHIR Server給的,而是自訂,注意要與主體reference的內容值相同。
  4. 這個contained元素是來自DomainResource。
R4還多了一種情境是Circular Resource References,還沒很懂,就不多說了。

沒有留言:

張貼留言