admin 管理员组文章数量: 887021
2024年1月17日发(作者:卵巢囊肿6cm不手术可以吗)
利用Java反射机制实现本体实例数据向JavaBean的转换
摘 要:本体实例数据常用的表现形式是三元组,这种格式使得本体在面向对象的程序中出现所谓“Triple –to-Object ”阻抗不匹配的情况。利用Java反射机制,提出了一种从本体实例数据向JavaBean的转换方法,从而使得在面向对象程序中可以方便地使用本体数据。
关键词:本体;RDF;反射;JavaBean 0 引言
本体原本是哲学上的概念,后来被引入计算机领域用于知识表式。在Tim-Berners Lee提出语义网的设想后,本体被广泛地应用于语义网的研究中。在语义网中,本体一般用于表达元数据的关系,表达语言有RDFS,OWL等,它们都已经被W3C组织编制成规范供参考使用。用这些本体语言所描述的实例,在本文称为“本体实例数据”。由于RDF数据模型同面向对象模型之间的差异,在面向对象程序中直接使用RDF数据存在一定的困难。本文基于这两种数据模型之间的差异,提出了在Java中利用反射机制来实现本体实例数据向JavaBean的转换。为方便讨论,本文中所提到的本体语义局限在RDFS层面上。
1 TRIPLE-TO-OBJECT阻抗不匹配
1.1 RDF数据模型
RDF数据模型是一种图数据模型,它由一系列三元组(Triple)构成,每一个三元组包括一个主词(subject),一个谓词(predicate)
和一个宾词(object)。用图形化方式表示 时,主词和宾词成为两个结点,而谓词则成为由主词指向宾词的弧, 所有的三元组用这样的方式图形化后就形成了RDF图。表示RDF数据有RDF/XML、N3等语法格式。表1就是一个使用N3格式的RDF数据例子。
Java反射机制提供Class,使得Java在运行时得到类的元数据信息,比如类有哪些属性,每个属性的属性名,数据类型等。在运行时如果得到这些元数据信息,就可以对类进行实例化,得到对象(Object)。
表1 使用N3表示的RDF数据例子
序号[]数据
01@prefix foaf:
02@prefix rdf: 1999/02/22-rdf-syntax-ns#>
03 :me a foaf:Person;
04 foaf:family_name “web”;
05 foaf:givenname “Semantic”;
06 foaf:title “Dr”;
07 foaf:knows :Reasoner, :Ontology, :Statement.
同时 Java反射机制还提供了Method类,这个类有下面几个重要的方法:
(1)getMethod(): 该方法有两个参数,第一个参数接受要调用类的方法名,第二个参数接受所调用方法的参数。
(2)invoke(): 通过反射机制调用类的方法。
比如,Person类有一个方法setName(String name)。现在有一个实例名为person,它的属性name取值为“web”。通过反射机制来调用,则写法是:
Method method =
hod(“setName”,new Class[]{});
(person, “web”);
这样写的效果是等同于:
e(“web”);
但通过反射机制来调用的好处是在可以在程序运行过程中动态的完成方法的调用,而不是预先在程序中写好。
1.2 Triple-to-Object转换算法
表2给出了Triple-to-Object转换算法的伪码描述。
表2 算法伪码描述
名称: RDF2Bean
输入: 一个实体的一系列三元组
输出: 该实体所对应的JavaBean
算法:
01初始化一个Map,用于存储来自于三元组的谓词和宾词
02while(三元组未遍历完){
03 取出一个三元组的谓词和宾词;
04 if(谓词关联到另一个主体){
初始化另一个Map, 存储宾词的值
}
05 将谓词和宾词以key-value的方式存入到Map中
06}
07实例化JavaBean,此时各个属性的值为空
08while(Map的key-value未遍历完){
09 取出一对key-value
10 使用Class调用JavaBean的setter方法,设置key所对应的属性的值
11}
这个算法由两个循环构成。第一个循环取出实体所包含的所有谓词及对应的宾词,其基本想法是将谓词转换成JavaBean的属性名,而宾词的值则是属性的值。第二个循环完成JavaBean各个属性值的填充。这利用前文提到的Java的反射机制完成。
2 示例
下面通过将表1中的数据转换成JavaBean来示例前文的算法。本示例使用了Jena来读取和解析RDF数据。
(1)创建Person类:这个Person类所定义的属性名如表3所示,跟表1中RDF数据的谓词名是一一对应的。
表3 Person类(部分)
序号[]属性
01public class Person {
02private String title;
03private String familyname;
04private String givenname;
05private String id;
06//省略getter和setter方法
07}
(2)使用Jena读取RDF数据:在Jena中提供了Model方法用于读取和解析RDF数据。然后使用StmtIterator取得包含某一实体的所有Triples. 在本示例中,这个实体的主词就是:me。 String defaultNameSpace =
"programming/example/people#";
InputStream inFoafInstance =
().open("ontology/); Model _friends =
OntologyModel(); _(inFoafInstance,defaultNameSpace); Resource r = _ource(defaultNameSpace + "me");StmtIterator si = operties();
(3)调用RDF2Bean算法:在本示例中表2中的RDF2Bean算法是封装在一个类中的,在通过该类直接调用即可。
Person p = new Person();
p = F2Bean(si); 本示例最后转换的结果是:表1中第3行是表示实体的类型的,这会被转化成对象名和对象所属的类类型。第4-7行是该实体的谓词和宾词,比如主词:me有谓词foaf:family_name,客词是“web”,这会被转换成对象p的属性familyname,其值就是 “web”。
3 结束语
本文针对RDF数据到Object数据的转换的阻抗不匹配,提出了一种利用Java反射机制的转换算法,并通过实例验证了该算法的可行性。目前,该算法的不足之处在于待转换的RDF数据的谓词要限定在JavaBean所定义的属性范围之内。这将留给以后的工作中来解决。
参考文献:
[1] 高志强,潘越,马力,等.语义Web原理及应用[M].北京:机械工业出版社,2009.
[2] J J CARROLL,I DICKINSON,C DOLLIN,et
:Implementing the semantic web recommendation[R].Technical
Report HPL-2003-146,HP Laboratories,2003.
[3] 宋炜,张铭.语义网简明教程[M].北京:高等教育出版社,2005.
Using Java Reflection Transforming Ontology Data to JavaBean
Mechanism
Abstract:Triples are used to describe ontology data. But there exists
Triple-to-Object impedance mismatch when triples are accessed in
Object-Oriented applications. This paper proposes a method based on
Java reflection technique to transform ontology data to JavaBean so that
ontology data can be conveniently employed in Object-Oriented
applications.
Key Words: Ontology; RDF; Java Reflection; JavaBean
版权声明:本文标题:利用Java反射机制实现本体实例数据向JavaBean的转换 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1705433141h484580.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论