您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
   
 
     
   
 订阅
  捐助
创建一个 NIEM IEPD,第 2 部分: 映射和 NIEM 子集
 
  1792  次浏览      17
 2018-8-1
 
编辑推荐:
本文来自于ibm.com,展示了如何使用 CMT 将 UML 交换模型映射到 NIEM,使用 NIEM SSGT 创建 NIEM 子集的过程。

创建组件映射模板

CMT 通常在 Microsoft? Office Excel? 或其他电子表格软件(比如 OpenOffice.org Calc)中创建。但是,CMT 可以使用任意表格格式创建。CMT 没有固定的格式,但是一个典型的 CMT (最少)包含以下几列:

源类型:UML 模型中类的名称。

源属性:UML 模型中属性的名称。

数据类型:属性的数据类型。

说明:类型或属性的简短说明。

基数:允许出现的属性的数量。

扩展指示符:模型是否匹配 NIEM 模型中的一个组件。

XPath:到 XML 消息中元素的路径。

有些 NIEM 实现者向 CMT 添加更多列来表示扩展 NIEM 的细节,本系列第 3 部分将深入探究扩展 NIEM。

在 CMT 中记录模型

第一步是在 CMT 的前 5 列中记录 UML 模型。本系列 第 1 部分 介绍了一个简单的示例案例的 UML 图表,该案例涉及报告已注册车辆的失窃情况。根据那个 UML 类图表 — 再次展示在 图 1 中 —表 1 显示了 CMT 格式的 TheftLocation 类。为节约空间,表 1 中省略了说明,您可以从 下载 部分获取一个完成的示例 CMT。(查看 图 1 的纯文本版本。)

图 1. 第 1 部分中的 UML 模型图表

表 1. 在 CMT 中表示一个类型和一些属性

在数据类型列中,使用了 XML Schema 简单类型名称。如果是代码列表,那么需要指定一个代码列表名称,而有效值则记录在电子表格的另一个标签中。基数显示最小和最大出现次数,其中 * 表示一个无限大的数量。

每个关联都应该在 CMT 中拥有一行,并用几行来表示对该关联中涉及的类型的引用。表 2 展示了 Theft/TheftLocation 关联的一个 CMT 表示。

表 2. 在 CMT 中表示一个关联

角色类型应该使用一些引用来展示,这些引用的范围涵盖角色到担任该角色的类型。表 3 中的 Witness 角色类型包含一个对 Person 的引用,标注为 RoleOfPerson。

表 3. 在 CMT 中表示一个角色

搜索 NIEM 等价元素

映射交换的下一个任务是确定您的模型和 NIEM 重叠的位置,并在 CMT 中记录那些元素。应该尽量重用 NIEM,以便最大化与其他 NIEM 应用程序的互操作性。如果一个 IEPD 在 NIEM 模型中已存在语义上等价的组件时仍添加新组件,那么这个 IEPD 就是不遵守 NIEM 的。也就是说,如果数据的确不适合 NIEM,那么不应该将该数据强行添加到 NIEM 中。本系列第 3 部分将解释如何向 NIEM 模型添加新组件。

由于 NIEM 模型非常大,您肯定不会希望手动扫描架构来寻找匹配的组件。幸运的是,有几个在线工具可用于找到 NIEM 模型中的匹配组件(参见 参考资料 获取这些工具的链接):

NIEM Wayfarer。使用这个工具,能够搜索 NIEM 组件,并以一个组件一页的方式遍历 NIEM 模型。

Schema Central。这个工具的功能类似于 NIEM Wayfarer,但适用于各种 XML 词汇表,而不仅仅是 NIEM。

NIEM Schema Subset Generation Tool (SSGT)。使用这个工具,能够以稍微图形化一些的方式搜索并导航 NIEM 模型。一旦发现感兴趣的组件,这个工具还提供生成 NIEM 子集的附加功能。

使用上述工具在 CMT 中寻找 NIEM 中可能已经存在的所有组件。例如,在 Schema Central 中搜索词汇 Vehicle 时,将会看到 图 2 中的搜索结果页面。

图 2. Schema Central 搜索结果页面

单击 nc:Vehicle,将显示 图 3 中的页面,其中显示有该元素的一些一般特征,以及可能的子元素的完整列表。

图 3. Schema Central 元素显示页面

所有的 NIEM 组件都有一个名称空间前缀 nc,表示 NIEM Core,这是其中驻留有最基本的类型的名称空间。每个域都有一个名称空间(例如,j 表示 Justice)。可以放心地使用任何域中的 NIEM 组件,只要它们与您的模型在语义上对等。不必为了使用 immigration 域中的一个元素而特意实现一个与 immigration 相关的交换。

NIEM 模型搜索指南

不管使用何种工具,都可以通过以下技巧使得搜索 NIEM 模型更为轻松:

比较容易的方法通常是首先寻找级别最高的类型/类(在示例案例中为 Theft、Property、Location 等),然后寻找适当的属性。

不要忘了搜索同义词。如果找不到 License Plate,可以尝试寻找 Registration。

如果找不到具体组件,可以寻找更通用的组件。NIEM 中的一些最通用的类型是 Person、Organization、Location、Activity 和 Item。例如,如果找不到 Theft Location,可以寻找更通用的 Location 并使用 nc:Location。如果没有 Theft 的具体类型,可以考虑使用更通用的 nc:Activity。

不要只搜索名称。如果将搜索范围扩展到说明和枚举,可能会找到适当的类型。

寻找 NIEM 模型中的组件最初可能令人望而生畏,但随着您逐渐熟悉 NIEM 模型的常用命名和构造模式,搜索过程就会变得更加简单。

在 CMT 中记录 NIEM 组件

找到一个对等 NIEM 组件后,应将它记录在 CMT 中的 XPath 列中。通常要使用简单的 XPath 表达式 — 元素和/或属性名称以斜杠(/)分隔。类型名称不需要包含在 XPath 中。使用名称空间前缀(比如 nc:),因为元素名称在不同的名称空间之间不一定是惟一的。

表 4 展示了 TheftLocation 的 XPath 映射。注意:为了更美观,较长的 XPath 映射分割为表格中的多个行,但映射通常是单个字符串。

表 4. TheftLocation XPath 映射

XPath 中应该包含足够的步骤,以便惟一地识别它。例如,不要仅仅在行中放置 nc:StreetFullText 来表示 Address。有时,多条路径可能会到达 NIEM 中的一个元素,因此,为精确起见,需要完整的路径。

在本例中,CountyCode 属性(一个特定于州的区县代码)在 NIEM 中不存在,因此它需要一个扩展。因此,Ext? 列设置为 Y,且 XPath 目前为空白。本系列的第 3 部分将详细介绍为扩展填充 XPath 的过程。

要查看从 Theft Report 示例模型到 NIEM 的完整映射,请参见 下载 部分提供的电子表格。

创建 NIEM 子集

决定在交换中使用 NIEM 的哪些组件之后,就可以创建 NIEM 模型的子集,其形式为一组 XML Schema 文档。由于完整的 NIEM 模型非常大、其约束非常松散,因此一个 NIEM 子集是很必要的,可以更精确地验证您的交换。NIEM 子集限制允许的元素和属性,它们可以出现的次数,以及 —在某些情况下— 它们允许的值。创建一个 NIEM 子集还能加速 XML 消息的验证,因为其架构要小得多。

我们使用 NIEM SSGT 创建 NIEM 子集。图 4 中 SSGT 的初始页面包含两个窗格:右边的窗格用于搜索和导航 NIEM 模型,左边的窗格用于在您添加组件时显示子集。

图 4. SSGT 主页面

根据您的 CMT 执行一些搜索,找到一些组件并将其添加到子集中。使用 SSGT,可以选择搜索属性(元素或属性名称)、类型、关联或其他组件。由于 CMT 中有元素名称,因此搜索属性更明智。样例搜索结果如 图 5 所示。

您可能会感到奇怪:既然可以在同一个工具(SSGT)中执行映射和子集创建任务,那么映射和子集创建为何还是两个独立的步骤?使用 SSGT,同时执行映射和子集创建操作是完全可能的。但是,许多 NIEM 从业人员发现,使用 NIEM Wayfarer 或 Schema Central 进行映射更简单,它们能更清晰地显示实际(或扁平)的类型结构。使用 SSGT 进行导航需要更多 NIEM 知识(和更多鼠标单击),因此,在准备好一个准确列出您想要的组件的 CMT 之后再选择使用 SSGT 能够使子集创建操作更高效。

图 5. SSGT 搜索结果页面

向子集添加属性

当显示出感兴趣的 NIEM 组件时,单击 Add 将其添加到子集。然后,它将出现在左边窗格中的 NIEM Schema Subset 下方,如 图 6 所示。

添加属性时,将自动添加属性类型。例如,如果添加 nc:PersonName,nc:PersonNameType 也将自动添加到子集中。显式选择的组件将以粗体形式出现在左边窗格中,旁边带有一个复选框,而附属组件则不以粗体显示。

图 6. SSGT 子集

SSGT 并不默认添加类型的子属性。例如,如果添加 nc:PersonName,它不会包含 nc:PersonGivenName 和 nc:PersonSurName 属性,必须分别添加这些属性。添加它们时,必须位于 nc:PersonName 上下文中,以便它们(比如 nc:PersonName 和 nc:PersonGivenName)之间的父子关系能够得以保持。为此,在 SSGT 搜索结果中展开 nc:PersonName 树,并单击 nc:PersonGivenName 旁边的 Add,如 图 7 所示。

图 7. 使用 SSGT 添加子元素

反之,如果独立搜索 PersonGivenName 并从搜索结果添加它,那么该元素将被添加,但不是作为 nc:PersonName 的子元素。

图 7 还显示了,添加类型的属性时可以指定基数。单击 Add 按钮上的向下箭头将显示一个下拉菜单,其中显示出可能的基数。默认值是 0 到无穷大。

如果一个属性通过继承被包含,那么它默认不显示在 SSGT 层次中。例如,在 SSGT 搜索结果中展开 nc:Vehicle 不会自动显示映射到 Property Description 属性的 nc:ItemDescriptionText。要查看这些继承属性,看单击(nc:VehicleType 旁边的)show inheritance 并展开包含相关属性的类型 — 在本例中为 nc:ItemType,如 图 8 所示。

图 8. 使用 SSGT 添加继承属性

抽象元素和子集

NIEM 模型通常使用 XML Schema 抽象元素和替换组。例如,有几种方法可以用来表示一个货物的颜色。NIEM 有一个抽象元素—nc:ItemColor— 它不能出现在 XML 实例中的任何位置。相反,它必须用几个元素中的一个来替换,比如 nc:VehicleColorPrimaryCode 或 nc:ItemColorDescriptionText。在 XML Schema 术语中,nc:VehicleColorPrimaryCode 和 nc:ItemColorDescriptionText 称为一个替换组 的成员,它们的上级 是 nc:ItemColor。

抽象元素增加了创建子集的复杂性,因为必须在子集中添加可替换的元素,而不只是抽象元素。SSGT 使用单词 abstract 标记所有抽象元素,并允许您展开它们查看可替换的元素,如 图 9 所示。

图 9. 使用 SSGT 添加可替换元素

大多数日期相关类型也包含一个抽象元素 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 生成子集

上述操作将创建一个名为 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 文档,它列出已添加到子集中的所有元素及其基数。如果稍后要进行修改,这个 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 子集的过程。

   
1792 次浏览       17
 
相关文章

UML概览
UML图解:用例图(Use case diagram )
UML图解:活动图(activity diagram )
UML图解:类图(class diagram )
UML图解:对象图(object diagram)
UML图解:顺序图( sequence diagram )
 
相关文档

模型跟踪:跟踪图、矩阵、关系(建模工具EA)
自定义表格(Custom Table)在EA中的使用
元素的详情浏览控制
UAF 1.2规范解读(DMM 和 UAFML )
EA中支持的各种图表
EA中的界面原型建模
 
相关课程

UML与面向对象分析设计
UML + 嵌入式系统分析设计
业务建模与业务分析
基于SysML和EA进行系统设计与建模
基于模型的需求管理
业务建模 & 领域驱动设计