YONAPO RESEARCH
研究記録
MedDSL(仮称)

RESEARCH / RECORD

P2-u 追補:RxNorm API による、新版にない参照の状態の照会

原文 docs/research/85-p2-u-api-query.md

13 KB

GitHubで見る

版 be280c0

この文書の目次 10項目

作成日:2026-10-22。状態:計画(§1〜§6)は照会の前に固定し、結果(§7〜§9)を照会の後に追記。P2-u の結果84 の F49・F50(新版にない170参照の状態は、CPC の資料だけでは決められない)を受け、利用者の判断(2026-10-22「(b)の方針」、03-data-access.md)に従って、RxNorm API(RxNav)で、その170参照の状態を照会する。独立確認は未実施で、independent_review / evaluation_frozen は false のままです。生データ(概念の ID・名称・応答)は Git に入れず、文書には集計だけを残します。

RxNorm の資料提供:Courtesy of the U.S. National Library of Medicine。API の利用条件が求める文言:「This product uses publicly available data from the U.S. National Library of Medicine (NLM), National Institutes of Health, Department of Health and Human Services; NLM is not responsible for the product and does not endorse or recommend this or any other product.」

1. 問い

ID 問い
Q1 CPC に(9 月版にあり 10 月版に)ない170参照は、RxNorm の中で、有効(Active)・廃止(Obsolete)・別の概念への置換(Remapped)・その他のどれか。つまり、CPC に不在であることは、廃止を意味するか(F50)
Q2 置換された参照の置換先は、10 月版の CPC にあるか。公式の置換先が、監査の「後継は決めない」と矛盾せず、追加情報として使えるか
Q3 用語種別が RXNCUI の対象(SCD・SBD・GPCK・BPCK、50件)と、対象外(120件)で、状態の分布は違うか

2. 取得した定義(一次資料)

RxNorm API の関数の文書2ページ(getRxcuiHistoryStatus、getRxNormVersion)を取得し、台帳に記録した。次の記述を使う。

内容 記述(要約)
呼び出し GET https://rxnav.nlm.nih.gov/REST/rxcui/{rxcui}/historystatus.json、GET /REST/version.json。数値は文字列。空の欄は省かれるか null
状態 Active(現行のデータにあり、SAB=RXNORM の抑制されていない語を持つ)、Obsolete(現行のデータで抑制 O。同等な有効概念の指定なし)、Remapped(以前は有効または廃止だったが、現行の RXNCONSO になく、RXNATOMARCHIVE で有効または廃止の概念に置換された)、Quantified(量の係数がなく調剤できない。SUPPRESS=E)、NotCurrent(現行にあるが RxNorm の語がない、または以前の月次にあったが除かれ、置換されていない)、Unknown(月次リリースに一度もない)
欄 releaseStartDate・releaseEndDate(MMYYYY。終了の値なしは現存)、isCurrent、activeStartDate・activeEndDate、remappedDate、概念の tty、置換先 remappedConcept[](remappedRxCui・remappedTTY・remappedActive)
データの版 version=API が返す RxNorm の月次リリース(dd-Mmm-yyyy)。文書の例は 05-Oct-2026
範囲 getRxcuiHistoryStatus は、現行と過去のリリースの概念を扱う(Scope: Current and Historical)

3. 方法

  1. 対象は、P2-u の監査(P-full)で not_found の170参照(旧版にあり新版にない)。台帳のハッシュを確かめた CPC の ZIP から作り直す。
  2. 照会の前後に /REST/version.json を取り、データの版が同じであることを記録する。170件の historystatus を、1秒に5要求以下(上限20の4分の1)で逐次に照会する。通信の失敗は3回まで再試行し、失敗した件数を報告する。
  3. 応答の生データは data/research/r4/rxnorm-history/ に保存し、照会時刻・URL・状態コード・SHA-256 の一覧(manifest)を置く(Git 管理外)。
  4. 集計:状態別の数、用語種別の群(SCD・SBD・GPCK・BPCK/他)別の数、置換先の有無と、置換先が10月版の CPC にある数、releaseEndDate の月の分布。応答の語(名称)は集計に出さない。
  5. 送るのは公開の薬剤概念の識別子(RxCUI)だけで、患者・秘密情報を含まない。照会は170参照に限り、全体の取得に広げない。

4. 実施前に固定する予測

ID 予測 外れた場合に分かること
AQ1 170件すべてに応答があり、Unknown はない(9 月版の CPC にあったため)。通信の失敗は1%以下 照会の方法
AQ2 API が返すデータの版は 05-Oct-2026(10 月版の CPC と同じ月次)で、照会の前後で同じ 応答が10月版の状態を表すか(そうでなければ、照会時点の状態として解釈する)
AQ3 Active(RxNorm では有効だが CPC にない)が1件以上ある。割合は 20〜70% F50(不在≠廃止)の実データでの裏付け
AQ4 Remapped は 5〜40%、Obsolete は 5〜40%、Quantified と NotCurrent は各 10% 以下 状態の分布
AQ5 Remapped の概念のうち、置換先が10月版の CPC にあるものは 80% 以上 公式の置換先が監査に使えるか
AQ6 用語種別が SCD・SBD・GPCK・BPCK の50件は、他の120件より Active の割合が低い(RXNCUI の対象が、廃止または置換されやすい) 用語種別と状態の関係
AQ7 releaseEndDate が 092026(9 月版が最後)の Remapped・NotCurrent の概念が、Remapped・NotCurrent の過半数 不在の時期

予測の外れは、予測を直さず、結果に残す。

5. 受入条件

  1. 照会の前に、この文書を別に保持し、結果は予測と別に書く。
  2. 照会の道具は、通信を行う部分と、応答の読み取り・集計の部分を分け、後者を架空の応答でテストする(通信はテストに含めない)。
  3. 応答の生データは Git に入れない。文書に載せるのは集計だけ。
  4. 照会は170参照に限る。上限(1秒に20要求)を守り、応答の版と時刻を記録する。
  5. 結果は、CPC に不在であることの意味(F50)と、監査の「後継は決めない」との関係を、結論ではなく測定として書く。Remapped の置換先を後継と断定しない(公式の置換先の記録と、薬剤の同等性は別)。

6. 範囲外

170参照以外の照会、通常のリリースの取得、置換先の薬剤の同等性・臨床上の代替の判断、API の他の関数(NDC・関係・性質)、週次更新、応答の再配布。

7. 結果(2026-10-22 に実施)

照会は170参照に限り、170件すべてに HTTP 200(失敗0)。API が返すデータの版は、照会の前後とも 05-Oct-2026(API の版 3.1.356)で、対象の CPC(10 月版)と同じ月次だった。所要は161秒(1秒に約1.06要求、上限20の約5%)。応答の生データと manifest は data/research/r4/rxnorm-history/(Git 管理外)にある。

7.1 予測と測定

ID 予測 結果
AQ1 170件すべてに応答があり Unknown はない。失敗は1%以下 成立。170件、Unknown 0、失敗0
AQ2 データの版は 05-Oct-2026で、照会の前後で同じ 成立(前後とも 05-Oct-2026)。応答は10月版の月次の状態と解釈できる。ただし週次更新の差は検査していない
AQ3 Active が1件以上、割合は20〜70% 成立。Active 70件(41.2%)
AQ4 Remapped 5〜40%、Obsolete 5〜40%、Quantified と NotCurrent は各10%以下 一部外れ。Remapped 0件(外れ)、Obsolete 100件(58.8%)(上に外れ)、Quantified 0・NotCurrent 0(成立)。置換が一般的だという推論の誤り(§8 F53)
AQ5 Remapped のうち置換先が10月版の CPC にあるものは80%以上 評価できない(Remapped が0件)
AQ6 用語種別が SCD・SBD・GPCK・BPCK の50件は、他の120件より Active の割合が低い 成立。30.0%(15/50)対 45.8%(55/120)
AQ7 releaseEndDate が 092026 の Remapped・NotCurrent が過半数 評価できない(該当が0件)

7.2 集計(170参照)

状態 全体 SCD・SBD・GPCK・BPCK(50) 他(120)
Active 70(41.2%) 15(30.0%) 55(45.8%)
Obsolete 100(58.8%) 35(70.0%) 65(54.2%)
Remapped・Quantified・NotCurrent・Unknown 0 0 0

Obsolete の100件はすべて activeEndDate=092026(9月のリリースが、有効だった最後のリリース)で、10月版で廃止になった。isCurrent は Active が YES、Obsolete が NO で、状態と一致した。

8. 分かったこと

ID 発見 根拠 限界
F51 CPC に不在の参照の41%(70/170)は、RxNorm では有効なままだった。 CPC に不在であることは、RxNorm での廃止を意味しない(F50 の実測) 状態 Active 70件 1か月の組。CPC から外れた理由(市販でなくなった等)は応答に含まれない
F52 公式の置換先(Remapped)は170件のうち0件。 廃止された100件は「同等な有効概念の指定なし」(定義)で、置換先は返らない。監査の successor: not_determined は、この月の組では RxNorm 自身の状態と一致した 状態 Obsolete 100・Remapped 0 定義の「Obsolete:RxNorm は同等な有効概念を指定していない」による。置換の有無は、この170件についてだけ
F53 予測の推論の誤り:置換が一般的だと見た。 Remapped を5〜40%と予測したが0件で、Obsolete(同等の指定なしで廃止)が59%だった。RXNCUI が退役を追跡することから、置換先があると推論した AQ4 の外れ 置換先のない廃止は、RXNCUI の追跡の対象でも後継を持たない
F54 照会の道具は、通信(fetch)と応答の読み取り・集計を分け、後者を架空の応答でテストできた。通信の規則(再試行・上限・照会する URL)は偽の通信でテストした。実際の照会は、テストの外で一度だけ行った tests/p2/test_rxnorm_history.py 実際の応答の形は、試しの3件(170件のうち)で確かめてから架空の応答を書いた

9. 限界

  • 170参照・1か月の組の測定です。他の月・他の参照には一般化しません。
  • API が返すのは照会時点の現行の状態で、データの版(05-Oct-2026)は10月版と同じでしたが、週次更新が状態を変える可能性は検査していません。
  • 有効(Active)の70件が CPC から外れた理由(市販でなくなった等)は、API の応答に含まれません。CPC の説明(市販の処方薬の近似)からの推論に留まります。
  • 薬剤の意味の同一・置換の安全性は扱いません。 Obsolete に置換先がないことは、薬剤が不要になったことを意味しません。
  • 応答の生データ(名称を含む)は Git に入れていません。この文書は集計だけを載せます。通常のリリースの取得は、利用者の判断で行っていません。
  • 設計・実装・検査は同じ作成者で、独立確認はありません。

10. 検証

照会の道具とそのテストを加えた後、影響する範囲を Python 3.14.4 と 3.11.17 で実行した:道具のテスト(照会の道具 9、P2-u の道具 13、P2-u の監査 14 の計36テスト)、道具・契約・継承のテスト(97テスト)、保存監査(8テスト)、版比較つき統合評価、P1-d の CLI 照合(P1 20条件・80 JSON・417必須パス、P0 37 JSON・221必須パス)、保存監査(600+256+32+1)、登録検査(25/拒否0)は、両 Python 版とも全て通過した。固定対象は 1,927ファイル、manifest 1eea02fd…、束 d6466533…(テスト test_rxnorm_history.py の追加による。全系列の再実行は行っていない:変更は道具とそのテスト、台帳、文書に限り、契約・実装・他の拡張は変えていない)。実際の照会(通信)はテストの外で一度だけ行った。

P2-u

同じ区分の文書