このページでは、DICOM メタデータを BigQuery にエクスポートするときに作成される BigQuery テーブルのスキーマについて説明します。
用語
スキーマとそのコンポーネントを理解するには、DICOM の用語を確認してください。 特に、このページでは 3.10 DICOM のデータ構造とエンコード定義のいくつかの用語を使用します。
概要
Cloud Healthcare API では、エクスポートするデータと DICOM 辞書を使用して BigQuery スキーマが自動的に生成されます。このスキーマには、メタデータに存在する DICOM データ要素の列のみが含まれます。 唯一の例外は人名 VRです。
DICOM メタデータをエクスポートすると、Cloud Healthcare API でメタデータ内のすべてのデータ要素のエクスポートが試行されます。問題が発生した場合は、型の競合と不一致をご覧ください。
標準データと非公開データの要素
DICOM では、事前定義された仕様に準拠した標準データ要素が提供されます。これらのデータ要素の一覧については、DICOM データ要素のレジストリをご覧ください。
標準要素に準拠していないデータと通信する必要がある場合は、非公開データの要素を使用できます。
標準データの要素
次の動作は標準データの要素に適用されます。非公開データの要素の動作については、非公開データの要素をご覧ください。
列名
生成された BigQuery スキーマの列には、データ要素のキーワードに従って名前が付けられます。たとえば、DICOM メタデータに InstanceCreationDate というキーワードのデータ要素が含まれている場合、生成されるスキーマには InstanceCreationDateという名前の列があります。
標準 DICOM データ要素の動作
次の表に、値表現(VR)とその略称を示します。これらの VR のいずれかが含まれる BigQuery にエクスポートされたデータ要素の場合、「データ型」の下の BigQuery データ型を使用します。
VR | データ型 |
---|---|
|
String |
日付(DA) | 日付 |
時刻(TM) | 時間 |
日時(DT) | タイムスタンプ |
|
文字列 |
人名(PN) | 構造体(レコード) |
|
浮動小数点 |
|
整数 |
項目の順序(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 が含まれるデータ要素はエクスポートされません。代わりに、次の VR は宛先の BigQuery テーブルの別の列(DroppedTags.TagName
という名前)に含まれます。
- その他の倍精度(OD)
- その他の浮動小数点数(OF)
- その他の長整数型(OL)
- その他のバイト(OB)
- その他のワード(OW)
- 不明(UN)
- 約 1 MiB を超えるデータが含まれるシーケンス(SQ)タグ
- 値の多重度(VM)が 512 より大きい場合、属性(AT)、浮動小数点倍精度(FD)、浮動小数点単一(FL)、符号なし長整数型(UL)、符号なし短整数型(US)。
- 従来の理由により、Cloud Healthcare API にすでに取り込まれているインスタンスのタグは、値の多重性が 64 を超える場合に
DroppedTags.TagName
列に含まれる場合があります。
- 従来の理由により、Cloud Healthcare API にすでに取り込まれているインスタンスのタグは、値の多重性が 64 を超える場合に
人名 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 進文字列です。
LastUpdated
列と Type
列
LastUpdated
列と Type
列は、DICOM メタデータをエクスポートするときに作成された BigQuery テーブルに追加されます。これらの列は標準データ要素または非公開データ要素ではなく、DICOM データ要素のレジストリに対応していません。
これらの列の動作は次のとおりです。
LastUpdated
列には、DICOM インスタンスが DICOM ストアに挿入または削除された時点を示す timestamp 値が含まれます。Type
列には、発生したオペレーションのタイプを示す文字列が含まれます。有効な値は、CREATE
またはDELETE
です。
型の競合と不一致
型の競合が発生した場合(公開タグが誤った型で使用されている場合など)は、公開タグが非公開タグとして扱われます。データ要素の値は 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 オペレーションについて学習し、例を確認する。