FHIR Terminology Service

Kopei article

FHIR Terminology Service 术语服务

本文将正对HL7 FHIR R4的术语模块做一下介绍,包括官方文档和实现指引。

FHIR 术语模块的设计思路

HL7 的术语模块提供了一个整体的设计用于指引大家如何使用术语资源,以及相应的操作,数据类型,及外部和自定义术语库如何展示和交换信息。最终的目的是为了提供标准的术语服务支持 FHIR 资源间使用标准的编码系统。
术语模块主要有 5 个资源:

  • CodeSystem: 编码系统,描述术语的关键元素和定义。
  • ConceptMap: 定义一个编码系统的概念与另一个的映射关系。
  • ValueSet: 将一个或多个编码系统中用于特定目的的一组代码进行组合, 形成有特定含义的值集。
  • NamingSystem: 命名系统。
  • TerminologyCapabilities: 术语能力声明。

他们之间的关系可以用下图表示,
relation

实际使用中,我们在对接不同系统时可能只需做一下转换,把一个编码系统的值集映射成另一个编码系统的值集, 可能不一定需要命名系统,如下图所示。
vsmapping

术语服务

HL7 也给出标准的术语服务实施规范,用户在使用这个服务的时候可以做到不用十分了解编码系统、值集和映射概念。如果一个服务能满足如下列表要求,就可以在 FHIR 能力声明中宣称符合 FHIR 术语服务标准Terminology Service Capability Statement

  • 安全
  • 值集拓展, $expand 从值集中扩展返回一组编码列表,实际使用时类似高级 search。
  • 概念查找/分解, $lookup 查找资源的一个概念,值集或关系。
  • 值集验证, $validate-code 验证一个编码在值集中是否有效。
  • 包容性测试,$subsumes 查询两个代码之间是否存在(如果有的话)包含关系。
  • 批量验证
  • 翻译,$translate 使用 ConceptMap 资源,查找特定源概念被映射到的目标编码系统的概念。
  • 批量翻译
  • 可以维护一个闭环表

服务的安全要求

SSL 加密传输是强制要求。如果值集系统允许被实时维护,认证和审计机制也是必要的。

熟悉基本概念

由于术语服务是基于几个基本资源的,所以熟悉这些资源和使用方法对实现十分重要。基本资源包括:CodeSystem,ValueSet, ConceptMap. 以及熟悉如何在 FHIR 中使用编码(codesystem)。

如何在 FHIR 中使用编码

FHIR 中的资源很多会用到编码,这些编码往往是一串固定的值,代表一个特定的含义或概念。FHIR 这里的编码定义都是通过一对组合:systemcode. system的值是一个 url 指出哪里定义了这个编码,这个值需要区分大小写。

Key Value
system URI 指定编码的位置
version 版本
code 字符串表示一个概念
display 描述文字

编码在资源中定义时可以有多种数据类型,但都代表编码。

当编码在资源中定义时,可以有如下数据类型
code这数据类型只展示编码`code`, `system`隐含在元素中。
Coding这个数据类型定义一个标准的`code`和`system`对。
CodeableConcept`coding`另加上一个直白的文本字段.
另外,非资源元素定义时,如下字段也可以带着编码.或者内容当成编码,并绑定一个值集。
Quantity数量这个字段可以用`system`andcode定义单位的类型.
string有的时候string字符串也可以用来控制某个元素固定的几个值.
uri类似string, uri也可以当成编码元素

选择编码系统

system对应的 url 需要指向一个编码系统。编码系统可以有如下地址可以引用:

  • 本规范指定的编码系统仓库code system registry
  • 编码系统发布者定义的 URI 或者 OID
  • FHIR 社区的编码系统仓库,并且状态是active
  • HL7 OID registry 注册的 OID

下表是所有外部编码系统:

URI Source Comment OID (for non-FHIR systems)
http://snomed.info/sct SNOMED CT (IHTSDO) See Using SNOMED CT with FHIR 2.16.840.1.113883.6.96
http://www.nlm.nih.gov/research/umls/rxnorm RxNorm (US NLM) See Using RxNorm with FHIR 2.16.840.1.113883.6.88
http://loinc.org LOINC (LOINC.org) See Using LOINC with FHIR 2.16.840.1.113883.6.1
http://unitsofmeasure.org UCUM: (UnitsOfMeasure.org) Case Sensitive Codes See Using UCUM with FHIR 2.16.840.1.113883.6.8
http://ncimeta.nci.nih.gov NCI Metathesaurus See Using NCI Metathesaurus with FHIR 2.16.840.1.113883.3.26.1.2
http://www.ama-assn.org/go/cpt AMA CPT codes See Using CPT with FHIR 2.16.840.1.113883.6.12
http://hl7.org/fhir/ndfrt NDF-RT (National Drug File – Reference Terminology) See Using NDF-RT with FHIR 2.16.840.1.113883.6.209
http://fdasis.nlm.nih.gov Unique Ingredient Identifier (UNII) See Using UNII with FHIR 2.16.840.1.113883.4.9
http://hl7.org/fhir/sid/ndc NDC/NHRIC Codes See Using NDC with FHIR 2.16.840.1.113883.6.69
http://hl7.org/fhir/sid/cvx CVX (Vaccine Administered) See Using CVX with FHIR 2.16.840.1.113883.12.292
urn:iso:std:iso:3166 ISO Country & Regional Codes See Using ISO 3166 Codes with FHIR 1.0.3166.1.2.2
http://hl7.org/fhir/sid/dsm5 DSM-5 Diagnostic and Statistical Manual of Mental Disorders, Fifth Edition (DSM-5) 2.16.840.1.113883.6.344
http://www.nubc.org/patient-discharge NUBC code system for Patient Discharge Status National Uniform Billing Committee, manual UB-04, UB form locator 17 2.16.840.1.113883.6.301.5
http://www.radlex.org RadLex (Includes play book codes) 2.16.840.1.113883.6.256
ICD-9, ICD-10 WHO & National Variants See Using ICD-[x] with FHIR See ICD page for details
http://hl7.org/fhir/sid/icpc-1 ICPC (International Classification of Primary Care) NHG Table 24 ICPC-1 (NL) 2.16.840.1.113883.2.4.4.31.1
http://hl7.org/fhir/sid/icf-nl ICF (International Classification of Functioning, Disability and Health) 2.16.840.1.113883.6.254
http://terminology.hl7.org/CodeSystem/v2-[X](/v) Version 2 tables [X] is the 4 digit identifier for a table; e.g. http://terminology.hl7.org/CodeSystem/v2-0203 2.16.840.1.113883.12.[X]
http://terminology.hl7.org/CodeSystem/v3-[X] A HL7 v3 code system [X] is the code system name; e.g. http://terminology.hl7.org/CodeSystem/v3-GenderStatus see v3 list
https://www.gs1.org/gtin GTIN (GS1) Note: GTINs may be used in both Codes and Identifiers 1.3.160
http://www.whocc.no/atc Anatomical Therapeutic Chemical Classification System (WHO) 2.16.840.1.113883.6.73
urn:ietf:bcp:47 IETF language (see Tags for Identifying Languages - BCP 47 ) This is used for identifying language throughout FHIR. Note that usually these codes are in a code and the system is assumed
urn:ietf:bcp:13 Mime Types (see Multipurpose Internet Mail Extensions (MIME) Part Four - BCP 13 ) This is used for identifying the mime type system throughout FHIR. Note that these codes are in a code (e.g. Attachment.contentType) and in these elements the system is assumed. This system is defined for when constructing value sets of mime type codes
urn:iso:std:iso:11073:10101 Medical Device Codes (ISO 11073-10101) See Using MDC Codes with FHIR 2.16.840.1.113883.6.24
http://dicom.nema.org/resources/ontology/DCM DICOM Code Definitions The meanings of codes defined in DICOM, either explicitly or by reference to another part of DICOM or an external reference document or standard 1.2.840.10008.2.16.4
http://hl7.org/fhir/NamingSystem/ca-hc-din Health Canada Drug Identification Number A computer-generated eight-digit number assigned by Health Canada to a drug product prior to being marketed in Canada. Canada Health Drug Product Database contains product specific information on drugs approved for use in Canada. 2.16.840.1.113883.5.1105
http://hl7.org/fhir/sid/ca-hc-npn Health Canada Natural Product Number A computer-generated number assigned by Health Canada to a natural health product prior to being marketed in Canada. 2.16.840.1.113883.5.1105
http://nucc.org/provider-taxonomy NUCC Provider Taxonomy The Health Care Provider Taxonomy code is a unique alphanumeric code, ten characters in length. The code set is structured into three distinct “Levels” including Provider Type, Classification, and Area of Specialization. 2.16.840.1.113883.6.101
Code Systems for Genetics
http://www.genenames.org HGNC: Human Gene Nomenclature Committee 2.16.840.1.113883.6.281
http://www.ensembl.org ENSEMBL reference sequence identifiers Maintained jointly by the European Bioinformatics Institute and Welcome Trust Sanger Institute not assigned yet
http://www.ncbi.nlm.nih.gov/refseq RefSeq: National Center for Biotechnology Information (NCBI) Reference Sequences 2.16.840.1.113883.6.280
http://www.ncbi.nlm.nih.gov/clinvar ClinVar Variant ID NCBI central repository for curating pathogenicity of potentially clinically relevant variants not assigned yet
http://sequenceontology.org Sequence Ontology not assigned yet
http://varnomen.hgvs.org HGVS: Human Genome Variation Society 2.16.840.1.113883.6.282
http://www.ncbi.nlm.nih.gov/projects/SNP DBSNP: Single Nucleotide Polymorphism database 2.16.840.1.113883.6.284
http://cancer.sanger.ac.uk/cancergenome/projects/cosmic COSMIC: Catalogue Of Somatic Mutations In Cancer 2.16.840.1.113883.3.912
http://www.lrg-sequence.org LRG: Locus Reference Genomic Sequences 2.16.840.1.113883.6.283
http://www.omim.org OMIM: Online Mendelian Inheritance in Man 2.16.840.1.113883.6.174
http://www.ncbi.nlm.nih.gov/pubmed PubMed 2.16.840.1.113883.13.191
http://www.pharmgkb.org PHARMGKB: Pharmacogenomic Knowledge Base PharmGKB Accession ID 2.16.840.1.113883.3.913
http://clinicaltrials.gov ClinicalTrials.gov 2.16.840.1.113883.3.1077
http://www.ebi.ac.uk/ipd/imgt/hla European Bioinformatics Institute 2.16.840.1.113883.6.341

编码系统的复杂表达

由于真实世界经常涉及通过组合多个概念或属性来创建复合术语,同时很多编码系统内部的概念之间会有各种关系,比如相等,包含,属于等等多种关系。编码系统如SNOMED-CT就设计了表达式来支持更细节的临床意义表达。这些特征可以在CodeSystem资源来展示,并通过上述的几种数据类型进行数据交换。

1
2
3
4
5
{
"system" : "http://snomed.info/sct",
"code" : "80146002 |appendectomy| : 260870009 |priority| = 25876001 |emergency|"
}
## 阑尾炎切除手术紧急 concept: refinement(key=value)

元素编码值绑定

当一个元素和值集绑定时,绑定有如下属性:

Name Description
Strength 绑定的强度,灵活度
Reference URL 指定值集路径
Description 编码使用的描述信息

几乎所有的元素都有被编码的数据类型,这个数据类型和一个值集绑定。绑定的强度可以有多种程度:

strength Description
required 必须遵循,元素中的这个概念必须被指定值集
extensible 必须遵循,值集的绑定可以通过扩展方式提供可替代的概念。但不是扩展值集本身
preferred 推荐使用特定编码来提高互操作性,但不是强制要求
example 没有例子可以使用来绑定值集

$expand 操作

术语服务的“值集扩展”是指将值集从另一个编码系统引入编码的过程, 为了使其概念更容易在特定上下文中使用和处理。该过程确保了值集所代表的信息在真实复杂的医疗环境中被明确理解,并且可以轻松地被各种医疗保健应用程序和系统使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
### 扩展查询第23值集,过滤“abdo”

GET [base]/ValueSet/23/$expand?filter=abdo
Expanding a value set that is specified by the client (using JSON):

POST [base]/ValueSet/$expand
[other headers]

{
"resourceType" : "Parameters",
"parameter" : [
{
"name" : "valueSet",
"resource" : {
"resourceType" : "ValueSet",
[value set details]
}
}
]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
## 返回
HTTP/1.1 200 OK
[other headers]

<ValueSet xmlns="http://hl7.org/fhir">
<!-- the server SHOULD populate the id with a newly created UUID
so clients can easily track a particular expansion -->
<id value="43770626-f685-4ba8-8d66-fb63e674c467"/>
<!-- no need for meta, though it is allowed for security labels, profiles -->

<!-- other value set details -->
<expansion>
<!-- when expanded -->
<timestamp value="20141203T08:50:00+11:00"/>
<contains>
<!-- expansion contents -->
</contains>
</expansion>
</ValueSet>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 搜索acme.org中Systolic展示的编码
POST /ValueSet/$expand
Content-Type: application/fhir+json

{
"resourceType": "ValueSet",
"compose": {
"include": [ {
"system": "http://acme.org",
"filter": [ {
"property": "display",
"op": "=",
"value": "Systolic"
} ]
} ]
}
}

$lookup 概念查找

一个外部系统可以向术语服务器发出查询操作来获取关于特定的系统/代码组合的一组信息。服务器会返回用于显示和处理的信息。
例如,通过已知 valueset 23 其验证一个 codesystem 概念:

1
GET [base]/ValueSet/23/$validate-code?system=http://loinc.org&code=1963-8&display=test

通过指定一个 value set 来验证 CodeableConcept:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
POST [base]/ValueSet/$validate-code
[other headers]

{
"ResourceType" : "Parameters",
"parameter" : [
{
"name" : "coding",
"valueCodeableConcept" : {
"coding" : {
"system" : "http://loinc.org",
"code" : "1963-8",
"display" : "test"
}
}
},
{
"name" : "valueSet",
"resource": {
"resourceType" : "ValueSet",
[etc.]
}
}
]
}

## Response
HTTP/1.1 200 OK
[other headers]

{
"resourceType" : "Parameters",
"parameter" : [
{
"name" : "result",
"valueBoolean" : false
},
{
"name" : "message",
"valueString" : "The display \"test\" is incorrect"
},
{
"name" : "display",
"valueString" : "Bicarbonate [Moles/volume] in Serum"
}
]
}

$translate 概念转化

客户端可以向服务器请求将一个概念从一个值集转换为另一个值集。通常,这用于在编码系统之间进行转换(例如从 LOINC 转换为 SNOMED CT,或从 HL7 V3 代码转换为 HL7 V2 代码)。
例子:把 FHIR 复合状态映射成 v3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
GET [base]/ConceptMap/$translate?system=http://hl7.org/fhir/composition-status
&code=preliminary&source=http://hl7.org/fhir/ValueSet/composition-status
&target=http://terminology.hl7.org/ValueSet/v3-ActStatus

HTTP/1.1 200 OK
[other headers]

{
"resourceType" : "Parameters",
"parameter" : [
{
"name" : "result",
"valueBoolean" : true
},
{
"name" : "outcome",
"valueCoding" : {
"system" : "http://terminology.hl7.org/CodeSystem/v3-ActStatus",
"code" : "active",
}
}
]
}

几个具体实现

市面上有大部分术语库有自己的fhir terminology service实现,如:

  • SNOMED实现的snowstorm , 支持SNOMED CT, LOINC, ICD-10, ICD-10-CM等等。当然对SNOMED-CT的支持更好。
  • Snow-owl 开源版本支持SNOMED-CT, 付费版本支持LOINC,ICD-10等等。

推荐阅读

  • Post title:FHIR Terminology Service
  • Post author:Kopei
  • Create time:2023-08-10 11:12:12
  • Post link:https://kopei.github.io/2023/08/10/FHIR-Terminology-Service/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.
 Comments