BigQuery DICOM スキーマについて

このページでは、DICOM メタデータを BigQuery にエクスポートするときに作成される BigQuery テーブルのスキーマについて説明します。

用語

スキーマとそのコンポーネントを理解するには、DICOM の用語を確認してください。 特に、このページでは 3.10 DICOM のデータ構造とエンコード定義のいくつかの用語を使用します。

概要

Cloud Healthcare API では、エクスポートするデータと DICOM 辞書を使用して BigQuery スキーマが自動的に生成されます。このスキーマには、メタデータに存在する DICOM データ要素の列のみが含まれます。 唯一の例外は人名 VRです。

DICOM メタデータをエクスポートすると、Cloud Healthcare API でメタデータ内のすべてのデータ要素のエクスポートが試行されます。問題が発生した場合は、型の競合と不一致をご覧ください。

標準データと非公開データの要素

DICOM では、事前定義された仕様に準拠した標準データ要素が提供されます。これらのデータ要素の一覧については、DICOM データ要素のレジストリをご覧ください。

標準要素に準拠していないデータと通信する必要がある場合は、非公開データの要素を使用できます。

標準データの要素

次の動作は標準データの要素に適用されます。非公開データの要素の動作については、非公開データの要素をご覧ください。

列名

生成された BigQuery スキーマの列には、データ要素のキーワードに従って名前が付けられます。たとえば、DICOM メタデータに InstanceCreationDate というキーワードのデータ要素が含まれている場合、生成されるスキーマには InstanceCreationData という名前の列があります。

標準 DICOM データ要素の動作

次の表に、値表現(VR)とその略称を示します。これらの VR のいずれかが含まれる BigQuery にエクスポートされたデータ要素の場合、「データ型」の下の BigQuery データ型を使用します。

VR データ型
  • アプリケーション エンティティ(AE)
  • 年齢文字列(AS)
  • コード文字列(CS)
  • 長い文字列(LO)
  • 長いテキスト(LT)
  • 短い文字列(SH)
  • 短いテキスト(ST)
  • 無制限の文字(UC)
  • 一意の識別子(UI/UID)
  • ユニバーサル リソース識別子(UR)またはユニバーサル リソース ロケータ(URI/URL)
  • 無制限テキスト(UT)
文字列
日付(DA) 日付
時刻(TM) 時間
日時(DT) タイムスタンプ
  • 10 進文字列(DS)
  • 整数文字列(IS)
文字列
人名(PN) 構造体(レコード)
  • 単精度浮動小数点(FL)
  • 倍精度浮動小数点(FD)
浮動小数点
  • 属性タグ(AT)
  • 符号付き長整数型(SL)
  • 符号付き短整数型(SS)
  • 符号なし長整数型(UL)
  • 符号なし短整数型(US)
整数
項目の順序(SQ) 構造体(レコード)

null 可能モードと繰り返しモード

データ要素の値の多重度(VM)値に応じて、その BigQuery 列には NULLABLE または REPEATED のいずれかのモードがあります。

データ要素の VM 値が 1 の場合、これはデータ要素が一意であることを示し、データ要素で NULLABLE モードを使用します。他の VM 値の場合、データ要素で REPEATED モードを使用します。

たとえば、DICOM データ要素のレジストリに示されているように、SOPInstanceUID キーワードの VM 値は 1 です。そのため、BigQuery にエクスポートされると、モードは NULLABLE になり、テーブル内の表現は次のようになります(JSON として表現される場合)。

"SOPInstanceUID": "0.0.000.000000.0.000.0000.0000000.0000.0000000000.000",

逆に、ImageType キーワードの VM 値は 2-n です。そのため、BigQuery にエクスポートされると、モードは REPEATED になり、テーブル内の表現は次のようになります(JSON として表現される場合)。

"ImageType": [
  "ORIGINAL",
  "PRIMARY",
  "OTHER",
  "..."
],

除外される VR

バイナリデータは生成された BigQuery テーブルにエクスポートされないため、次の VR が含まれるデータ要素はエクスポートされません。代わりに、宛先の BigQuery テーブルの別の列(DroppedTags.TagName という名前)に一覧表示されます。

  • その他のバイト(OB)
  • その他の倍精度(OD)
  • その他の浮動小数点数(OF)
  • その他の長整数型(OL)
  • その他のワード(OW)
  • 不明(UN)

人名 VR

BigQuery スキーマの人名(PN)VR の各列には、サブ列にデータが含まれているかどうかにかかわらず、必ず 3 つのサブ列が含まれます。その 3 つのサブ列は、次のとおりです。

  • アルファベット
  • 表意
  • 表音

3 つのサブ列には、それぞれ 5 つのサブ列があります。

  • FamilyName
  • GivenName
  • MiddleName
  • NamePrefix
  • NameSuffix

たとえば、人名(PN)VR がある公開タグ「OperatorsName (0008,10070)」を使用します。OperatorName の値が「Darcy Smith」であるとします。スキーマには以前に一覧表示されたサブ列が含まれる OperatorName 列が含まれますが、Alphabelic.FamilyName(Smith)と Alphabelic.GivenName(Darcy)のみに値が含まれます。

非公開データの要素

臨床実施によっては、公開データの要素の構造に収まらないカスタムデータを保存する必要がある場合があります。代わりに、非公開データの要素を使用できます。

VR が SQ(アイテムの順序)である非公開データの要素は、標準データの要素と同じ動作をします。VR が SQ である非公開データの要素は、非公開データ シーケンスと呼ばれます。

VR が SQ でない非公開データの要素は、OtherElements という列の下にネストされ、文字列に変換されます。こうした非公開データの要素は、非シーケンス非公開データと呼ばれます。シーケンス以外の非公開要素に対してクエリを実行するには、要素の OtherElements 列内でクエリで検索する必要があります。

OtherElements 列には、「Data」と「Tag」の 2 つのサブ列が含まれます。[Data] 列は、非公開データ要素の値の文字列表現です。これは常に REPEATED 型です。[Tag] 列では「Tag_HEX」の形式を使用します。HEX はタグ番号の 16 進文字列です。

型の競合と不一致

型の競合が発生した場合(公開タグが誤った型で使用されている場合など)は、公開タグが非公開タグとして扱われます。データ要素の値は OtherElements という列の下にネストされ、値は文字列に変換されます。

たとえば、DICOM メタデータに次のタグが含まれているとします。

  • タグ番号「(4010,1017)」
  • VR が SL(符号付き長整数型)
  • 値 が 32

(4010,1017) は「Mas」と同じタグ番号です。これは VR が FL の DICOM 仕様の公開タグ名です。エクスポート オペレーションでは、タグ番号が「(4010,1017)」のデータ要素が、VR が FL の「Mass」公開タグ名であると想定されます。したがって、エクスポート オペレーションでは、データ要素の値を浮動小数点数に変換することを想定します(標準 DICOM データ要素の動作の表を参照)。

型の競合は、VR が SL のタグで整数データ型が使用されるためです。そのため、タグが非公開タグに変換され、OtherElements 列に追加されます。

シーケンス データに非シーケンスの公開タグ名が使用されている場合、型の不一致が発生します。そのため、シーケンスはプライベート データ要素として扱われます。BigQuery スキーマでは、列名として公開タグ名の代わりに、公開タグ名の 16 進数が使用されます。この 16 進数は文字列型です。

例: 公開データと非公開データの要素のクエリ

JSON として表されるスキーマの次のスニペットについて考えてみましょう。スキーマは、DICOM データを BigQuery にエクスポートした後に作成されました。

[
  ...
  {
    "name": "SOPInstanceUID",
    "type": "STRING"
  },
  {
    "fields": [
      {
        "fields": [
          {
            "mode": "REQUIRED",
            "name": "Tag",
            "type": "STRING"
          },
          {
            "mode": "REPEATED",
            "name": "Data",
            "type": "STRING"
          }
        ],
        "mode": "REPEATED",
        "name": "OtherElements",
        "type": "RECORD"
      }
    ],
    "mode": "REPEATED",
    "name": "Tag_12345678",
    "type": "RECORD"
  }
  ...
]

次のサンプルは、SOPInstanceUID 一般公開データの要素をクエリする方法を示しています。列の値にアクセスするには、次のクエリを実行します。

#standardSQL
SELECT
  SOPInstanceUID
FROM
  `PROJECT_ID.DATASET_ID.TABLE_ID`

このクエリを実行すると、次のような出力が返されます。

[
  ...
  {
    "SOPInstanceUID": "0.0.000.000000.0.000.0000.0000000.0000.0000000000.000"
  },
  ...
]

次のサンプルでは、非シーケンスのプライベート データをクエリする方法を示します。Tag_12345678 列内の OtherElements 列に対して、次のクエリを実行します。UNNEST 演算子を使用する理由は、RECORD に対するクエリで必要とされるためです。

#standardSQL
SELECT
  Tag_12345678.OtherElements AS OtherElements
FROM
  `PROJECT_ID.DATASET_ID.TABLE_ID`,
  UNNEST(Tag_12345678) AS Tag_12345678

このクエリを実行すると、Tag_12345678.OtherElements 列のデータの量と型に応じて次のような出力が返されます。

[
  {
    "OtherElements": [
      {
        "Tag": "Tag_12345678",
        "Data": [
          "DATA"
        ]
      }
    ]
  },
  {
    "OtherElements": [
      {
        "Tag": "Tag_12345678",
        "Data": [
          "DATA"
        ]
      }
    ]
  },
  {
    "OtherElements": [
      {
        "Tag": "Tag_12345678",
        "Data": [
          "DATA"
        ]
      }
    ]
  }
]

次のステップ

BigQuery 標準 SQL オペレーションについて学習し、例を確認する。