NIEM IEPD を作成する: 第 2 回 NIEM のマッピングとサブセットの作成

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

この連載の第 1 回では、NIEM (National Information Exchange Model) で実装する XML 情報交換の UML モデルを作成するプロセスを説明しました。今回の記事では次のステップとして、作成したモデルを NIEM モデルにマッピングし、情報交換で NIEM のどの部分を再利用できるかを判断します。さらに、IEPD に組み込む NIEM モデルのサブセットを作成する方法も説明します。

Priscilla Walmsley, Managing Director, Datypic

Photo of Priscilla WalmsleyPriscilla Walmsley は、Datypic の取締役兼シニア・コンサルタントです。彼女の専門は XML 技術、設計、および実装で、最近では (Trusted Federal Systems を通じて) 米国司法省に協力し、NIEM ベースの IEPD フレームワーク、LEXS に取り組みました。著書には『Definitive XML Schema』(Prentice Hall、2001年)、『XQuery』(O'Reilly Media、2007年) があります。また、『Web Service Contract Design and Versioning for SOA』(Prentice Hall、2008年) の共著者でもあります。



2010年 3月 09日 (初版 2010年 2月 09日)

2010年 3月 09日: 「はじめに」、「まとめ」、および「参考文献」の各セクションに、連載第 3 回のリンクを追加。

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

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

CMT の作成

よく使われる頭字語

  • CMT: Component Mapping Template
  • IEPD: Information Exchange Package Documentation
  • NIEM: National Information Exchange Model
  • SSGT: NIEM Schema Subset Generation Tool
  • UML: Unified Modeling Language
  • XML: Extensible Markup Language

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 (盗難報告書) クラスを追加)
表 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」というストリングが含まれる要素、複合型、および単純型が一覧表示されています。

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

図 3. Schema Central の要素表示ページ
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 メイン・ページのスクリーン・キャプチャー

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

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

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

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

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

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

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

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

図 7. 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 を使用して継承されたプロパティーを追加する操作を行う画面のスクリーン・キャプチャー

抽象要素とサブセット

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 プロパティーの置換可能な要素を追加する操作を行う画面のスクリーン・キャプチャー

ほとんどの日付関連の型には、抽象要素 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 を使用してサブセットを生成する操作を行う画面のスクリーン・キャプチャー

上記の操作によって、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 を拡張するさまざまな手法を説明した後、交換スキーマと拡張スキーマを作成するプロセスを手順に沿って説明します。


ダウンロード

内容ファイル名サイズ
Component Mapping Template (CMT)niem2mapping.zip62KB
NIEM Subsetniem2subset.zip11KB

参考文献

学ぶために

製品や技術を入手するために

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


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