InterSystems IRIS 数据库 FHIR 实现详解与代码示例
一、概述
InterSystems IRIS for Health(IRIS医疗版)是原生支持 HL7 FHIR 标准的医疗数据与集成平台,内置完整的 FHIR 服务器、资源存储库、格式转换引擎与互操作编排能力。它既可以作为原生 FHIR 数据仓库使用,也可以作为 FHIR 网关对接传统医疗系统,完全遵循 FHIR RESTful API 规范,同时支持与 HL7 v2、CDA、DICOM 等 legacy 医疗格式的无缝互转。
二、核心架构与组件
2.1 整体架构
IRIS 医疗版以 FHIR 资源库为核心,对外通过标准化 FHIR API 向应用层提供服务,对内通过转换组件对接 CDA 文档库、HL7 v2 历史数据源等异构系统,实现医疗数据的统一接入与标准化输出。

图1 InterSystems IRIS医疗版FHIR整体架构
2.2 三大核心组件
IRIS 提供三种 FHIR 部署模式,适配不同业务场景:
- FHIR Repository(FHIR 存储库)
原生以 FHIR 格式存储所有医疗资源,支持完整的 CRUD、搜索、版本历史与批量操作,具备 ACID 事务特性与高性能索引能力,适合作为中心 FHIR 数据底座使用。 - FHIR Façade(FHIR 外观)
部署在非 FHIR 业务系统前端,对外提供统一的 FHIR API,内部将 FHIR 请求转换为对底层数据库的操作,无需改造原有数据结构即可快速对外输出 FHIR 能力,适合存量 HIS、EMR 系统的快速 FHIR 化改造。 - FHIR Broker(FHIR 代理)
作为多系统的数据流转中枢,协调多个 FHIR/非 FHIR 系统之间的请求路由、事务管理与安全控制,充当医疗数据交换的“清算所”,适合复杂医疗生态下的跨系统数据互通。
三、IRIS FHIR 核心规则与特性
3.1 规范与版本支持
- 原生完整支持 FHIR R4(4.0.1),高版本同时兼容 R5 核心特性
- 实现全部 FHIR RESTful 交互:read、vread、update、delete、search、history、create 等
- 支持 FHIR Profile、Extension、ValueSet、CodeSystem 等构造型资源,可通过 FHIR 包管理器导入 US Core、IPA 等行业标准 Profile
3.2 资源验证规则
- 所有写入资源默认执行结构校验,严格匹配对应 Profile 的字段约束、基数与术语绑定
- IRIS 强制要求 Profile 的规范 URL 必须携带版本号,避免版本歧义导致的数据校验异常
- 支持通过资源
meta.profile字段指定校验规则,服务端自动执行合规性检查
3.3 安全与权限
- 原生支持 SMART on FHIR + OAuth 2.0 认证授权体系
- 支持基于令牌作用域(scope)的细粒度访问控制,可限制单用户可访问的资源类型与操作权限
- 内置全量审计日志,记录所有 FHIR API 的请求来源、操作类型与资源变更
3.4 扩展能力
- 内置 HL7 v2 ↔ FHIR、CDA ↔ FHIR 转换引擎,支持通过 DTL 可视化配置自定义映射规则
- 提供 Bulk FHIR 批量导入导出能力,适合大数据量迁移与科研分析场景
- 支持自定义搜索参数与 FHIR 扩展字段,满足业务定制化需求
四、代码示例
4.1 初始化 FHIR 服务实例
IRIS 中所有 FHIR 操作均通过 HS.FHIRServer.Service 调度,首先获取服务实例:
// 替换为实际部署的FHIR端点路径
set fhirEndpoint = "/csp/healthshare/fhirserver/fhir/r4/"
// 获取或初始化FHIR服务实例
set fhirService = ##class(HS.FHIRServer.Service).EnsureInstance(fhirEndpoint)
4.2 资源查询(GET)
根据资源 ID 查询单个 Patient 资源:
// 构造请求对象
set request = ##class(HS.FHIRServer.API.Data.Request).%New()
set request.RequestPath = "/Patient/1001" // 路径格式:资源类型/资源ID
set request.RequestMethod = "GET"
// 发起调度请求
do fhirService.DispatchRequest(request, .response)
// 处理响应结果
if response.HttpStatus = 200 {
// response.Json 为 %DynamicObject 类型的标准FHIR资源
set familyName = response.Json.name.%Get(0).family
write "患者姓氏:", familyName, !
} else {
write "查询失败,HTTP状态码:", response.HttpStatus, !
}
示例来源:InterSystems 官方开发文档
4.3 资源创建(POST)
通过动态对象构造 FHIR 资源并提交创建:
// 构造Patient资源动态对象
set patientResource = {
"resourceType": "Patient",
"name": [
{
"use": "official",
"family": "Zhang",
"given": ["San", "Ming"]
}
],
"gender": "male",
"birthDate": "1992-08-15",
"telecom": [
{
"system": "phone",
"value": "13800138000",
"use": "mobile"
}
]
}
// 构造POST请求
set request = ##class(HS.FHIRServer.API.Data.Request).%New()
set request.RequestPath = "/Patient"
set request.RequestMethod = "POST"
set request.Json = patientResource
// 提交请求
do fhirService.DispatchRequest(request, .response)
if response.HttpStatus = 201 {
write "患者创建成功,资源ID:", response.Json.id, !
}
4.4 FHIRPath 数据提取
IRIS 内置 FHIRPath 引擎,可通过表达式快速提取资源字段,无需手动遍历 JSON 结构:
// 指定FHIR版本
set fhirVersion = $lb("hl7.fhir.r4.core@4.0.1")
// 获取FHIRPath引擎实例
set fhirPathAPI = ##class(HS.FHIRPath.API).getInstance(fhirVersion)
// 解析表达式:提取所有手机号类型的联系方式
set exprTree = fhirPathAPI.parse("telecom.where(system = 'phone')")
// 执行表达式,结果存入OUTPUT多维数组
do fhirPathAPI.evaluate(patientResource, exprTree, .OUTPUT)
// 遍历输出结果
set total = OUTPUT
for i=1:1:total {
write "手机号:", OUTPUT(i).value, ",用途:", OUTPUT(i).use, !
}
示例来源:InterSystems 官方 FHIRPath 文档
4.5 Bundle 批量操作
使用 IRIS 内置工具类快速构造 FHIR Bundle,实现批量资源提交:
set bundleUtil = ##class(HS.FHIRServer.Util.Bundle)
// 创建collection类型的Bundle
set bundle = bundleUtil.CreateBundle("collection")
// 向Bundle中添加Patient条目
do bundleUtil.AddBundleEntry(bundle, "", patientResource, "")
// 添加Observation资源条目
set obsResource = {
"resourceType": "Observation",
"status": "final",
"code": {
"coding": [{"system": "http://loinc.org", "code": "789-8"}]
},
"valueQuantity": {"value": 125, "unit": "mmHg", "system": "http://unitsofmeasure.org"}
}
do bundleUtil.AddBundleEntry(bundle, "", obsResource, "")
// 最终化Bundle(自动处理空字段与格式规范)
set finalBundle = bundleUtil.FinalizeBundle(bundle)
// 提交Bundle请求
set request = ##class(HS.FHIRServer.API.Data.Request).%New()
set request.RequestPath = "/"
set request.RequestMethod = "POST"
set request.Json = finalBundle
do fhirService.DispatchRequest(request, .response)
示例来源:InterSystems FHIR Bundle 工具类文档
4.6 嵌入式 Python 操作 FHIR
IRIS 支持嵌入式 Python,可直接调用 Python FHIR 生态工具库:
from fhirpy import SyncFHIRClient
# 连接IRIS FHIR服务器
client = SyncFHIRClient(
url="http://localhost:52773/fhir/r4",
extra_headers={"Content-Type": "application/fhir+json"}
)
# 创建患者资源
patient = client.resource(
"Patient",
name=[{"family": "Li", "given": ["Hua"]}],
gender="female",
birthDate="1995-05-20"
)
patient.save()
print(f"患者创建成功,ID: {patient.id}")
# 按姓氏搜索患者
patients = client.resources("Patient").search(family="Li").fetch_all()
for p in patients:
print(f"患者: {p['name'][0]['family']}, 生日: {p.birthDate}")
五、快速部署 FHIR 服务器
5.1 Docker 一键部署
使用官方模板快速启动完整 FHIR 服务:
# 克隆模板仓库
git clone https://github.com/intersystems-community/iris-fhir-template.git
cd iris-fhir-template
# 启动IRIS FHIR服务
docker-compose up -d
部署完成后,FHIR R4 端点地址为:http://localhost:52773/fhir/r4
5.2 包管理器安装
在 IRIS 终端中通过 IPM 包管理器一键安装:
USER> zpm "install fhir-server"
六、扩展场景:事件驱动 FHIR 工作流
IRIS 的 FHIR 存储库可与内置互操作引擎联动,当 FHIR 资源发生创建、更新时自动触发业务流程,实现临床决策支持、数据同步、AI 辅助诊断等自动化场景。

图2 FHIR事件驱动的智能临床工作流架构
该架构下,FHIR 资源写入事件会自动触发互操作编排引擎,调用向量检索、AI 推理等能力,最终将结果以 FHIR DiagnosticReport 等标准格式写回存储库,全程保留可审计的操作链路。
默认评论
Halo系统提供的评论