APP下载

基于本体语义映射的MDA模型转换方法*

2010-11-02崔玲玲周桂鑫

潍坊学院学报 2010年6期
关键词:C语言本体语义

崔玲玲,周桂鑫

(潍坊学院,山东 潍坊 261061)

基于本体语义映射的MDA模型转换方法*

崔玲玲,周桂鑫

(潍坊学院,山东 潍坊 261061)

模型转换是MDA的一项关键技术,模型转换的正确性问题是MDA研究的核心问题。模型转换的正确性包括语法正确性、语义正确性等,而目前国内外存在的大多数模型转换方法都是在语法层次进行的,缺乏语义正确性的验证,针对该问题,本文提出了基于本体语义映射机制的模型转换方法,给出了一系列的转换规则,以UML模型到C语言模型的映射为例,进一步讨论了不同抽象层次模型之间映射关系的建立过程以及所应遵循的基本原则。本方法用本体实现语义层的模型转换,提高了模型自动变换的效率,还为验证模型之间映射规则的可行性和正确性提供了依据。

模型驱动体系结构;模型转换;本体语义映射;转换规则

0 引言

模型驱动体系结构(model driven architecture,MDA)是国际标准组织OMG于2001年提出的一种基于模型的软件开发框架性标准。它的关键之处是模型在软件开发过程中扮演了非常重要的角色,在MDA中,软件开发过程是由对软件系统的建模行为驱动的。MDA的核心思想是抽象出与实现技术无关、完整描述业务功能的平台无关模型(Platform Independent Model,PIM),针对不同实现技术制定多个变换规则,然后通过这些变换规则及辅助工具将PIM变换成与具体实现技术相关的平台相关模型(Platform Special Model,PSM),最后在一定程度上将PSM自动转换成代码[1]。

目前国内外对MDA中模型变换的研究很多,主要的转换方法有以下几种[2]:

(1)直接转换方法

这种方法提供一个内部模型表示加上一些操控模型的API,程序员使用可以访问和操作模型的API对源模型进行转换,从而得到目标模型的方法。

(2)目标结构驱动的方法

这类方法包括两个阶段,首先建立目标模型的层次结构,然后设置属性和引用。整个框架决定进度安排和应用策略,用户主要提供转换规则。

(3)关系方法

是一种利用关系代数在源模型级别进行模型转换定义的方法。基本思想是采用一种模式将源模型中的元素到目标模型元素之间的一个映射表达为一个“关系对”,将“模型转换”表达为一个二元关系或者一组二元关系。利用关系代数中的“关系”来表达模型转换的定义,利用关系代数中的性质来表达模型转换中的约束。

(4)基于图转换的方法

采用图转换的理论,在类似UML模型的图上操作,类、对象等建模元素映射为一个图顶点,它们之间的关系映射为边。

目前大多数的模型转换方法还是在语法层上进行的,这样就使得模型在转换过程中缺乏语义保障。本文提出的模型变换方法采用本体来描述语义层上的模型,则计算机可以通过本体理解模型的含义,整个模型转换过程就有了语义保障。

1 本体的相关概念

1.1 本体论

本体论(Ontology)的概念最早起源于哲学领域,它在哲学中的定义为“对世界上客观存在物的系统描述,即存在论”,是对客观存在的一种系统的解释或说明,关心的是客观现实的抽象本质[3]。人工智能等学科将本体的概念从哲学领域中借用过来,并赋予了一些新的含义。目前被大部分人公认的定义是美国Stanford大学的知识系统实验室的学者 Tom Gruber在1993年提出的“本体是概念模型的明确的规范说明”。其形式化定义为:

这里,C代表概念集合,即抽取出来用来描述事物对象的集合;I表示概念的实例,代表元素,从语义上讲实例表示的就是对象;R为定义在概念集合上的关系的集合;F为定义在概念集合上的函数的集合;A表示公理集合,用于约束概念、关系和函数的一阶逻辑谓词集合[4]。

1.2 本体映射

本体映射就是给定两个本体A和B,对于A中的每一个实体,设法在B中找到与其有相同或相近语义的实体,这些实体包括本体中的类、属性以及类的实例[6]。本体映射是解决不同本体间知识共享和重用的方法,目的是找出不同本体中实体之间的语义关联,并且将其形式化地表达出来。

Ehrig给出了一个形式化的本体映射函数[7]:

如果sim(e1,e2)>s,则 map(e1)→e2,其中e1和e2分别是两个本体中的实体,sim(e1,e2)是这两个实体之间的相似度,s是相似度阙值。

1.3 模型映射的层次

基于本体语义映射,可以把不同抽象层次模型之间的映射关系大致分为类型之间的映射、结构之间的映射以及它们之间约束关系的映射。

不同描述语言之间的类型映射可以分为简单映射和扩展映射两种。简单映射是指在目标模型描述语言中直接存在和源模型描述语言中对应的类型,并且其语义一致。扩展映射是指在目标模型描述语言中不存在与源模型描述语言对应的类型,但可以通过特定的组合方式来模拟出这种数据类型[8]。

由于不同模型描述机制的差异,映射关系一般有1:1,1:n和m:n三种,另外m:n的映射关系可以用多个1:n和n:1的映射关系来组合表示,因此可以将结构映射分为直接映射、分解映射和组合映射等。

直接映射:即一对一的映射,把源模型一个结构直接映射为目标模型一个结构。

分解映射:即一对多的映射,把源模型一个结构映射为目标模型的多个结构的组合。

组合映射:即多对一的映射,把源模型的多个结构的组合映射为目标模型的一个结构。

模型之间的映射不仅要进行源模型到目标模型的类型映射和结构映射,同时要求目标模型的各组成模块要保持它们在源模型中的语义特性约束关系。因此要依据各模块的语义特性和模块间的约束关系,把各个子目标模块融合为一个整体的目标结构模型,从而得到源模型到目标模型的全部映射关系。

2 UML类图到C语言模型的映射

类图(Class Diagram)是描述类、接口、协作以及它们之间关系的图,用来显示系统中各个类的静态结构。一个类图,根据系统中的类以及各个类之间的关系描述系统的静态视图。静态视图可以包括许多的类图。静态视图用于为软件系统进行结构建模,它构造系统的词汇和关系,而结构模型的可视化就是通过类图来实现的。

类图包含以下几个元素[9]:类、接口、依赖关系、泛化关系、实现关系以及关联关系。

2.1 类

类是任何面向对象系统中最重要的构造块。类是一种重要的分类器,用来描述结构和行为特性的机制,是对一组具有相同属性、操作、关系和语义的对象描述。类的属性是类的一个组成部分,它描述了类在软件系统中代表的事物所具备的特性。属性描述了正在建模的事物的一些特性,这些特性是所有对象所共有的。类的操作是对类的对象所能做的事务的抽象。它相当于一个服务的实现,该服务可以由类的任何对象请求以影响其行为。在C语言中没有直接与其对应的类型或结构,可以利用C语言中的结构体和函数来模拟类的实现。实现代码如下所示:

2.2 接口

接口是一系列操作的集合,它指定了一个类所提供的服务。接口与类定义的差异在于接口只含有函数成员,而无数据成员,所以仍然可以使用C语言的结构体来实现接口机制。

类不是独立存在的,大多数的类以某些关系彼此协作。在类的关系中,最常用的4种分别为:依赖(Dependency),表示类之间的使用关系;泛化(Generalization),表示类之间的一般和特殊的关系;关联(Association),表示对象之间的结构关系;实现(Realization),是规格说明和其实现之间的关系。

2.3 依赖关系

有两个元素,如果修改X的定义可能会导致对 Y的定义,则认为 Y依赖X。依赖关系可能由各种原因引起,如一个类向另一个类发送消息,或者一个类是另一个类的数据成员类型,或者一个类是另一个类的操作的参数类型等。例如,自行车Bicycle和打气筒Pump,自行车通过打气筒来充气。图1显示了Bicycle类和Pump类的依赖关系。

图1 Bicycle类和Pump类的依赖关系

在C语言中,将一个类作为另一个类中某个操作的函数的参数来实现两个类的依赖关系。实现代码如下所示:

2.4 泛化关系

泛化关系描述了一般事物与该事物中的特殊种类之间的关系,也就是父类与子类之间的关系。继承关系是泛化关系的反关系,也就是说子类是从父类中继承的,而父类则是子类的泛化。子类继承父类的属性和操作,除此之外通常子类还添加新的属性和操作,或者修改了父类的某些操作。例如,老虎是动物的一种,既有动物的共性,又有老虎的特性,如图2所示。

图2 Animal类与 Tiger类,Dog类的泛化关系

在C语言中,由于结构体在内存中的布局与结构体的声明顺序一致,所以可以利用结构体类型来实现,此时只需在子类中将某一属性值的类型定义为父类类型即可。实现代码如下所示:

2.5 关联关系

关联关系,表示类与类之间的连接。它使一个类的可见属性和方法被另一个类使用。例如公司和员工,一个公司对应一些特定的员工,一个员工对应一个特定的公司,如图3所示。

在C语言中,可以在一个类的结构中定义指向另一个类的指针变量,以此来表示两个类之间的关联关系,若关系重数大于1,可以用指针数组或链表来实现。实现代码如下所示:

在关联关系中,有两种比较特殊的关系:聚合和组合。

聚合关系是一种特殊的关联关系,表示类间的关系是整体与部分的关系,一个类描述了一个较大的事物,它是由较小的事物组成的,这种关系就是聚合关系。例如:雁群由若干只大雁组成,如图4所示。

聚合关系是整体与部分的关系,且部分可以离开整体而单独存在。如车和轮胎是整体和部分的关系,轮胎离开车仍然可以存在。因此部分对象的存在不依赖于整体对象,定义一个指向部分对象的指针变量即可。实现代码如下所示:

组合关系是另一种形式的聚合,整体有管理部分的特有职责并且它们有一致的生命期,例如,大雁和它的翅膀之间的关系,如果大雁不存在了,那么他的翅膀当然也就不存在了。如图5所示。

在组合关系中由于整体和部分具有一致的生命期,所以部分对象的生成是通过整体对象来实现的,因此只需在结构体中定义一个属性类型为部分类型的成员即可。这样在生成整体对象的同时,也生成了部分对象。实现代码如下所示:

聚合和组合的区别:聚合关系是“has-a”关系,组合关系是“contains-a”关系;聚合关系表示整体与部分的关系比较弱,而组合比较强;聚合关系中代表部分事物的对象与代表聚合事物的对象的生存期无关,一旦删除了聚合对象不一定就删除了代表部分事物的对象。组合中一旦删除了组合对象,同时也就删除了代表部分事物的对象。

3 实例

图6为一个对冰球比赛描述的UML类图,从图中可以看出,一支冰球队由一名中锋、一名守门员、两名边锋和两名后卫组成。中锋的任务是将冰球传递给边锋,边锋的射门技术通常比前锋更好。后卫力图阻止对方达到射门位置和射门。守门员是最后一道防线,阻挡对方的射门。每个队员都手持一个曲棍,用来在冰上运球,目标是用曲棍将球射入对方的球门。冰球比赛通常在一个室内的冰球场上进行。场地长200英尺,宽100英尺。一场冰球比赛要进行60分钟,这60分钟被分成三次20分钟的比赛。

图6 冰球比赛UML类图

图7 C语言模型图

根据转换规则,分别对类、属性、关联关系、依赖关系等经过一系列的直接映射、分解映射、组合映射等可以得到如图7所示的C语言模型图。

4 结束语

通过向MDA软件开发流程引入本体映射的方法,可以比较好的解决模型转换的问题,特别是为转换提供了语义保证,提高模型变换的准确率。但是本体的生成是一个比较繁琐的过程,如果在软件开发过程中完全依靠手工来生成本体,就失去了模型自动转换的意义了。因此今后的任务将集中在UML到本体转换的效率和精度方面,自动转换工具也是今后研究的重要内容。

[1]KLeppe A.解析MDA[M].鲍志云,译.北京:人民邮电出版社,2004.

[2]Czarnecki K,Helsen S.Classification of Model Transformation Approaches[C]//Processdings of the 2nd OOPSLA Workshop on Generative Techniques in the Context of the Model Driven Architecture.USA,2003.

[3]邓志鸿,唐世渭,张铭,等.Ontology研究综述[J].北京大学学报:自然科学版,2002,38(5):730-738.

[4]Gruber T R.A translation approach to portable Ontology specifications[J].Knowledge Acquisition,1993,5(2):34-43.

[5]Andreas Maier.Integration with ontologies[C].In:proceedings of WM 2003.Luzern,2003.

[6]Su X M.A text categorization perspective for ontology maping[R].Norway:Norwegian University of Science and Technology,2002:1-9.

[7]Ehrig M,Sure Y.Ontology mapping-an integrated approach[C]//Heraklion Greece:Proceedings of the European Semantic Web Symposium(ESWS),2004:76-91.

[8]侯金奎,王锋,张睿.基于本体语义的模型映射研究[J].计算机科学,2008,35(5):119-122.

[9]吴建,郑潮,汪杰.UML基础与Rose建模案例[M].北京:人民邮电出版社,2008.

(责任编辑:肖恩忠)

TP311

A

1671-4288(2010)06-0044-05

2010-10-12

崔玲玲(1979-),女,山东昌乐人,潍坊学院计算机与通信工程学院讲师,硕士。

猜你喜欢

C语言本体语义
基于Visual Studio Code的C语言程序设计实践教学探索
语言与语义
基于C语言的计算机软件编程
基于本体的机械产品工艺知识表示
高职高专院校C语言程序设计教学改革探索
“上”与“下”语义的不对称性及其认知阐释
《我应该感到自豪才对》的本体性教学内容及启示
论子函数在C语言数据格式输出中的应用
认知范畴模糊与语义模糊
专题