目次


NIEM IEPD を作成する

第 2 回 NIEM のマッピングとサブセットの作成

米国政府機関の間での XML 情報交換を設計する

Comments

コンテンツシリーズ

このコンテンツは全#シリーズのパート#です: NIEM IEPD を作成する

このシリーズの続きに乞うご期待。

このコンテンツはシリーズの一部分です:NIEM IEPD を作成する

このシリーズの続きに乞うご期待。

前回の記事では、情報交換の UML モデルを作成しました (第 1 回を参照)。次のステップは、NIEM のどの部分をメッセージで再利用するかを判断するために、作成したモデルを NIEM にマッピングすることです。このマッピングは大抵の場合、CMT (Component Mapping Template) として知られるスプレッドシートで行います。CMT は以下に示すいくつかの理由で役に立ちます。

  • コメントや追加のドキュメントによって、情報交換モデルを人間が理解できる形で詳細に定義することができます。
  • モデルのどの部分で NIEM コンポーネントを再利用し、どの部分に関して IEPD (Information Exchange Package Documentation) をカスタマイズするのかが明確になります。
  • NIEM モデルのサブセットを作成する際に、便利なチェックリストとしての役割を果たします。

CMT の作成

CMT を作成するには Microsoft® Office Excel® やその他のスプレッドシート・ソフトウェア (OpenOffice.org の Calc など) を使用するのが一般的ですが、表形式であれば、どのように作成しても構いません。CMT に必須のフォーマットというものはありませんが、典型的な CMT には少なくとも以下の列があります。

  • ソースの型。UML モデルでのクラスの名前です。
  • ソースのプロパティー。UML モデルでのプロパティーの名前です。
  • データ型。プロパティーのデータ型です。
  • 説明。型またはプロパティーについての簡単な説明です。
  • カーディナリティー。プロパティーに許容される出現回数です。
  • 拡張指標。モデルが NIEM モデルのコンポーネントと一致するかどうかを示します。
  • XPath。XML メッセージ内での要素のパスです。

NIEM の実装によっては、NIEM の拡張に関する詳細を表すために、上記以外の列も CMT に追加されます。NIEM の拡張については、連載の第 3 回で詳しく検討します。

CMT にモデルを記録する

まず初めに行う作業は、作成した UML モデルを CMT の最初の 5 つの列に記録することです。連載の第 1 回で、登録車両の盗難を報告するという単純な事例での UML 図を導入しました。この UML クラス図 (図 1 にもう一度記載します) を基に、CMT フォーマットで記録した TheftLocation (盗難場所) クラスを表 1 に記載します。この表ではスペースを節約するために説明の列を省いていますが、「ダウンロード」から完全なサンプル CMT を入手することができます (図 1 をテキストで表現したものを見る)。

図 1. 第 1 回の UML モデル図
完成した UML モデル (TheftReport (盗難報告書) クラスを追加)
完成した UML モデル (TheftReport (盗難報告書) クラスを追加)
完成した UML モデル (TheftReport (盗難報告書) クラスを追加) のテキスト・バージョン (図 1)
                          _________________________ 
                          |      TheftReport       |
                          |________________________|
                          | TheftReportDate : date |
                          |________________________|
                                    ^
                                    V 1
                                    |
                                    |
                                    |
_____________________               | 1..*
|    TheftLocation   |         ___________________________ 
|____________________|         |          Theft           | 1             1  _________________________
| Address : string   | 1   1 * |__________________________|__________________|       Property         |
| City : string      |_________| TheftDateTime : dateTime |                  |________________________|
| State : string     |         |__________________________|                  | SerialNumber : integer |
| ZipCode : string   |         |                     |                       | Description : string   |
| CountyCode : code  |         | 1                 1 |                       | Color : string         |
|____________________|         |                     |                       |________________________|
                               |                     |                             ^           ^
                               | 1              0..* |                             |           |
                        ____________   ___________________                         |           |
                       |   Victim   |  |    Witness       |                        |           |
                       |____________|  |__________________|      _________________________   _________________________
                       |            |  | Account : string |      |     MotorVehicle       |  |        Bicycle         |
                       |____________|  |__________________|      |________________________|  |________________________|
                           |                  |                  | LicensePlate : string  |  | IsRegistered : boolean |
                           | 1                | 1                | VehicleCategory : code |  |________________________|
                           |                  |                  |________________________|
                           | RoleofPerson     | RoleofPerson     
                           |                  |                  
                           | 1                | 1                
                           |                  |             
                        _________________________ 
                        |         Person         |                    _____________________ 
                        |________________________|   1  PersonName  1 |    PersonName      |
                        | DriverLicense : string |<>------------------|____________________|
                        |                        |                    | FirstName : string |
                        |________________________|                    | LastName : string  |
                                                                      |____________________|
表 1. CMT での型およびプロパティーの表現
ソースの型ソースのプロパティーデータ型説明カーディナリティー
TheftLocation...
TheftLocationAddressString...0..1
TheftLocationCityString...0..1
TheftLocationStateString...0..1
TheftLocationZipCodeString...0..1
TheftLocationCountyCodeCountyCode...0..1

データ型の列では、XML Schema の単純型の名前を使用しています。コード・リストの場合には、コード・リスト名を指定し、有効な値をスプレッドシートの別のタブに文書化します。カーディナリティーは出現回数の最小値と最大値を示しています。「*」が付いている場合は、出現回数に制限がないことを表します。

CMT には関連ごとの行と、それぞれの関連に関する型を参照するための行が必要です。表 2 に、CMT で表した Theft (盗難事件) と TheftLocation (盗難場所) の関連を記載します。

表 2. CMT での関連の表現
ソースの型ソースのプロパティーデータ型説明カーディナリティー
Theft / TheftLocation Assn
Theft / TheftLocation AssnTheftReference...1..1
Theft / TheftLocation AssnTheftLocationReference...1..1

ロールの型は、ロールを演じている人物の型への参照と併せて示す必要があります。表 3 に記載する Witness (目撃者) ロールには Person への参照が含まれています。RoleOfPerson が、この参照のラベルです。

表 3. CMT でのロールの表現
ソースの型ソースのプロパティーデータ型説明カーディナリティー
Witness
WitnessAccountString...0..1
WitnessRoleOfPersonReference...1..1

対応する NIEM コンポーネントの検索

情報交換をマッピングするために次に行う作業は、作成したモデルと NIEM とが重複する部分を判断し、該当する要素を CMT に記録することです。他の NIEM アプリケーションとの相互運用性を最大限にするためには、できるだけ NIEM を再利用する必要があります。NIEM モデルの中に意味的に相当するコンポーネントがあるというのに、新しいコンポーネントを追加したとしたら、IEPD は NIEM に準拠しなくなってしまいます。とは言っても、データが NIEM に適合しないのであれば、NIEM に無理やり合わせる必要はありません。新しいコンポーネントをモデルに追加する方法については、連載の第 3 回で説明します。

NIEM モデルはかなりの大きさなので、該当するコンポーネントを探して自力でスキーマをスキャンするようなことはしたくないはずです。幸い、NIEM モデルのコンポーネントを検索するには以下のオンライン・ツールを使用することができます (これらのツールへのリンクについては「参考文献」を参照)。

  • NIEM Wayfarer。このツールを使用して、NIEM コンポーネントを検索し、検出されたコンポーネントごとのページにアクセスしてモデルを詳細に検討することができます。
  • Schema Central。NIEM Wayfarer と同様の機能が備わっているツールですが、このツールの場合、NIEM だけでなく、さまざまな XML 語彙を使用することができます。
  • NIEM SSGT (NIEM Schema Subset Generation Tool)。このツールでは、上記の 2 つよりも多少見た目にわかりやすい方法で NIEM モデルを検索し、ナビゲートすることができます。さらに、対象のコンポーネントが見つかった後に、NIEM サブセットを生成することもできます。

以上のいずれかのツールを使用して、NIEM にすでに存在する可能性のある CMT のコンポーネントをすべて検索してください。一例として、Schema Central で「Vehicle」という言葉を検索すると、図 2 の検索結果ページが表示されます。

図 2. Schema Central の検索結果ページ
Schema Central の検索結果ページのスクリーン・キャプチャー。「Vehicle」というストリングが含まれる要素、複合型、および単純型が一覧表示されています。
Schema Central の検索結果ページのスクリーン・キャプチャー。「Vehicle」というストリングが含まれる要素、複合型、および単純型が一覧表示されています。

この画面で nc:Vehicle をクリックすると、図 3 のページが表示されます。このページには、nc:Vehicle 要素の一般的な特徴に続き、この要素に含めることが可能な子がすべて一覧表示されます。

図 3. Schema Central の要素表示ページ
Schema Central の要素表示ページのスクリーン・キャプチャー。nc:Vehicle の子がすべて一覧表示されています。
Schema Central の要素表示ページのスクリーン・キャプチャー。nc:Vehicle の子がすべて一覧表示されています。

すべての NIEM コンポーネントには、nc という名前空間接頭辞が付いています。nc は NIEM Core (NIEM コア) を意味する名前空間で、基本型のほとんどは、この名前空間にあります。これとは別に、ドメインごとの名前空間もあります (例えば Justice の j など)。作成したモデルと意味的に同じである限り、どのドメインの NIEM コンポーネントでも自由に使用することができます。例えば入国管理ドメインの要素を使用するからと言って、入国管理関連の情報交換を実装しなければならないわけではありません。

NIEM モデルを検索する際のガイドライン

どのツールを使用するかに関わらず、以下のヒントに従うことによってモデルの検索が容易になります。

  • たいていは、最初に上位レベルの型/クラス (この例の場合は、TheftPropertyLocation など) を検索してから、該当するプロパティーを検索するほうが検索対象を見つけやすくなります。
  • 同義語も忘れずに検索してください。例えば、License Plate が見つからなければ、Registration を検索します。
  • 特定のコンポーネントが見つからない場合には、そのコンポーネントも含まれるような汎用コンポーネントを検索します。NIEM で最も一般的な型には、PersonOrganizationLocationActivityItem があります。例えば Theft Location が見つからないとしたら、この特定のコンポーネントよりも一般的な Location を検索するために nc:Location を使用します。Theft に対応する特定の型がなければ、それよりも汎用的な nc:Activity 型を使用して検索することを検討してください。
  • 名前だけで検索しないようにしてください。検索範囲を説明および列挙に広げることで、該当する型が見つかる場合もあります。

NIEM モデルのコンポーネントを検索するのは、最初は大変な作業に思えるかもしれませんが、NIEM モデルの一般的な命名パターンと構造パターンに慣れるにつれ、容易になっていきます。

CMT に NIEM コンポーネントを記録する

相当する NIEM コンポーネントが見つかったら、そのコンポーネントを CMT の XPath 列に記録します。通常は単純な XPath 式を使用し、要素名や属性名はスラッシュ (/) で区切ります。XPath に型の名前を含める必要はありません。要素名には nc: などの名前空間接頭辞を使用してください。要素名は必ずしも名前空間全体で一意というわけではないためです。

表 4 に、TheftLocation の XPath マッピングを記載します。注: 表内ではフォーマットを整えるために、XPath のマッピングが長い場合は複数の行に分割しています。通常、マッピングは 1 つのストリングで、空白スペースは入りません。

表 4. TheftLocation の XPath マッピング
ソースの型ソースのプロパティー...Ext?XPath
TheftLocation...nc:Location
TheftLocationAddress...Nnc:Location/nc:LocationAddress /nc:StructuredAddress
/nc:LocationStreet /nc:StreetFullText
TheftLocationCity...Nnc:Location/nc:LocationAddress /nc:StructuredAddress
/nc:LocationCityName
TheftLocationState...Nnc:Location/nc:LocationAddress /nc:StructuredAddress
/nc:LocationState USPostalServiceCode
TheftLocationZip...Nnc:Location/nc:LocationAddress /nc:StructuredAddress
/nc:LocationPostalCode
TheftLocationCountyCode...Y

XPath には、十分な長さのパスを含めることで一意に識別できるようにしてください。例えば、Address の行に nc:StreetFullText と入力するだけでは不十分です。複数のパスが NIEM の同じ要素に辿り着く場合もあるため、正確を期して、パス全体を含める必要があります。

この例での CountyCode プロパティーはそれぞれの州に固有の郡コードですが、NIEM にはこのプロパティーがないため、拡張しなければなりません。したがって、Ext? 列を Y に設定し、XPath はとりあえず空白のままにしてあります。拡張用の XPath を入力するプロセスについては、連載の第 3 回で手順に沿って説明します。

サンプルの Theft Report モデルと NIEM との完全なマッピングについては、「ダウンロード」から入手できるスプレッドシートを参照してください。

NIEM サブセットの作成

情報交換で使用する NIEM のコンポーネントが決まったら、XML Schema 文書一式の形式を取る NIEM モデルのサブセットを作成します。完全な NIEM モデルはかなりの大きさで、制約も緩いため、情報交換の妥当性検証をより厳密に行うには NIEM のサブセットが必要です。NIEM サブセットは許容する要素と属性を制限するだけでなく、これらの要素と属性の許容出現回数や、場合によっては要素や属性の許容値まで制限します。NIEM サブセットを作成するとスキーマが大幅に小さくなるため、XML メッセージの妥当性検証も高速に行われるようになります。

NIEM サブセットを作成するには、NIEM SSGT を使用します。図 4 に示す SSGT の初期ページには、2 つのペインがあります。右側のペインではモデルを検索およびナビゲートします。左側のペインには、コンポーネントを追加するにつれ作成されていくサブセットが示されます。

図 4. SSGT のメイン・ページ
「NIEM Schema Subset (NIEM スキーマ・サブセット)」ペインと「NIEM Data Model Search (NIEM データ・モデル検索)」ペインで構成されたSSGT メイン・ページのスクリーン・キャプチャー
「NIEM Schema Subset (NIEM スキーマ・サブセット)」ペインと「NIEM Data Model Search (NIEM データ・モデル検索)」ペインで構成されたSSGT メイン・ページのスクリーン・キャプチャー

作成した CMT に基づいて検索を行い、サブセットに追加するコンポーネントを見つけていきます。SSGT ではプロパティー (要素または属性の名前)、型、関連、またはその他のコンポーネントのいずれかを検索対象として選択することができます。ここでは CMT に要素の名前を入力したので、プロパティーを検索するのが当然です。図 5 に、検索結果の一例を示します。

同じツール (SSGT) でマッピングも、サブセットの作成も行えるというのに、どうしてこれらのタスクが別々のステップとなっているのか、皆さんは不思議に思うかもしれません。確かに、SSGT を使ってマッピングとサブセットの作成を同時に行うことも可能です。けれども NIEM を利用している人の多くは、実際の (平坦化された) 型の構造がわかりやすく表示される NIEM Wayfarer または Schema Central でマッピングを行ったほうが簡単だと感じています。SSGT でナビゲートするには NIEM についての知識 (そしてクリックの回数) がより多く必要になるため、NIEM の何が必要なのかを具体的にリストアップした CMT を準備してから SSGT に取り掛かると、サブセットを効率的に作成することができます。

図 5. SSGT の検索結果ページ
SSGT での personname プロパティーの検索結果を示すスクリーン・キャプチャー
SSGT での personname プロパティーの検索結果を示すスクリーン・キャプチャー

プロパティーをサブセットに追加する

該当する NIEM コンポーネントが表示されたら、「Add (追加)」をクリックして、そのコンポーネントをサブセットに追加します。すると、追加したコンポーネントが左側ペインの「NIEM Schema Subset (NIEM スキーマ・サブセット)」の下に表示されます (図 6 を参照)。

プロパティーを追加すると、そのプロパティーの型も自動的に追加されます。例えば nc:PersonName を追加した場合には、nc:PersonNameType が自動的にサブセットに追加されます。明示的に選択したコンポーネントは左側ペインに太字で表示され、その隣にチェック・ボックスが示されます。一方、従属コンポーネントは太字で表示されません。

図 6. SSGT に表示されたサブセット
SSGT に表示されたサブセットのスクリーン・キャプチャー
SSGT に表示されたサブセットのスクリーン・キャプチャー

デフォルトでは、SSGT は型の子プロパティーを追加しません。例えば nc:PersonName を追加しても、そのプロパティーである nc:PersonGivenNamenc:PersonSurName は追加されません。これらのプロパティーは別途、サブセットに追加する必要があります。プロパティーの追加は nc:PersonName のコンテキストで行い、親と子の関係を維持してください。例えば、nc:PersonNamenc:PersonGivenName の関係を維持するには、SSGT 検索結果に表示された nc:PersonName ツリーを展開し、nc:PersonGivenName の隣にある「Add (追加)」をクリックします (図 7 を参照)。

図 7. SSGT での子の追加
SSGT を使用して子を追加し、その子のカーディナリティーを指定する操作を行う画面のスクリーン・キャプチャー
SSGT を使用して子を追加し、その子のカーディナリティーを指定する操作を行う画面のスクリーン・キャプチャー

別途 PersonGivenName を検索して、検索結果からこの要素を追加したとすると、要素は追加されますが、nc:PersonName の子にはなりません。

図 7 を見るとわかるように、型のプロパティーを追加する際には、そのカーディナリティーを指定することができます。「 Add (追加)」ボタンの右側にある下矢印をクリックすると、選択可能なカーディナリティーを示すドロップダウン・メニューが表示されます。デフォルトは 0 から無限大のカーディナリティーです。

継承によって組み込まれたプロパティーは、デフォルトでは SSGT 階層に表示されません。例えば、SSGT の検索結果で nc:Vehicle を展開しても、Property Description プロパティーにマッピングされている nc:ItemDescriptionText が自動的に表示されるわけではありません。継承されたプロパティーを表示するには、nc:VehicleType の隣に示された「show inheritance (継承を表示)」をクリックし、該当するプロパティーが含まれる型 (この例では nc:ItemType) を展開します (図 8 を参照)。

図 8. SSGT での継承されたプロパティーの追加
SSGT を使用して継承されたプロパティーを追加する操作を行う画面のスクリーン・キャプチャー
SSGT を使用して継承されたプロパティーを追加する操作を行う画面のスクリーン・キャプチャー

抽象要素とサブセット

NIEM モデルでは、XML Schema の抽象要素と置換グループをよく使用します。例えば、項目の色を表す方法はいくつもあります。NIEM にはその方法として、nc:ItemColor という抽象要素がありますが、XML インスタンスではこの要素を使用することができません。そのため、nc:VehicleColorPrimaryCodenc:ItemColorDescriptionText などの要素のいずれかによって、この抽象要素を置換する必要があります。XML Schema の用語では、nc:VehicleColorPrimaryCode および nc:ItemColorDescriptionTextnc:ItemColor の置換グループのメンバーということになります。

抽象要素はサブセットの作成にある程度の複雑さをもたらします。なぜなら、サブセットには抽象要素だけでなく、置換可能な要素も追加しなければならないためです。SSGT はすべての抽象要素を「abstract (抽象)」という言葉で示し、抽象要素を展開して置換可能な要素を確認できるようにしています (図 9 を参照)。

図 9. SSGT での置換可能な要素の追加
SSGT を使用して nc:ItemColor プロパティーの置換可能な要素を追加する操作を行う画面のスクリーン・キャプチャー
SSGT を使用して nc:ItemColor プロパティーの置換可能な要素を追加する操作を行う画面のスクリーン・キャプチャー

ほとんどの日付関連の型には、抽象要素 nc:DateRepresentation が含まれます。この抽象要素は nc:Date、nc:DateTime などで置換することができます。日付関連のプロパティーだけを追加するのは犯しがちな誤りです。例えば nc:ActivityDate を追加した後は、このプロパティーを展開して nc:DateRepresentation をクリックし、それから nc:Date をクリックして該当する子要素を使用できるようにしてください。

サブセットを微調整する:

サブセットを作成し終わったら、SSGT の左側ペインでサブセットを変更することができます。コンポーネントを削除するには、そのコンポーネントの隣にあるチェック・ボックスを選択してから「Delete (削除)」をクリックします。また、左側ペインの該当する単純型を展開して、コード・リストの許容値を削除することもできます。デフォルトでは、単純型のすべてのコード・リストの値がサブセットに組み込まれます。

さらに、カーディナリティーを変更することも可能です。それには左側ペインの先頭に示された「Edit Cardinality (カーディナリティーの編集)」をクリックします。この操作によって、親の型で許容する特定のプロパティーの出現回数を指定し直すことができます。

この時点では、作成した NIEM サブセットが完璧である必要はありません。NIEM サブセットの作成は多くの場合、繰り返しのプロセスです。サブセットを保存し、IEPD 開発の最終段階で必要に応じて変更することができます。

NIEM サブセットの生成

サブセットを生成するには、ページの右上隅に示された「Generate Documents (文書の生成)」をクリックします。すると、生成オプションを選択できる図 10 のようなウィンドウが表示されます。「Save Subset Schema to a file (サブセット・スキーマをファイルに保存する)」を選択し、保存先を選択してください。

図 10. SSGT でのサブセットの生成
SSGT を使用してサブセットを生成する操作を行う画面のスクリーン・キャプチャー
SSGT を使用してサブセットを生成する操作を行う画面のスクリーン・キャプチャー

上記の操作によって、Subset.zip という名前の .zip ファイルが作成されます。このファイルに含まれる niem サブフォルダーに、NIEM サブセットがあります。またこのファイルには、SSGT で選択した要素が属するすべての名前空間のスキーマ文書と、すべてのサブセットに付属するいくつかの標準スキーマも含まれます。

スキーマ文書に組み込まれているのは選択した型のみであり、これらの型に含まれているのは選択したプロパティーだけです。例えば、nc:PersonNameType が使用できる子は NIEM モデル全体で 7 つあり、このすべての子のカーディナリティーは 0..* ですが、生成されるサブセット・スキーマには、リスト 1 に示された子しか含まれません。

リスト 1. NIEM サブセットに含まれる nc:PersonNameType
<xsd:complexType name="PersonNameType">
  <xsd:complexContent>
    <xsd:extension base="s:ComplexObjectType">
      <xsd:sequence>
        <xsd:element ref="nc:PersonGivenName" minOccurs="0" maxOccurs="1"/>
        <xsd:element ref="nc:PersonSurName" minOccurs="0" maxOccurs="1"/>
      </xsd:sequence>
    </xsd:extension>
  </xsd:complexContent>
</xsd:complexType>

サブセットには wantlist.xml という名前の XML 文書も含まれています。この XML 文書には、サブセットに追加したすべてのコンポーネントがそれぞれのカーディナリティーと併せて記載されます。wantlist は、後で変更を行う必要がある場合に重宝します。wantlist を SSGT に再アップロードすれば、サブセットを変更して生成し直すことができるからです。リスト 2 に、wantlist の一部を記載します。

リスト 2. NIEM サブセットの wantlist (一部)
<w:WantList w:release="2.1" w:product="NIEM" ...>
  <w:Element w:name="j:Person" w:isReference="false"/>
  <w:Element w:name="j:Witness" w:isReference="false"/>
  ...
  <w:Type w:name="j:PersonType" w:isRequested="false">
    <w:ElementInType w:minOccurs="0" w:maxOccurs="1"
      w:name="j:PersonAugmentation" w:isReference="false"/>
  </w:Type>
  <w:Type w:name="j:WitnessType" w:isRequested="false">
    <w:ElementInType w:minOccurs="0" w:maxOccurs="1"
      w:name="j:WitnessAccountDescriptionText" w:isReference="false"/>
    <w:ElementInType w:minOccurs="1" w:maxOccurs="1"
      w:name="nc:RoleOfPerson" w:isReference="true"/>
  </w:Type>
  ...
</w:WantList>

今回のまとめと次のステップ

今回の記事では、CMT を使用して UML 情報交換モデルを NIEM にマッピングする方法、続いて NIEM SSGT を使用して NIEM サブセットを作成するプロセスを説明しました。連載の第 3 回では、CMT にまだ入力されていない行、つまり拡張に対処します。NIEM を拡張するさまざまな手法を説明した後、交換スキーマと拡張スキーマを作成するプロセスを手順に沿って説明します。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=XML
ArticleID=480455
ArticleTitle=NIEM IEPD を作成する: 第 2 回 NIEM のマッピングとサブセットの作成
publish-date=03092010