2018年12月31日 星期一

HL7 FHIR 資料型態篇 - Special Purpose

下圖是屬於這類型的Data Type關係。雖然短短幾個,但背後都有故事。

BackboneElement

這個會出現在Resource結構中,連結到另一個物件時(不是參照,在UML圖中會多畫一個類別),會用BackboneElement當作其Data Type。
NameFlagsCard.TypeDescription & Constraints
.. BackboneElementNElementBase for elements defined inside a resource
Elements defined in Ancestors: idextension
... modifierExtension?!Σ0..*ExtensionExtensions that cannot be ignored even if unrecognized
這個有點像過渡,只有一個modifierExtension Element,而其Type是Extension。Extension在HL7 FHIR中是非常重要觀念,他是80/20法則。會有專篇介紹,只是還沒寫到。
但是,這裡的Extension卻是很重要,他是說,無論如何這個擴展的都不能忽略。

有三個Data Types是直接繼承於BackboneElement: TimingDosageElementDefinition。Time已經談過。ElementDefinition得單獨討論之。

Extension

這個概念很簡單(80/20),但應用面卻很廣,很難駕馭,甚至需要有個管理機制。看到values[x]的Type打個*,就知道很麻煩了。這部份會有專章來討論Extension。
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

Meta

所有的Resource(已命名化的類別)都會繼承自Resource父類別(透過DomainResource),其中有個meta Element的Type就是Meta。
這邊要補充一下,還有另一組Data Type叫Metadata Type,包含有ContactDetail、Contributor、DataRequirement、RelatedArtifact、UsageContext、ParameterDefinition、Expression與TriggerDefinition。這個是不同的東西。
NameFlagsCard.TypeDescription & Constraints
.. MetaΣNElementMetadata about a resource
Elements defined in Ancestors: idextension
... versionIdΣ0..1idVersion specific identifier
... lastUpdatedΣ0..1instantWhen the resource version last changed
... sourceΣ0..1uriIdentifies where the resource comes from
... profileΣ0..*canonical(StructureDefinition)Profiles this resource claims to conform to
... securityΣ0..*CodingSecurity Labels applied to this resource
SecurityLabels (Extensible)
... tagΣ0..*CodingTags applied to this resource
Common Tags (Example)

  • Meta.versionId: id [0..1]
用來管控版本。每當對Resource有進行編修時,就會給一個新的versionId。FHIR接受全域唯一或者本地唯一的編碼。注意,並不是所有的Server都會支援,更不可期望,versionId的順序性跟版本先後有關。
  • Meta.lastUpdated: instant [0..1]
最近異動時間
  • Meta.source: uri [0..1]
講這又有點頭痛,他跟Security有關,又要一系列。HL7 FHIR是對外提供Content服務的機制,但這個Content會有原始來源,也許是某個EMR System所管理的Document Repository.
  • Meta.profile: canonical(StructureDefinition) [0..1]
講這個也很頭痛,這是有關實作計劃書(profiling)的一塊,這也要一系列討論。總之,FHIR乍聽、乍看之下好像很簡單,很容易。但是,身為一個標準,他就必須保持最高的一致性。(國內的HL7 FHIR專家,似乎還沒察覺這塊重要性。不好意思,我總是喜歡得罪人)
  • Meta.security: Coding(SecurityLabels) [0..1]
這塊屬於Security Label的一環。
  • Meta.tag: Coding(Common Tags) [0..1]
使用Common Tags Value Set。只有一個值actionable。

Narrative、xhtml

其實這兩個是同一件事情,解決Human Readable的問題。這個需要用一篇來談。
NameFlagsCard.TypeDescription & Constraints
.. NarrativeNElementHuman-readable summary of the resource (essential clinical and business information)
Elements defined in Ancestors: idextension
... status1..1codegenerated | extensions | additional | empty
NarrativeStatus (Required)
... divI1..1xhtmlLimited xhtml content
+ Rule: The narrative SHALL contain only the basic html formatting elements and attributes described in chapters 7-11 (except section 4 of chapter 9) and 15 of the HTML 4.0 standard, <a> elements (either name or href), images and internally contained style attributes
+ Rule: The narrative SHALL have some non-whitespace content

  • Narrative.status: code(NarrativeStatus) [1..1]
這個跟實作很有關係。在推動CDA R2時,就有這個問題。Level2的結構,到底跟Level3是什麼關係。可時,國內無能力搞Level3,所以,這個問題就不存在。
NarrativeStatus(Value Set)的四個值,剛好都來自
http://hl7.org/fhir/narrative-status (Code System)。

CodeDisplayDefinition
generatedGeneratedNarrative的全部內容是來自Resource的主要Element
extensionsExtensionsNarrative的全部內容是來自Resource的主要Element之外,還包含了extension的部分。
additionalAdditional在Narrative的內容,並非全部來自結構化資料(來自Element),所以,得靠人工檢查內容。
emptyEmpty就算Narrative有內容,也不是給Human閱讀用。
  • Narrative.div: xhtml [1..1]
Human Readable的部分採用HTML 4.0的標準規範,但不包含<HTML>、<Head>與<Body>,是直接用<DIV>給打包起來。也就是說,他不是一個頁面,他是一個Component(如果你用SPA的概念來看的話)或者他是一個Partial View(用ASP.NET MVC的概念來看的話)。一些特殊用途的機制盡量不用,他只是很單純用HTML的語法來呈現Human Readable的部分。

Reference

參照機制也是HL7 FHIR中非常重要的機制,他有好幾種實作方式,的確有點複雜,需要一篇來仔細說明之。
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..1string
Text alternative for the resource

其中reference,identifier與display三者必須要有一個有值。
  • Reference.reference: string [0..1]
外部資源的參照路徑。從實作角度,他可以提供絕對路徑與相對路徑。使用相對路徑就一定得存取同一台HL7 FHIR Server的資料。
相對:
 <subject>
    <reference value="Patient/034AB16" />
  </subject>
絕對:
{
  "profile" : {
    "reference" : "http://fhir.hl7.org/svc/StructureDefinition/c8973a22-2b5b-4e76-9c66-00639c99e61b"
  }
}

  • Reference.type: uli [0..1]
type是強化reference。弄個範例瞧瞧。這是某個Resource有subject這個Element,然後他的Type是Reference。這個Reference同時使用了reference與uli。
"subject": {
   "reference" : "http://someserver/some-path",
   "type" : "Patient"
 }
上面的式子,其實等於單獨reference的URL然後再加上Patient。
所以,這兩個合併使用要注意。若你的refencece是:http://hl7.org/fhir/StructureDefinition/ ,而type又加了個Patient,那最後產生的URL會是:http://hl7.org/fhir/StructureDefinition/Patient。這樣子就不對了。
  • Reference.identifier: Identifier [0..1]
有時候需要參照的資料並不是在HL7 FHIR Server上,那就得要明確的指出資料之所在。而且這個指稱的ID,是業務流程辨識碼(business identifier,外部系統定義的),並非資源辨識碼(resource idnetifier,Server給的)。
  • Reference.display: string [0..1]
這個只是用來簡單描述所參照的資源是什麼,並不是把所參照的資源內容搬過來(這是contained要做的事)。

Dosage

這個有點麻煩,雖然是放在這兒,但是他是屬於被人崁入的Data Type(他繼承於BackboneElement)。他是屬於Level 4的Medications Module的內容。會用到他的Resource有:ActivityDefinition, MedicationDispense, MedicationKnowledge, MedicationRequest 與 MedicationStatement
這邊就不多作解釋。
NameFlagsCard.TypeDescription & Constraints
.. DosageΣTUBackBoneElementHow the medication is/was taken or should be taken Elements defined in Ancestors: idextensionmodifierExtension
... sequenceΣ0..1integerThe order of the dosage instructions
... textΣ0..1stringFree text dosage instructions e.g. SIG
... additionalInstructionΣ0..*CodeableConceptSupplemental instruction or warnings to the patient - e.g. "with meals", "may cause drowsiness"
SNOMED CT Additional Dosage Instructions (Example)
... patientInstructionΣ0..1stringPatient or consumer oriented instructions
... timingΣ0..1TimingWhen medication should be administered
... asNeeded[x]Σ0..1Take "as needed" (for x)
SNOMED CT Medication As Needed Reason Codes (Example)
.... asNeededBooleanboolean
.... asNeededCodeableConceptCodeableConcept
... siteΣ0..1CodeableConceptBody site to administer to
SNOMED CT Anatomical Structure for Administration Site Codes (Example)
... routeΣ0..1CodeableConceptHow drug should enter body
SNOMED CT Route Codes (Example)
... methodΣ0..1CodeableConceptTechnique for administering medication
SNOMED CT Administration Method Codes (Example)
... doseAndRateΣ0..*ElementAmount of medication administered
.... typeΣ0..1CodeableConceptThe kind of dose or rate specified
DoseAndRateType (Example)
.... dose[x]Σ0..1Amount of medication per dose
..... doseRangeRange
..... doseQuantitySimpleQuantity
.... rate[x]Σ0..1Amount of medication per unit of time
..... rateRatioRatio
..... rateRangeRange
..... rateQuantitySimpleQuantity
... maxDosePerPeriodΣ0..1RatioUpper limit on medication per unit of time
... maxDosePerAdministrationΣ0..1SimpleQuantityUpper limit on medication per administration
... maxDosePerLifetimeΣ0..1SimpleQuantityUpper limit on medication per lifetime of the patient

ElementDefinition

這個用來定義Element或者Extension。從製造業的角度,這個叫做工作母機,專門來製造各種Element之用。而這個傢伙只用在 StructureDefinition(這個Resource 被歸類在Conformance)。這個非常複雜,一定得專篇介紹。