2019年8月15日 星期四

HL7 FHIR 核心觀念 - Terminology

編碼系統:
1. 他很重要。
2. 有點複雜。
3. 與之前的標準用法不同。
4. 很多人都用錯了。
我得小心說明之。
打開Terminology Module,首先看到的是這張圖。

回顧一下我們目前累積的知識,Resource會由許多欄位所組成的結構。某些欄位的資料型態,若為code/coding/CodeableConcept的話,在Resource文件中,就會特別列出一個節,來說明這些欄位的Terminology Bindings。以Condition這個Resource為例,他有Code欄位,其資料型態是CodeableConcept。
表中說他的Type是Example。也就是說,他只能給你範例,要看情境來設定。反過來說,他不是固定值。
接著他說,請參考(Reference,也叫Bind)Codition/Problem/DiagnosisCodes,這是Value Set,URL: http://hl7.org/fhir/ValueSet/condition-code。在這可以看到詳細定義。

什麼是Value Set。他不等同於Coding System。這個是目前我所知道有在玩FHIR的人,常常誤解之處。
Value Set是來自不同的Coding System組合成一個編碼集合。欄位的內容值是被綁定在Value Set上。
有時候,並不可能把所有編碼系統的編碼內容拿過來擺,在Value Set的說明頁中,就會註記。
原來code/coding/CodeableConcept(Value Set)的內容包含了編碼名稱系統http://snomed.info/sct中(他是SNOMED CT編碼系統),Conceopt Code是404684003者。另外,再加上相同編碼系統(其他的可能就是不同編碼系統)的160245001這個編碼。(一個是concept code,一個是code value,請注意)。
現在,一開始的圖有看懂了嗎?
==========
其實沒有這麼簡單,Terminology是一個模組,裡面還有好多東西。
有人說FHIR很簡單,而我是越研究越害怕。
==========
抱歉,有點草草結束的感覺。哀~再寫下去我又要掉眼淚了。給張圖吧。

2019年8月9日 星期五

HL7 FHIR 核心觀念 - Profile

講完Extension不提Profiles也是很奇怪。因為兩者都是透過StructureDefinition這個Resource來定義的。這個結構有點複雜,而且有很多constrains要注意,實在不適合放在入門階段來說明。所以,還是把這個放下,先從理解Profiles開始。
Profiles說穿了就是因應特定情境下,把Resource的用法(就是Constrain)加以明確規範之。原文是:adapted to particular use cases。
討論這個,又引發另外一個核心觀念就是Conformance(一致性),他已經複雜到可形成一個位於Level 2的Module。FHIR實踐一致性的方法有:
Implementation Guide (IG) A coherent and bounded set of adaptations that are published as a single unit. Validation occurs within the context of the Implementation Guide
Package A group of related adaptations that are published as a group within an Implementation Guide
Conformance ResourceA single resource in a package that makes rules about how an implementation works. These are described below
ProfileA set of constraints on a resource represented as a structure definition with kind = constraint
所以,Profile只是其中一個手段,而這個手段就是基於Resource建立constraint。在Resource的頁面中,會有一個Profiles & Extensions的頁籤。並不是所有的Resource會有Profile,也不表示未來不會有。像Observation這種比較抽象的Resource,就會有很多Profile來對特殊情境加上Constrains。

接著我們就用BMI這個描述檔(路徑http://hl7.org/fhir/StructureDefinition/bmi,雖然這是HTML檔案,其實是StructureDefinition,有工具可以轉換。哈~又挖一個坑)來說明吧。

要用Observation 來表達BMI時,需遵照這個Profile定義。
  1. code這個元素,需填入這些值。
  2. value[x]必須是Quantity資料型態,且需填入這些值。Quantity.value就是BMI的內容值。
  3. 與原始Observation比較,會有8個必填元素、4個必須支持的元素、有4個元素是固定值。可透過Differential Tables知道內容。
NameFlagsCard.TypeDescription & Constraints
.. Observation0..*FHIR Body Mass Index (BMI) Profile
... code1..1CodeableConceptBody Mass Index (BMI)
.... codingCodingSlice: Unordered, Open by value:code, value:system
.... coding1..1Coding
..... system1..1uriFixed Value: http://loinc.org
..... code1..1codeFixed Value: 39156-5
... valueQuantity1..1Quantity
.... valueS1..1decimal
.... unitS1..1string
.... systemS1..1uriFixed Value: http://unitsofmeasure.org
.... codeS1..1codeCoded responses from the common UCUM units for vital signs value set.
Fixed Value: kg/m2
來看看實際範例(XML內容)。標注綠底的部分,就是實際應用的內容。
<?xml version="1.0" encoding="UTF-8"?>

<Observation xmlns="http://hl7.org/fhir">
  <id value="bmi"/> 
  <meta> 
    <profile value="http://hl7.org/fhir/StructureDefinition/vitalsigns"/> 
  </meta> 
  <text> <status value="generated"/> <div xmlns="http://www.w3.org/1999/xhtml"><p> <b> Generated Narrative with Details</b> </p> <p> <b> id</b> : bmi</p> <p> <b> meta</b> : </p> <p> <b> status</b> : final</p> <p> <b> category</b> : Vital Signs <span> (Details : {http://terminology.hl7.org/CodeSystem/observation-category code 'vital-signs'
           = 'Vital Signs', given as 'Vital Signs'})</span> </p> <p> <b> code</b> : BMI <span> (Details : {LOINC code '39156-5' = 'Body mass index (BMI) [Ratio]', given as 'Body mass
           index (BMI) [Ratio]'})</span> </p> <p> <b> subject</b> : <a> Patient/example</a> </p> <p> <b> effective</b> : 02/07/1999</p> <p> <b> value</b> : 16.2 kg/m2<span>  (Details: UCUM code kg/m2 = 'kg/m2')</span> </p> </div> </text> <status value="final"/> 
  <category> 
    <coding> 
      <system value="http://terminology.hl7.org/CodeSystem/observation-category"/> 
      <code value="vital-signs"/> 
      <display value="Vital Signs"/> 
    </coding> 
    <text value="Vital Signs"/> 
  </category> 
  <code> 
    <coding> 
      <system value="http://loinc.org"/> 
      <code value="39156-5"/> 
      <display value="Body mass index (BMI) [Ratio]"/> 
    </coding> 
    <text value="BMI"/> 
  </code> 
  <subject> 
    <reference value="Patient/example"/> 
  </subject> 
  <effectiveDateTime value="1999-07-02"/> 
  <valueQuantity> 
    <value value="16.2"/> 
    <unit value="kg/m2"/> 
    <system value="http://unitsofmeasure.org"/> 
    <code value="kg/m2"/> 
  </valueQuantity> 
</Observation> 

在描述檔圖片最後部分有看到一個Slices吧,這又是另一個核心觀念(另一個坑),很簡單但不好說明。

HL7 FHIR 核心觀念 - Extension

既然談到FHIR與CDA R2的差異點,那就不得不趕緊討論Extensibility。
FHIR有一個觀念稱之為80-20。也就是FHIR已經完成80%的定義,剩下20%給標準制定者彈性空間。CDA R2就沒有這麼好命,標準制定者常常得把實務情境的需求,硬在既有規範中找到適合的地方來呈現。若對CDA R2的整體規範不熟悉時,就會造成一份不倫不類的實作指引書。雖然只是20%自訂,但面對一個複雜的醫療資訊情境,這塊的發展已經有點爆炸了。
先題一下,相對於FHIR的擴充性,還有一個觀念是Profile。他不是擴充,他是利用既有之Resource作更明確的定義。使用Extesnion僅止於欄位層級之擴充,使用自己熟悉的名稱,來定義Extesion結構。這塊只能建議說台灣要儘速建立管理機制,否則容易變成一發不可收拾。
先來看看Extesion的結構。
Structure
NameFlagsCard.TypeDescription & Constraints
.. ExtensionINElementOptional Extensions Element
+ Rule: Must have either extensions or value[x], not both
Elements defined in Ancestors: idextension
... url1..1uriidentifies the meaning of the extension
... value[x]0..1*Value of extension
  1. Extension繼承自Element,所以他是資料型態。嚴格歸類的話他是Special Purpose Data types的一員。還記得Element的結構嗎?是的,他也有Extension欄位,所以...。
  2. url是指向定義這個Extension的詳細規範,這個是必要欄位。前面的圖形符號表示是個primative type。
  3. value[x],這個Extension用在Resource案例時,所攜帶的內容值。若沒有內容值,那表示需要有sub-extensions(來自Element)。前面的圖形符號代表他是一個element。
  4. 這個內容值的資料型態可以包含下列其中一種(應該說現有資料型態都可以):
    1. valueBase64Binary: base64Binary
    2. valueBoolean: boolean
    3. valueCanonical: canonical
    4. valueCode: code (only if the extension definition provides a fixed binding to a suitable set of codes)
    5. valueDate: date
    6. valueDateTime: dateTime
    7. valueDecimal: decimal
    8. valueId: id
    9. valueInstant: instant
    10. valueInteger: integer
    11. valueMarkdown: markdown
    12. valueOid: oid
    13. valuePositiveInt: positiveInt
    14. valueString: string
    15. valueTime: time
    16. valueUnsignedInt: unsignedInt
    17. valueUri: uri
    18. valueUrl: url
    19. valueUuid: uuid
    20. valueAddress: Address
    21. valueAge: Age
    22. valueAnnotation: Annotation
    23. valueAttachment: Attachment
    24. valueCodeableConcept: CodeableConcept
    25. valueCoding: Coding
    26. valueContactPoint: ContactPoint
    27. valueCount: Count
    28. valueDistance: Distance
    29. valueDuration: Duration
    30. valueHumanName: HumanName
    31. valueIdentifier: Identifier
    32. valueMoney: Money
    33. valuePeriod: Period
    34. valueQuantity: Quantity
    35. valueRange: Range
    36. valueRatio: Ratio
    37. valueReference: Reference - a reference to another resource
    38. valueSampledData: SampledData
    39. valueSignature: Signature
    40. valueTiming: Timing
    41. valueContactDetail: ContactDetail
    42. valueContributor: Contributor
    43. valueDataRequirement: DataRequirement
    44. valueExpression: Expression
    45. valueParameterDefinition: ParameterDefinition
    46. valueRelatedArtifact: RelatedArtifact
    47. valueTriggerDefinition: TriggerDefinition
    48. valueUsageContext: UsageContext
    49. valueDosage: Dosage

來看看範例1
<name>
  <extension url="http://hl7.org/fhir/StructureDefinition/iso21090-EN-use" >
    <valueCode value="I" />
  </extension>
  <text value="Chief Red Cloud"/>
</name>
  1. 此extension的定義是在(url)http://hl7.org/fhir/StructureDefinition/iso21090-EN-use(備註:原本的範例內容的url是錯誤的)。其結構如下:
  2. Summary
    NameFlagsCard.TypeDescription & Constraints
    .. EN-use0..1codeURL = http://hl7.org/fhir/StructureDefinition/iso21090-EN-use
    EN-use: A set of codes advising a system or user which name in a set of names to select for a given purpose.


    Binding: EntityNameUseR2 (required)
    Use on Element ID HumanName
  3. 根據上述Url找到了定義。其資料型態是code。也就是說,他的element的名稱是valueCode。
  4. 是element就會有value。再根據定義,這個編碼必須遵循 EntityNameUseR2 這個value set。
  5. 經查目前value的I,其顯示名稱Indigenous/Tribal,定義內容為:Description:e.g . Chief Red Cloud(抱歉,我也不知何意)
範例2
<Patient>
  <extension url="http://hl7.org/fhir/StructureDefinition/patient-citizenship" >
    <extension url="code" >
      <valueCodeableConcept>
        <coding>
          <system value="urn:iso:std:iso:3166" />
          <code value="DE" />
        </coding>
      </valueCodeableConcept>
    </extension>
    <extension url="period" >
      <valuePeriod>
        <start value="2009-03-14" />
      </valuePeriod>
    </extension>
  </extension>
  <!-- other data for patient -->
</Patient>
  1. 根據rul我們找到了定義。其結構如下:
  2. Summary
    NameFlagsCard.TypeDescription & Constraintsdoco
    .. citizenship0..*ExtensionURL = http://hl7.org/fhir/StructureDefinition/patient-citizenship
    citizenship: The patient's legal status as citizen of a country.


    Use on Element ID Patient
    ... code0..1CodeableConceptNation code representing the citizenship of patient.
    ... period0..1PeriodPeriod when citizenship was effective.
  3. 原來他使用了element的extension(我怎麼知道,看前方圖形符號)。
  4. 因為code與period都是extension所以,都要遵守extension的規範。但這兩個是依附在citizenship,沒有自己的定義url。所以,採用的是名稱。
還有一種extension稱之為Modifier Extensions,因為還不懂,也沒遇到。也就不多說了。