簡単な回答: FHIR の基本リソースは意図的に緩やかに作られています。ほとんどの要素はオプションであり、コードの多くは単なる例です。これにより、1つの標準があらゆる国に対応できます。プロファイルとは、特定の用途に合わせてリソースを絞り込んだStructureDefinitionのことです。例えば、「このコンテキストでは、Patient はこのタイプの識別子を持つ必要がある」「Observation.code はこのリストの LOINC コードでなければならない」「この要素はサポート必須で、あの要素は含められない」といった具合です。拡張は、基本リソースにない要素を追加するもので、URL で識別され、独自の StructureDefinition で定義されます。実装ガイド(US Core、IPS、各国のガイド)は、プロファイル、拡張、値セット、例の集まりです。リソースは、meta.profile でどのプロファイルに準拠しているかを宣言し、バリデーターがそれをチェックします。
プロファイルで変更できること
FHIRプロファイルは、カーディナリティを狭めたり、要素をmust-supportとしてマークしたり、値やパターンを固定したり、要素を値セットにバインドしたり、リストを名前付きの部分にスライスしたり、選択型を制限したり、FHIRPathの不変条件を追加したり、参照ターゲットを限定したりすることで、リソースを変更できます。プロファイルは要素を追加したり、名前を変更したり、基本仕様を緩めたりすることはできません。
| 制約 | 内容 | 例 |
|---|---|---|
| カーディナリティ | オプションの要素を必須にする、または禁止する | Patient.identifier 1..*; Patient.photo 0..0 |
| Must support (必須サポート) | 受信者は、要素が送信された場合にそれを保存・表示できる必要がある | US Core では birthDate を must-support とマークしています |
| 固定値またはパターン | 要素を1つの値に固定する | Observation.category を vital-signs に固定 |
| バインディング | 要素を特定の強さの値セットに紐付ける | Observation.code を vital signs リストに紐付け、必須とする |
| スライシング | リストを、それぞれ独自のルールを持つ名前付きの部分に分割する | 血圧:コンポーネントを収縮期と拡張期にスライス |
| 型の制限 | 選択肢を限定する | value[x] を valueQuantity に制限 |
| 不変条件 (Invariant) | 満たされなければならない FHIRPath ルール | "effective[x] must be present" または "value or dataAbsentReason" |
| 参照ターゲット | 参照がどこを指せるかを限定する | subject は Patient のみ、かつこのプロファイルに準拠した患者のみ |
プロファイルは絞り込むことしかできません。要素を追加したり(これは拡張の役割です)、名前を変更したり、基本仕様を緩めたりすることはできません。
バインディングの強さ
FHIRには4つのバインディング強度があります。required:コードは値セットから取得する必要があります。extensible:コンセプトが一致する場合は値セットを使用します。それ以外の場合は別のコードが許可されます。preferred:推奨されますが、強制されません。example:例示のみであり、ほとんどの基本リソースがこれに該当します。extensibleをrequiredと誤解することは、検証エラーの一般的な原因です。
読みやすいプロファイルの抜粋
FHIRプロファイルはStructureDefinitionであり、その差分リストには基本リソースと異なる制約のみが記載されますが、スナップショットリストにはすべての要素が記載されます。以下に示す読みやすい抜粋は、Observationを家庭用血圧に制約するものです。コードはLOINC 85354-9に固定され、コンポーネントは正確に1つの収縮期部分と1つの拡張期部分にスライスされます。
プロファイルの差分 (differential) には、基本仕様からの変更点のみがリストされます。スナップショット (snapshot) には、すべての要素がリストされます。この差分は、血圧の Observation が LOINC 85354-9 と正確に2つのコンポーネントを持つ必要があることを示しています。
{
"resourceType": "StructureDefinition",
"url": "https://example.org/fhir/StructureDefinition/bp-home",
"name": "HomeBloodPressure",
"status": "active",
"kind": "resource",
"abstract": false,
"type": "Observation",
"baseDefinition": "http://hl7.org/fhir/StructureDefinition/Observation",
"derivation": "constraint",
"differential": {"element": [
{"id": "Observation.code", "path": "Observation.code",
"patternCodeableConcept": {"coding": [{"system": "http://loinc.org", "code": "85354-9"}]}},
{"id": "Observation.component", "path": "Observation.component", "min": 2, "max": "2",
"slicing": {"discriminator": [{"type": "pattern", "path": "code"}], "rules": "closed"}},
{"id": "Observation.component:systolic", "path": "Observation.component", "sliceName": "systolic", "min": 1, "max": "1"},
{"id": "Observation.component:systolic.code", "path": "Observation.component.code",
"patternCodeableConcept": {"coding": [{"system": "http://loinc.org", "code": "8480-6"}]}},
{"id": "Observation.component:diastolic", "path": "Observation.component", "sliceName": "diastolic", "min": 1, "max": "1"},
{"id": "Observation.component:diastolic.code", "path": "Observation.component.code",
"patternCodeableConcept": {"coding": [{"system": "http://loinc.org", "code": "8462-4"}]}}
]}
}
プロファイルは手書きされることはめったにありません。著者は SUSHI を使って FHIR Shorthand (FSH) を書くか、Forge や Simplifier のようなツールを使用し、HL7 の IG Publisher で公開します。ガイドは、バリデーターやサーバーがロードするパッケージ(hl7.fhir.us.core#6.1.0、hl7.fhir.uv.ips#1.1.0)として配布されます。
拡張 (Extensions)
拡張は、extension(またはリソースの意味を変え、無視できない場合は modifierExtension)に配置されるキーと値の要素です。その url は、StructureDefinition の正規 URL であり、値は型付けされた value[x] またはネストされた拡張です。出生地は、Patient に対する HL7 定義の拡張です。
{
"resourceType": "Patient",
"id": "example",
"extension": [{
"url": "http://hl7.org/fhir/StructureDefinition/patient-birthPlace",
"valueAddress": {"city": "Lyon", "country": "FR"}
}],
"name": [{"family": "Doe", "given": ["Jane"]}]
}
良い実践のルール:定義する前に、既存の拡張(HL7 のレジストリや各国のガイド)を探してください。自分が管理するドメインの下に URL を付けてください。他の人が検証できるように StructureDefinition で定義してください。基本要素がすでにカバーしていることのために拡張を使用しないでください。
meta.profile と検証
meta.profileは、FHIRリソースが準拠を主張する正規URLのリストであり、主張は証明ではありません。バリデーターは、基本仕様および主張された各プロファイルに対してリソースをチェックするか、指定したプロファイルに対してチェックします。HL7リファレンスバリデーターはパッケージとともにローカルで実行され、FHIRサーバーはプロファイルパラメータを受け入れる$validate操作を提供します。
meta.profile は、リソースが準拠すると主張する正規 URL のリストです。主張は証明ではありません。バリデーターは、リソースを基本仕様と、主張された各プロファイル(または使用を依頼したプロファイル)に対してチェックします。HL7 の参照バリデーター(validator_cli.jar)はローカルで実行され、パッケージをロードします。サーバーは POST /Observation/$validate?profile=… を提供します。IG Publisher はガイド内のすべての例を検証します。リソースは、矛盾しない限り、複数のプロファイル(例えば、国の Patient プロファイルと IPS Patient プロファイル)に同時に準拠できます。
実践的な2つのルール:サーバーが CapabilityStatement でプロファイルを宣言している場合、それを失敗したリソースは拒否すべきです。クライアントがリソースを受信する場合、基本仕様で許可されているため、未知の拡張やプロファイルで禁止されていない追加要素を拒否すべきではありません。
Anpheros における利用
Anpheros Platformは、観測にはLOINC、薬剤にはATC、該当する場合はSNOMED CTを使用するFHIR R4サーバーであり、リソースの構造をFHIR R4に対してチェックする無料バリデーターを提供しています。クリニックがnationalまたはIPSプロファイルにmeta.profileを設定してリソースを送信すると、その主張は保持されるため、下流システムはそれに対して検証できます。
無料バリデーターは開発者サイトにあります。FHIR実装ガイドの説明については、ガイドを参照してください。
関連ページ
- FHIR 実装ガイドの説明
- FHIR における CodeableConcept と Coding
- FHIR Observation リソースの説明
- FHIR Patient リソースの説明
- 用語サーバーの説明
- FHIR バリデーター(開発者サイト)
情報源
- HL7 FHIR R4: Profiling FHIR
- HL7 FHIR R4: Extensibility
- HL7 FHIR R4: StructureDefinition
- HL7 FHIR R4: Terminology bindings
- HL7 FHIR Shorthand
- HL7 FHIR バリデーター
- HL7 FHIR R4: patient-birthPlace extension
よくある質問
プロファイルはリソースに新しい要素を追加できますか?
いいえ。プロファイルは制約を加えるだけです。新しいデータは拡張で扱われ、プロファイルはその拡張を他の要素と同様に必須または禁止できます。
must-support は具体的に何を要求しますか?
実装ガイドで定義されます。通常は、送信者がデータを持っている場合にその要素を格納し、受信者がそれを保存・表示できることを意味します。要素を必須にするわけではありません。
リソースに meta.profile がない場合、無効ですか?
いいえ。meta.profile は主張であり、要件ではありません。サーバーやガイドがそれを要求する場合がありますが、基本仕様では必須ではありません。バリデーターは、リソースが宣言していないプロファイルに対してチェックするように依頼できます。
自分の国でどのプロファイルを使用すればよいかわかりませんか?
各国の FHIR コミュニティはコアガイド(US Core、UK Core、nl-core、ドイツの Basisprofile など)を公開しています。実装ガイドのページでそれらの見つけ方を説明しています。国境を越える要約には IPS が使用されます。
サンドボックスで無料で試す
5分で最初のFHIR呼び出し. 患者さんの同意が組み込まれたHL7 FHIR R4 APIです。サンドボックスでお試しいただき、ご自身のアプリやクリニックのシステムを接続してください。
無料・合成患者30人・カード不要

