# FHIR R4 を使用した医療記録の保存方法

> チュートリアル：Patient、血圧 Observation、Condition を作成し、トランザクション、検索、履歴付き更新、およびプロベナンスの読み取りを行います。すべてのリクエストは curl で実行し、実際のレスポンスを無料サンドボックスで確認します。

Source: https://developers.anpheros.com/ja/guides/store-medical-records-fhir

このチュートリアルでは、HL7 FHIR R4 リソースとして少量の医療記録を保存します。具体的には、`Patient`、血圧 `Observation`、および診断を `Condition` として保存し、その後、患者と測定値を 1 つのトランザクションでまとめます。これらのリソースを検索し、以前のバージョンを失うことなく診断を更新し、誰が何を書いたかを読み取ります。すべてのリクエストは、無料の Anpheros サンドボックスに対するプレーンな `curl` であり、表示されるすべてのレスポンスは API が返すものです。

FHIR が初めての方は、まず [FHIR platform](https://developers.anpheros.com/ja/guides/fhir) で概念を理解してください。このページは実践的な部分です。

## レコードの開始によく使われる3つのリソース

| リソース | 内容 | コード体系 |
|---|---|---|
| `Patient` | レコードの対象者（氏名、生年月日、性別、他のシステムからの識別子） | あなたの識別子システム |
| `Observation` | 測定または報告されたもの（バイタルサイン、検査結果、体重、症状スコアなど） | LOINC、UCUM単位 |
| `Condition` | 診断または健康問題、およびその経時的な状態 | ICD-10 (ライセンスフラグの背後にあるSNOMED CT) |

Medications (`MedicationStatement`)、allergies (`AllergyIntolerance`)、immunizations、documentsも同様のパターンに従います。[サポートされている26種類のリソースタイプ](https://developers.anpheros.com/ja/guides/fhir)は、Capability Statementの`/fhir/R4/metadata`に記載されています。

## 開始する前に

[platform.anpheros.com/dashboard](https://platform.anpheros.com/dashboard/) で **Get a sandbox key** をクリックしてサンドボックスキー (`sk_test_…`) を取得してください。ここで作成するものは実際の患者データではなく、他のプロジェクトから見えることもありません。

```bash
export BASE=https://platform.anpheros.com/fhir/R4
export KEY=sk_test_…
```

## ステップ 1: 患者の作成

```bash
curl -X POST "$BASE/Patient" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" -d '{
  "resourceType": "Patient",
  "identifier": [{"system": "https://clinic.example/mrn", "value": "MRN-10442"}],
  "name": [{"family": "Marin", "given": ["Ioana"]}],
  "gender": "female",
  "birthDate": "1979-04-12"
}'
```

サーバーが割り当てたIDとバージョンを持つ`201 Created`:

```json
{"resourceType": "Patient",
 "identifier": [{"system": "https://clinic.example/mrn", "value": "MRN-10442"}],
 "name": [{"family": "Marin", "given": ["Ioana"]}], "gender": "female", "birthDate": "1979-04-12",
 "id": "d09e3942-ed86-4458-b099-fa674ab21b84",
 "meta": {"versionId": "1", "lastUpdated": "2026-10-12T20:16:51.043Z"}}
```

独自のIDを、管理している`system`（ここではクリニックの記録番号）とともに`identifier`に保持することで、`GET $BASE/Patient?identifier=https://clinic.example/mrn|MRN-10442`を使用して常に患者を再度見つけることができます。FHIR `id`はプラットフォームのIDであり、プロジェクト固有です。別のプロジェクトでは、同じ人物が異なるIDで表示されます。

```bash
export PID=d09e3942-ed86-4458-b099-fa674ab21b84
```

## ステップ 2: 測定値を Observation として保存する

血圧は 2 つのコンポーネント（収縮期と拡張期）を持つ Observation の 1 つであり、それぞれに独自の LOINC コードがあります。誰が測定したかを示します。ここでは家庭用デバイスです。

```bash
curl -X POST "$BASE/Observation" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" \
     -H "X-Anpheros-Author-Type: device" -H "Idempotency-Key: bp-2026-10-10-0830" -d '{
  "resourceType": "Observation",
  "status": "final",
  "category": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "vital-signs"}]}],
  "code": {"coding": [{"system": "http://loinc.org", "code": "85354-9", "display": "Blood pressure panel"}]},
  "subject": {"reference": "Patient/'$PID'"},
  "effectiveDateTime": "2026-10-10T08:30:00Z",
  "component": [
    {"code": {"coding": [{"system": "http://loinc.org", "code": "8480-6"}]},
     "valueQuantity": {"value": 138, "unit": "mmHg", "system": "http://unitsofmeasure.org", "code": "mm[Hg]"}},
    {"code": {"coding": [{"system": "http://loinc.org", "code": "8462-4"}]},
     "valueQuantity": {"value": 88, "unit": "mmHg", "system": "http://unitsofmeasure.org", "code": "mm[Hg]"}}
  ]
}'
```

レスポンスは、`id` と `meta.versionId: "1"` を持つ保存されたリソースです。使用可能なレコードにとって重要な 3 つの詳細があります。

- **ラベルではなくコード。** `85354-9` は、すべての FHIR システムで「血圧パネル」を意味します。「BP」のような自由形式のテキストは意味しません。`GET /v1/terminology/loinc?q=blood pressure` ([FHIR コードシステム](https://developers.anpheros.com/ja/guides/fhir-code-systems)) でコードを検索してください。
- **UCUM 単位** (`mm[Hg]`、`kg`、`mg/dL`) を `valueQuantity.code` に含めることで、値を比較および変換できます。
- **`Idempotency-Key`。** タイムアウト後のリトライは、測定値を 2 回保存するのではなく、最初のレスポンスを返します。

検査結果は、`category` `laboratory`、通常は `referenceRange` を持つ同じリソースです。検査レポート全体を取り込む方法については、[FHIR レコードに検査結果をインポートする方法](https://developers.anpheros.com/ja/guides/import-lab-results-fhir) を参照してください。

## ステップ 3: 診断を Condition として記録する

```bash
curl -X POST "$BASE/Condition" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" \
     -H "X-Anpheros-Author-Type: practitioner" -d '{
  "resourceType": "Condition",
  "subject": {"reference": "Patient/'$PID'"},
  "clinicalStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-clinical", "code": "active"}]},
  "verificationStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", "code": "confirmed"}]},
  "code": {"coding": [{"system": "http://hl7.org/fhir/sid/icd-10", "code": "I10", "display": "Essential (primary) hypertension"}]},
  "onsetDateTime": "2026-03-02"
}'
```

`clinicalStatus` (active, resolved, in remission) と `verificationStatus` (confirmed, provisional) は意図的に分離されています。疑わしい診断は確定診断と同じではなく、解決済みの問題も履歴の一部です。

## ステップ 4: 関連リソースを 1 つのトランザクションで作成する

患者と最初の測定値が同時に到着した場合（例: クリニックシステムから）、それらを `transaction` Bundle として送信します。すべてが保存されるか、何も保存されません。新しいリソース間の参照には一時的な `urn:uuid:` ID が使用され、サーバーによって置き換えられます。

```bash
curl -X POST "$BASE" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" -d '{
  "resourceType": "Bundle", "type": "transaction",
  "entry": [
    {"fullUrl": "urn:uuid:9f1c0d1e-0000-4000-8000-000000000001",
     "resource": {"resourceType": "Patient", "name": [{"family": "Stan", "given": ["Mihai"]}], "gender": "male", "birthDate": "1990-02-01"},
     "request": {"method": "POST", "url": "Patient"}},
    {"resource": {"resourceType": "Observation", "status": "final",
       "category": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "vital-signs"}]}],
       "code": {"coding": [{"system": "http://loinc.org", "code": "29463-7", "display": "Body weight"}]},
       "subject": {"reference": "urn:uuid:9f1c0d1e-0000-4000-8000-000000000001"},
       "effectiveDateTime": "2026-10-10",
       "valueQuantity": {"value": 82.4, "unit": "kg", "system": "http://unitsofmeasure.org", "code": "kg"}},
     "request": {"method": "POST", "url": "Observation"}}
  ]
}'
```

`transaction-response` にはリソースごとに 1 つのエントリがあり、`"status": "201 Created"`、その `location`、および保存されたリソースが含まれます。Observation の `subject` は、実際の `Patient/fad3665a-…` を指すようになります。

## ステップ 5: 検索

```bash
curl "$BASE/Observation?patient=$PID&code=http://loinc.org|85354-9&date=ge2026-10-01&_sort=-date" \
     -H "Authorization: Bearer $KEY"
```

マッチしたリソースと `total` を含む `searchset` の Bundle が、新しい順に返されます。その他、よく使用する検索には、`Condition?patient=$PID&clinical-status=active`、`Observation?patient=$PID&category=laboratory`、そしてレコード全体を取得する `Patient/$PID/$everything` があります。

## ステップ 6: 履歴を失わずに更新する

高血圧が解消されました。ステータスを変更し、終了日を追加します。他の誰かの変更を上書きしないように、読み取ったバージョンである`If-Match`を使用します。

```bash
curl -X PUT "$BASE/Condition/$CID" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" \
     -H 'If-Match: W/"1"' -d '{ …the same Condition…, "clinicalStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-clinical", "code": "resolved"}]}, "abatementDateTime": "2026-10-11" }'
```

`200 OK`と`ETag: W/"2"`を使用します。他の書き込みが先に実行された場合、`412`を受け取り、再度読み取ります。以前のバージョンはそのまま残っています。

```bash
curl "$BASE/Condition/$CID/_history" -H "Authorization: Bearer $KEY"
```

両方のバージョンを返します。`versionId` 2 (`resolved`) と 1 (`active`) です。`GET $BASE/Condition/$CID/_history/1`は古いものを読み取ります。レコード内の何もサイレントに上書きされることはありません。

## ステップ 7: 誰が何を書いたかを確認する

すべての書き込みは、`Provenance` リソースを作成します。血圧測定値の場合：

```bash
curl "$BASE/Provenance?target=Observation/$OBS" -H "Authorization: Bearer $KEY"
```

```json
{"resourceType": "Provenance",
 "target": [{"reference": "Observation/d83d9075-…/_history/1"}],
 "recorded": "2026-10-12T20:16:51.056000Z",
 "activity": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/v3-DataOperation", "code": "CREATE"}]},
 "agent": [{"type": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/provenance-participant-type", "code": "author"}]},
            "who": {"identifier": {"system": "https://anpheros.com/fhir/CodeSystem/author-type", "value": "device"}, "display": "proj_…"},
            "onBehalfOf": {"identifier": {"system": "https://anpheros.com/fhir/sid/organization", "value": "org_…"}, "display": "…"}}]}
```

送信した著者のタイプ (`device`) は、プロジェクトと組織とともに記録されます。書き込みの背後にある臨床医を特定するには、`X-Anpheros-Author-Ref: Practitioner/<id>` を送信してください。

## ステップ 8: レコードの要約

```bash
curl "$BASE/Patient/$PID/\$summary" -H "Authorization: Bearer $KEY"
```

国際患者サマリー（International Patient Summary）を返します。これは、`document` Bundle であり、`Composition` で始まり、Problems、Medications、Allergies、Vital signs などのセクションを持ち、上記のリソースから構築されます。これは、別のシステムに渡したり、医師のために印刷したりするための形式です（[FHIR platform](https://developers.anpheros.com/ja/guides/fhir)）。

## FHIRなしのJSONを優先しますか？

同じデータは、よりシンプルなRESTビュー、`/v1` からも利用可能で、IDも同じです。`POST /v1/patients/{id}/observations` は`{"code": "85354-9", "category": "vital-signs", "effective_at": "…", "components": […]}` を取得し、同じFHIR Observationを保存します。コードに合わせて使いやすい方を選択してください。詳細は[Medical data API](https://developers.anpheros.com/ja/guides/medical-data-api)および[SDKs](https://developers.anpheros.com/ja/guides/sdks)を参照してください。

## よくある質問

### 医療記録を保存する最善の方法は何ですか？
コード化され、バージョン管理されたリソースとして、誰がそれぞれを作成したかの記録とともに保存します。HL7 FHIR R4 は、構造（Patient、Observation、Condition など）、LOINC や ICD-10 などの標準コードシステム、履歴を提供します。FHIR バックエンドは、検索、同意、および来歴（provenance）をその上に加えます。

### FHIR を使用するために FHIR サーバーが必要ですか？
FHIR リソースを保存し、検索し、誰がそれらを読み取れるかを強制する場所が必要です。オープンソースの FHIR サーバーを自分で実行するか、Anpheros のようなマネージドサービスを使用できます。[Anpheros と他の FHIR サーバーの比較方法](https://developers.anpheros.com/ja/guides/fhir-server-comparison) でオプションを比較し、[FHIR 対カスタム医療データベース](https://developers.anpheros.com/ja/guides/fhir-vs-custom-database) では独自のスキーマを構築することについて説明しています。

### FHIR で血圧をどのように保存しますか？
コード LOINC `85354-9` を持つ 1 つの `Observation` と、収縮期 `8480-6` および拡張期 `8462-4` の 2 つの `component` エントリとして保存します。それぞれに `valueQuantity` が `mm[Hg]` に含まれます。

### 保存されたリソースを変更できますか？
はい、`PUT` と `If-Match` を使用して変更できます。変更ごとに新しいバージョンが作成されます。以前のバージョンは `_history` を通じて読み取り可能であり、Provenance レコードは各変更を行った人物を記録します。削除はソフト削除であり、履歴は保持されます。

## 関連情報

- [FHIR プラットフォーム](https://developers.anpheros.com/ja/guides/fhir): コンセプト、リソースタイプ、オペレーション
- [FHIR コードシステム](https://developers.anpheros.com/ja/guides/fhir-code-systems): LOINC, ICD-10, ATC, UCUM
- [FHIR レコードへの検査結果のインポート方法](https://developers.anpheros.com/ja/guides/import-lab-results-fhir)
- [医療データ API](https://developers.anpheros.com/ja/guides/medical-data-api): 同様のデータをよりシンプルにした REST ビュー
- [無料 FHIR データベースとサンドボックス](https://developers.anpheros.com/ja/guides/free-fhir-database)
