National Information ExchangeModel (NIEM) 是一個由美國政府資助的創新項目,旨在促進公共領域和私有領域組織間的信息共享。該項目最初關注法律實施、公共安全和應急管理,但它正在不斷擴展,進入其他領域。美國司法部、國土安全部以及其他美國政府部門中的新的 XML 創新項目將 NIEM 用作一個公共基礎數據模型和方法學,以便促進數據和軟件之間的互操作性,減少信息交換應用程序的設計和開發時間,以及支持知識資產和技術的跨項目重用。
NIEM 被描述為一個框架,因為它不只是用於信息交換的一個 XML 詞匯表,它包含幾個組件:
一個基於 XML 的公共數據模型(稱為 NIEM 核心),提供描述人員、地址、活動和組織等通用對象的數據組件。
用於個別用例的更專業的 XML 數據模型(稱為域),比如 Justice、Immigration 和 Emergency Management。
一個方法學,用於使用和擴展來自公共和特定域的模型的構造塊,將它們轉換為一個完整的信息交換(稱為一個 信息交換包)。
幫助開發、驗證、歸檔和共享信息交換包的工具。
一個提供培訓和支持並監督 NIEM 隨時間的演變的治理組織。
作為共 4 部分的文章系列的第一部分,本文向您介紹 NIEM,展示如何使用 Unified Modeling Language (UML) 建模一個 NIEM Information Exchange Package Documentation (IEPD)。工作模型和最終 UML 模型可從 下載 部分獲取。
如何使用 NIEM?
NIEM XML 數據模型提供公共對象的構造塊。一個構造塊可能處於一個非常細粒度的級別,比如 “個人姓名” 或 “生日”,也可能是一個更復雜的組件,比如 “拘捕” 或 “訴訟案件”。但是,NIEM 模型本身並不定義完整的信息交換消息,比如 “Arrest Report” 或 “Suspicious Activity Report”。它也不指定任何特定消息類型或 XML 文檔的根元素。
要實際使用 NIEM,需要構建一個 IEPD。IEPD 從 NIEM 核心和域模型提取必要的元素,並擴展它們來創建一個信息交換。一個 IEPD 包含幾個工件:
XML 模式定義在這個交換中使用的 NIEM 模型的子集,稱為子集模式。
一個定義交換的根元素的模式,稱為交換模式。
一個定義 NIEM 模型的擴展的模式,稱為擴展模式。
交換文檔,比如 UML 圖表、敘述性說明和樣例。
開發一個 IEPD
任何信息交換項目的首要任務都是收集並分析您的需求。NIEM 並不需要任何特殊的方法來定義需求,因此本文不介紹這個過程。事實上,本文假設您在實際創建您的 IEPD 之前,已經對想要交換的數據元素和用於組織這些元素的消息類型有所認識。
本文將從頭至尾詳細介紹一個簡單示例,最後生成一個完整的 IEPD。這個示例案例研究報告將實現一個簡單的涉及注冊車輛的盜竊報告。假設當地司法機關將使用這個盜竊報告來通知有關各方(比如 Division of Motor Vehicles 或 City Bicycle Registration Bureau)關於機動車和自行車的盜竊情況。在我的需求收集階段,我已經收集了關於需要共享的數據的一般信息,並確定只需一種類型的消息:盜竊報告。在現實中,一個 IEPD 通常包含多個相關的消息類型。
由於 NIEM 的一個主要目標是數據互操作性,合理的做法是在從頭創建一個新的 IEPD 之前考慮重用一個現有的 IEPD。NIEM 提供了一個 IEPD 交換所(clearinghouse),支持搜索由其他組織提交的 IEPD。
如果您不能找到一個符合需求的 IEPD,則需要構建一個。構建一個新的 NIEM IEPD 需要以下 5 步:
建模您的交換。
將您的交換映射到 NIEM 數據模型。
創建一個 NIEM 模型的子集以用於您的交換。
創建交換和擴展模式來描述您的自定義組件。
使用所有合適的工件來組裝一個 IEPD。
本文將介紹步驟 1,本系列其他文章將介紹步驟 2 到步驟 5。即使您選擇重用一個現有 IEPD,這個系列文章也可能有助於您理解您正在使用的 IEPD 的內容和結構。
理解 NIEM 模型
在為您的交換創建一個模型之前,理解 NIEM 數據模型的結構是很有用的。NIEM 定義了一些概念 — 比如類型、屬性和關聯 — 您可能已從其他數據建模范式中熟悉了這些概念。
NIEM 模型概念
類型 表示事物 —— 無論是有形事物還是無形事物。NIEM 模型中的一些最基本的類型是 PersonType、ActivityType、ItemType、LocationType 和 OrganizationType。還有數千種類型,它們使用不同的粒度水平。在其他建模范式中,類型可能稱為類別 或實體。
屬性(properitIEs)是類型的特性(attributes)。它們本身可以擁有復雜的類型。例如,PersonName 是 PersonType 的一個屬性,但它也可以擁有一個類型 PersonNameType,這個類型擁有自己的結構,包含 PersonGivenName、PersonSurName 等。
類型可以從其他類型派生出來並繼承它們的屬性,這類似於面向對象模型中的泛型(generalizations)。例如,ItemType 是一個泛型,派生出很多類型,包括 VehicleType、JewelryType 和 RealEstateType。
關聯 指兩種類型之間的關系。Incident 和 Person 之間可能有一個關聯,Person 和 Location 之間也可能有一個關聯。NIEM 中的關聯獨立於它們與之相關的類型。
角色 表示一種類型在一個特殊的上下文中可能擁有的臨時從屬關系。例如,在一個盜竊事件中,某個人可能充當 Victim、Subject 或 Witness 角色。
augmentations 是可以重用和共享的屬性集。這些屬性在 NIEM 域模型中經常使用,但在您的 IEPD 中則使用的少一些。
元數據 是關於一條消息的內容的信息,比如信息收集時間,信息可靠程度等。NIEM 在其模型中在相關數據到元數據之間進行特殊的供應。
XML 中的 NIEM 模型
NIEM 模型完全作為一組 W3C XML Schema 文檔實現。XML 模式中的注釋和引用用於表明某個事物是否是一個類型、一個關聯等。幸運的是,您不必閱讀 XML 模式文檔本身來導航這個模型;NIEM 提供了一些工具來以更圖形化的方式搜索和導航這個模型。
通常,NIEM 類型被實現為 XML Schema 復雜類型,屬性為這些類型中包含的元素。清單 1 展示了如何使用一個 ActivityType 復雜類型來表示一個活動,ActivityIdentification 和 ActivityCategoryText 等屬性被實現為子元素。
清單 1. XML Schema 中的部分 NIEM ActivityType 實現
<xsd:complexType name="ActivityType">
<xsd:complexContent>
<xsd:extension base="s:ComplexObjectType">
<xsd:sequence>
<xsd:element ref="nc:ActivityIdentification" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element ref="nc:ActivityCategoryText" minOccurs="0" maxOccurs="unbounded"/>
<!-- ... -->
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
NIEM 使用 XML Schema 擴展進行類型派生。清單 2 展示了一個更具體的活動 — AssessmentType 復雜類型 — 如何從 ActivityType 派生而來。
清單 2. XML Schema 中的 NIEM 類型派生
<xsd:complexType name="AssessmentType">
<xsd:complexContent>
<xsd:extension base="nc:ActivityType">
<xsd:sequence>
<xsd:element ref="nc:AssessmentScoreText" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element ref="nc:AssessmentFee" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element ref="nc:AssessmentProgram" minOccurs="0" maxOccurs="unbounded"/>
<!-- ... -->
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
關聯是特殊的復雜類型,包含對它們關聯的類型的引用。清單 3 展示了如何實現一個人和一個活動之間的關聯 — ActivityPersonAssociationType。所有關聯類型都是 NIEM 核心 AssociationType 的直接或間接的擴展。
清單 3. XML Schema 中的 NIEM 關聯類型
<xsd:complexType name="ActivityPersonAssociationType">
<xsd:complexContent>
<xsd:extension base="nc:AssociationType">
<xsd:sequence>
<xsd:element ref="nc:ActivityReference" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element ref="nc:PersonReference" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
建模您的交換
NIEM 不需要您使用任何特殊方法學或圖表類型來建模您的 XML 交換,甚至根本不需要您建模。但是,建模是 IEPD 設計中的一個重要步驟。建模過程能使需求具體化,最終結果為業務和技術用戶提供了有幫助的文檔。這個模型還充當 IEPD 創建過程中的後續步驟的有用輸入。
選擇一個模型范式
使用 UML 工具
如果您使用 UML,那麼使用一個支持 XML 的 UML 工具(比如 IBM® Rational® Modeler or ArgoUML)將很有用,因為您能夠使用 XML 來自動生成一個映射電子表格,您可以在下一步使用這個電子表格。在本文中,我使用一個開源 UML 編輯器 ArgoUML。
一個好的選擇是 UML — 特別是 UML 類圖表 — 因為 UML 概念可以輕松映射到 NIEM 模型概念。當然,您可以創建其他 UML 范式(比如用例圖表和序列圖表)來歸檔您的交換。本文主要關注類圖表,因為它對 IEPD 開發流程最為關鍵。
最好首先獨立創建您的初始模型,不要試圖使其適應 NIEM 模型。只有避免受到 NIEM 方法的影響,您才能使您的模型更適合您的業務需求。在 IEPD 流程的後面的幾個階段,經常會對初始模型進行一些微小的有意義的修改來更好地適應 NIEM。但是,您的模型和 NIEM 模型之間總是有區別的。
類型和屬性
本文篇幅有限,不能完整地介紹 UML 建模,因此本文主要關注特定於 NIEM 的指針。如您所料,NIEM 類型由一個類別圖表中的類別表示。屬性(propertIEs)由類的特性(attributes)表示。
在我的示例案例研究中,我確定了幾個需要交換的類 — 例如 Theft、MotorVehicle、Bicycle、Victim、Witness 和 TheftLocation。圖 1 描述了這些類型及其屬性。
圖 1. 帶有類型及其屬性的初始 UML 模型
查看原圖(大圖)
指定屬性的數據類型時,使用 XML Schema 原始數據類型很有用,因為屬性將最終在一個 XML 模式中表示,且如果您使用一個公共數據類型組,則可以更輕松地確定現有 NIEM 模型是否適合您的需求。表 1 列示了最常用的 XML Schema 數據類型。
表 1. 常用 XML Schema 數據類型
數據類型名稱 說明 示例 string 任何文本字符串 abc, this is a string integer 任意大小的整數 1, 2 decimal 小數 1.2, 5.0 date YYYY-MM-DD 格式的日期 2009-12-25 time HH:MM:SS 格式的時間(24 小時制) 12:05:04 boolean true/false 值 true, false有些屬性擁有一個有效值的枚舉列表,也稱為代碼列表。代碼列表值可以在 UML 模型中用注釋描述,也可以記錄在系統文檔的其他地方。在我的示例中,為保持模型整潔,我僅僅將這些值列舉為擁有一個數據類型 code。我將在這個 IEPD 流程的下一步驟中創建的映射電子表格中記錄有效值。
泛型和角色
NIEM 模型使用泛型,在適當的時候,您應該在您的模型中使用它們。在這個案例研究中,MotorVehicle 和 Bicycle 都是可能失竊的財產的具體種類。因此,我決定添加一個更通用的 Property 類並從該類派生出 MotorVehicle 和 Bicycle。這樣做的話,我只需定義一次 SerialNumber 等公共屬性,還能通過允許 Property 類關聯到 Theft 類來簡化關聯。
Victim 和 Witness 似乎遵循相同的規則,畢竟它們都是更具體的人員種類。但是,某個人作為目擊者或受害人的狀態是臨時的,因此最好將其表示為一個角色。事實上,在本例中,同一個人在一個具體的盜竊案例中可以同時作為受害人和目擊者。在這種情況下,您將使用兩個不同的角色來表示同一個人。我通過以下方法在我的模型中展示這一點:添加一個單獨的 Person 類,並創建到 Victim 和 Witness 類的關聯。我將這樣的關聯標記為 Role Of Person,以表明它們通過一個角色而不是一個常規關聯相關。
圖 2 展示了添加了泛型和角色的模型。
圖 2. 添加了泛型和角色的 UML 模型
查看原圖(大圖)
關系
UML 有三種方法來表示關系:聚合(aggregations)、復合(compositions)和關聯(associations)。
聚合和復合關系通常表示 “擁有” 關系,其中一個類隸屬於另一個類。在這個示例案例研究中,一個 Person “擁有” 一個 PersonName。如果沒有一個 person 與之關聯,PersonName 類毫無用處。聚合和復合在 NIEM 中受到同等對待。在最終的 XML 結構中,附屬類將包含在其他類中。例如,有一個 Person 元素,它包含一個 PersonName 元素。
相反,關聯處於兩個獨立存在的類之間。在這個示例案例研究中,Theft 和 TheftLocation 是兩個獨立的類,不需要依賴對方就可以獨立存在。為在您的模型中表示這些關聯,您可以使用泛型 UML 關聯,或者,如果有額外的屬性與關聯本身相關,那麼可以對模型添加獨立的關聯類。無論哪種方法,在這個 NIEM XML 結構中,這些類都應表示為帶有一個獨立的關聯元素的明確元素。這個關聯元素包含與它有關的那些元素的引用 — 在本例中這些元素為 Theft 和 TheftLocation。
在這個示例案例研究中,我使用復合來表示 Person-PersonName 關系,用簡單的 UML 關聯來使這些類的其余部分互相相關。圖 3 展示了添加了關系後的模型。
圖 3. 添加了關系的 UML 模型
查看原圖(大圖)
選擇一個根
每條 XML 消息必須擁有一個根。通常,在一個 XML 交換中,消息有一個關注點或目的。在本例中,它是盜竊報告本身。我對我的模型添加了一個 TheftReport 類和一個屬性 TheftReportDate,在 TheftReport 和 Theft 之間添加了一個聚合關系,表明這個盜竊報告包含一組盜竊。
圖 4 展示了完成後的 UML 模型。這個模型並不完美,也不必完美。在整個 IEPD 開發過程中對模型進行反復修改是很常見的。例如,在適當的時候,修改結構和名稱來更好地適應 NIEM 模型可能很有用。
圖 4. 完成的 UML 模型
查看原圖(大圖)
結束語
本文在一個較高的層面上描述了創建一個 NIEM IEPD 涉及的步驟,深入介紹了第一個步驟:創建模型。這個步驟的結果是一個 UML 模型的工作草案,您可以使用它來繼續 IEPD 開發。如果您在建模過程中使用針對 NIEM 的概念,比如角色和 XML Schema 數據類型,那麼 IEPD 開發過程的其余步驟將變得更輕松。
本系列下一篇文章將介紹第二步和第三步:映射和劃分子集,您將學習如何創建一個將 UML 模型映射到 NIEM 的組件映射模板,並生成 NIEM 模型的一個子集來匹配您的映射。
本文示例源代碼或素材下載