八进制

少年壮志无烟抽

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  231 随笔 :: 0 文章 :: 2955 评论 :: 11 Trackbacks

接触Semantic Web的时间还不是很长,所以现在写的这方面内容算是笔记性质,很可能存在很多误解,欢迎指出或讨论:)

一般来说,我们在Protege这样的编辑器里构建了本体,就会想在应用程序里使用它,这就需要一些开发接口。用程序操作本体是很必要的,因为在很多情况下,我们要自动生成本体,靠人手通过Protege创建所有本体是不现实的。Jena是HP公司开发的这样一套API,似乎HP公司在本体这方面走得很靠前,其他大公司还在观望吗?

可以这样说,Jena对应用程序就像Protege对我们,我们使用Protege操作本体,应用程序则是使用Jena来做同样的工作,当然这些应用程序还是得由我们来编写。其实Protege本身也是在Jena的基础上开发的,你看如果Protege的console里报异常的话,多半会和Jena有关。最近出了一个Protege OWL API,相当于对Jena的包装,据说使用起来更方便,这个API就是Protege的OWL Plugin所使用的,相信作者经过OWL Plugin的开发以后,说这些话是有一定依据的。

题目是说用Jena处理OWL,其实Jena当然不只能处理OWL,就像Protege除了能处理OWL外还能处理RDF(S)一样。Jena最基本的使用是处理RDF(S),但毕竟OWL已经成为W3C的推荐标准,所以对它的支持也是大势所趋。

好了,现在来点实际的,怎样用Jena读我们用Protege创建的OWL本体呢,假设你有一个OWL本体文件(.owl),里面定义了动物类(http://www.zoo.com/ont/Animal,注意这并不是一个实际存在的URL,不要试图去访问它),并且它有一些实例,现在看如下代码:

OntModel m = ModelFactory.createOntologyModel();
File myFile = ...;
m.read(new FileInputStream(myFile), "");
ResIterator iter 
= m.listSubjectsWithProperty(RDF.type, m.getResource("http://www.zoo.com/ont/Animal"));
while (iter.hasNext()) {
    Resource animal 
= (Resource) iter.next();
    System.out.println(animal.getLocalName());
}

和操作RDF(S)不同,com.hp.hpl.jena.ontology.OntModel是专门处理本体(Ontology)的,它是com.hp.hpl.jena.rdf.model.Model的子接口,具有Model的全部功能,同时还有一些Model没有的功能,例如listClasses()、listObjectProperties(),因为只有在本体里才有“类”和“属性”的概念。

上面的代码很简单,从ModelFactory创建一个OntModel,从指定文件把模型读到内存里。再下面的代码是一个例子,作用是取出模型中所有Animal的实例(Individual,也叫个体),并打印它们的名称。要从OntModel里取实例,也可以用listIndividuals()方法,只不过你得在得到的实例中判断它们是不是Animal的实例,我觉得不如用上面这种简易查询的方式来得方便。

Jena里扩展了很多Iterator,比如ResIterator、StmtIterator和NodeIterator等等,刚开始用会觉得很别扭,好象还不如都用java标准的Iterator,不知道Jena的设计者是怎么考虑的。要熟练掌握还是得对整个Jena的API有全局掌握才好。

在循环里,我们得到的每个元素都是一个Resource,因为本体里的任何东西都是资源,不论你想得到Subject、Property还是Object,在Jena里实际得到的都是资源(Resource),在Jena里,Property是Resource的子接口,而Jena并没有Subject或Object接口。(注:在OWL本体中,Subject->Property->Object组成一个三元组,例如:张小刚->父亲->张大刚;或者:绵羊多利->rdf:type->动物,rdf:type是一个特殊的属性,表示前者是后者的实例)

暂时先写到这,关于在本体中引入其他本体和使用推理,下次继续。

posted on 2005-01-06 19:39 八进制 阅读(7388) 评论(51)  编辑 收藏 所属分类: Web服务/语义Web

评论

希望能多看到一些这样的好文章可以帮帮我们这些初学者。
  回复  引用    

#2楼 [楼主] 2005-05-18 14:37 八进制      
共同学习吧,想看到哪方面的内容欢迎留言或联系我。
  回复  引用  查看    

#3楼  2005-05-20 18:07 yujian [未注册用户]
用jena的API处理OWL本体进行推理,第一步是要把一个owl文件的读入,请问您是怎么实现的。
  回复  引用    

#4楼 [楼主] 2005-05-20 22:45 八进制      
用OntModel的read()方法。
  回复  引用  查看    

#5楼  2005-05-24 11:20 yujian [未注册用户]
谢谢指导
你对jena推理那一块熟不熟悉?
  回复  引用    

#6楼 [楼主] 2005-05-24 15:09 八进制      
简单用过Jena本身带的几个推理机,这些内容Jena的文档里说得还挺清楚的。
  回复  引用  查看    

#7楼  2005-06-14 14:56 lingersoft [未注册用户]
你觉得现在用Protege OWL PLugin 创建完本体库之后是用ProtegeOWLAPI读取方便,还是用Jena操作方便,那个更容易与其它OWL工程结合?
  回复  引用    

#8楼 [楼主] 2005-06-14 17:08 八进制      
我还没有用过OWL API,所以不好比较。感觉而言,OWL Plugin提供生成OWL API所需代码的功能,而且OWL API是针对OWL的,比起Jena来说应该更方便。
  回复  引用  查看    

#9楼  2005-06-14 21:39 lingersoft [未注册用户]
那如果要用Jena来处理OWL本体,是否要自己开发本体编辑工具,有些时候还是需要提供人机界面来供用户来构造本体的,有没有基于Jena的本体编辑器,单纯利用Jena和Java写出来的本体编辑器。
  回复  引用    

#10楼 [楼主] 2005-06-15 10:53 八进制      
这要看你开发的应用的用途。让用户通过gui来改变本体不一定必须是像protege owl plugin那样的本体构造器界面啊,比如用户要建立一个新用户(对应本体里的一个individual),你就提供一个表单让用户输入信息,提交后在你的程序里把它转换一下即可。
  回复  引用  查看    

明白,我感觉在我要做的系统中,class更可能需要用户自己定义,而individual是大量的数据,应该需要程序来生成,目前老板突然要我改题作OWL,一时有点措手不及了,多谢指点了!
  回复  引用    

#12楼 [楼主] 2005-06-17 14:15 八进制      
应该有独立的本体编辑器,可能不如protege那样完善。IBM的Orient可以输出rdf格式的文件,你可以下载一个看看,注意eclipse的版本要3.0(3.1不行),EMF版本要2.0。
  回复  引用  查看    

“本体中引入其他本体和使用推理”怎么还没开始写呢?着急的等着拜读呢

  回复  引用    

#14楼 [楼主] 2005-08-23 21:56 八进制      
不好意思,最近没有把精力放在本体这方面,开学以后如果时间比较多可能会继续写下去。谢谢关注,也可以通过邮件和我联系。
  回复  引用  查看    

Web服务中引入OWL本体有什么用处?
  回复  引用    

#16楼 [楼主] 2005-08-29 14:04 八进制      
使用owl描述web服务,owl-s
  回复  引用  查看    

#17楼  2005-10-09 19:56 xanthe [未注册用户]
我的论文要做基于文本的本体的半自动构建,不知本体表示用owl是否合适?同时我也要做一个本体构建的程序,用java和jena来建立owl文件应该可行吧?应为我还没有这方面的工作,没什么经验,希望八进制能给提点意见
  回复  引用    

#18楼 [楼主] 2005-10-09 23:28 八进制      
owl-dl的表达能力足够一般的本体应用,实在不行还可以用owl-full,如果rdf不能满足需要就可以用owl。jena是可以的,但似乎owl-api发展得很不错,虽然我还没有实际用过。
  回复  引用  查看    

这几个月来,心情一直很郁闷。就是因为课题的事,说实话,我现在对我的课题还是稀里糊涂,没有真正的理解。但是现在已经是我研究生的第三个年头了,我没有时间和精力也没有心情来做好这个任务。就是抱着一个能毕业的心态吧,反正毕业以后不想做这个方面。这几日看着同学们忙着年底毕业,而自己看来是今年毕业无望,心里面不是个滋味,真后悔,为什么当时选了这个导师呢,他不懂这个课题,平时一点也不指导我,现在到好,辞职到实德信息部当经理去了。而我,专业是机械,对信息确实缺少这方面的头脑。
看兄弟做这个方面挺厉害,真是佩服你,想请教你点问题,给我指引指引。以后若有机会,必当面重谢。
说说我做的课题吧。导师给我订的是基于本体论的机械加工工艺知识管理研究,说白了,我研究对机械加工工艺知识的智能检索,这个是用本体的思想。
在过去的一年里,不堪回首,只用protege建立了个机械加工工艺知识本体模型(其实7月份就建立好了,但是到现在还是没有下一步的举措)。看了网络上的同行,设想是用jena对所建立的本体进行解析,但是怎么解析,自己真是无能为力。我就想着把owl的数据进行解析后导入到数据库中,我看是说jena支持mySQL,那我初步想用它来存储解析后的数据,不知道这样行不行?之后,我想用jbuilder 或者eclipse来进行界面设计(建议以下,哪个更好一些?)
你看看,我这样做,走的通不?12月份能不能做完?
其实,我现在的数据量要求不太大,就是想把这条道走通。
兄弟一定要帮我啊!! email:mafu2020@yahoo.com.cn
  回复  引用    

#20楼 [楼主] 2005-10-10 22:35 八进制      
确实,现在不少项目都往本体上靠,但没有真正利用到本体的优势。很巧,今天面试时也被问到这个问题“你认为本体的优点和缺点是什么”,我的研究方向并不是这个,只是处于兴趣时常看看,所以我的回答只能是从我平时有限的一些应用来总结。本体的优点是可以推理,但要应用得当才能利用推理机帮助我们,此外本体的融合很简单;缺点一是性能,相比发展了多年的关系数据库还稍微有些差距,另一方面是理论上的,本体的描述能力虽然很强,但还不能描述任何事情,因为面临可计算性的难题。
说了这么多,其实我也没弄明白本体究竟在什么样的应用里作用最大,似乎目前使用本体完成的项目都可以用其他方式完成。有些应用把本体作为方便搜索用的知识库,我认为还不是最好的方式,但具体的我又说不出。
就你说的情况,我认为数据库只是本体的一种保存方式,你可以不用关心把本体保存到数据库还是xml格式,毕竟你的数据不多,性能方面不会成问题。jbuilder和eclipse之间,如果是我当然选eclipse,如果你对jbuilder比较熟悉时间又紧张,用什么关系也不大。
  回复  引用  查看    

jbuilder和eclipse这两种软件我接触不久,就是刚开始学。但是jbuilder的技术应该是比eclipse成熟一些,看了看,比较之后发现各有优点。虽然eclipse开始不久,潜力巨大,而且能支持mySQL数据库,而这个正好是jena能够支持的数据库。这是问题之一。
我现在就是想做个简单的检索界面,用它们之一开发。斑竹大哥你所说“你可以不用关心把本体保存到数据库还是xml格式”,但是一个系统怎么着也得有个后台数据库来支持啊。还是给个好的建议?我的想法是,输入一个检索词,然后用到本体推理,对其进行语义扩展,之后检索出与之相关的词,然后再从数据库中调出相关的资料。
比如,我输入一个车床,那么经过语义推理以后,我可以利用元数据得到诸如“立式车床”、转塔式车床、等车床的子类。这个过程怎样实现?
  回复  引用    

#22楼 [楼主] 2005-10-11 13:20 八进制      
谁说一个系统必须有数据库支持,把本体当成数据库来用的也很多。
你说的这个功能,建立一个本体后,用户输入检索词,系统先对本体进行推理,然后把检索得到的类和所有子类都输入给用户就可以了。
  回复  引用  查看    

哦,没有数据库也可以?哦,网上有好多说是做这个方面需要看jena,但是我粗略的看了看,内容太多了,看的我头脑都发蒙。你看看,我实现这个功能,看哪些就够了?
兄弟,要不,你给我个建议,看看怎么实现我的系统!!
  回复  引用    

#24楼 [楼主] 2005-10-11 15:12 八进制      
Jena的文档做的不错,有本体入门的部分也有使用Jena的例子,建议你仔细看一下。只要专下心来,没有什么难的。
  回复  引用  查看    

是啊,兄弟说得对。应该好好看看。你是不是也在做这个方向?多向你请教。那你能不能接着原来的往下写写?好给我些启发!!
  回复  引用    

#26楼  2005-10-19 17:56 qinfenyu [未注册用户]
请问我我应该在java中如何导入jena api,应为我导入后便一个简单的程序出现了Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/xer
l/XMLChar (wrong name: com/sun/org/apache/xerces/internal/util/XMLChar)
at java.lang.ClassLoader.defineClass1(Native Method)
我是编程的,能告诉我怎么做吗?同时,能给我你的联系方式吗?
  回复  引用    

#27楼  2005-10-19 20:03 qinfenyu [未注册用户]
请问我能以别的方式联系你吗?我的联系方式是qinfenyu@163.com.我是菜鸟,向你好好学习。
  回复  引用    

#28楼  2005-12-22 20:17 jeff won [未注册用户]
请问LZ:OWL-S是属于OWL-Lite,OWL-DL,还是OWL-FULL?
没有看到相关的说明
  回复  引用    

#29楼  2006-03-21 17:50 qsz [未注册用户]
这位仁兄太好了,给我们这些初学者一些阳光!!谢谢阿我还有一个问题
我用protege建了一个简单的本体,想去实现查询用sparql结果报错,能问一下,sparql能查那种用protege owl插件建立的本体马,qq:290133922
  回复  引用    

#30楼  2006-05-15 11:06 vivianjld [未注册用户]
@八进制
谢谢,看了你的文章受益非浅,你讲的很实际很有用. 我的毕业论文也是写这方面的,我主要使用本体来解决语义失配的问题.看了很多这方面的文章,理了个大概的思路,但是具体的还不是很清楚.目前还在构建本体中,不知道你有没有用PROTEGE 来构建本体的例子啊,希望能跟您多交流.我的邮箱:vivianjld@yahoo.com.cn
  回复  引用    

#31楼 [楼主] 2006-05-21 17:35 八进制      
qinfenyu: 我的邮箱bjzhanghao(AT)21cn.com
jeff: 这个帖子说owl-s属于owl-dl,不知是否正确:http://bbs.w3china.org/dispbbs.asp?boardID=10&ID=18231
qsz: 抱歉不太了解sparql。
vivianjld: 以前是用protege构造过一些本体,比较简单也没有严格验证过。用protege构造本体不难,我认为关键一是如何自动构建,二是如何正确的利用推理功能。
  回复  引用  查看    

#32楼  2006-08-19 22:17 紫鳯 [未注册用户]
八进制,你好,这段时间忙着开题,看了很多关于本体的资料,似懂非懂的,要怎么才能真正开始了解本体呢?是不是要先做例子?方便跟我联系吗?希望得到你的帮助:blue_sky0915@163.com
  回复  引用    

#33楼  2006-09-22 19:51 特警 [未注册用户]
@whitemartin
请问你的问题解决了没?

  回复  引用    

#34楼  2006-11-12 16:36 gwj [未注册用户]
@八进制
请教一下,我想对owl文件进行搜索,象sql一样的select语句,看了jean例子里给的rdf的可以实现,但我写的owl的总是有问题,说是语法不正确,您有没有这方面的经验,可否赐教?
这个是我写的:String queryString = " SELECT ?x " +"WHERE { ?x <http://www.w3.org/2002/07/owl#SubClass> "\C1\" }";
 
  回复  引用    

#35楼  2007-03-25 10:38 小艾 [未注册用户]
看了斑竹的文章很受启发,我的毕业论文也是关于本体的,在一个小规模的本体哭库上实现智能检索,不太了解jena,很多东西都还不太清楚,我的联系方式是sunxiaojing517@126.com,咱们能通过其他方式联系吗,先谢谢大虾了!!!
  回复  引用    

#36楼  2007-04-23 09:52 露露 [未注册用户]
我是一个关于本体方面的初学者,我想做语义Web环境下基于ontology的语义检索应用研究的课题,哪位高手可以对这个课题给我初步的讲解一下,谢谢!
  回复  引用    

我目前也在用OWL做推导。Jena和Racer,目前打算用Jena。
  回复  引用    

#38楼  2007-08-28 16:47 追梦人 [未注册用户]
现在在protege里面用classify taxonomy
就会报找不到推理机错误 :DIG Reasoner Error :Connection refused .connect
就是找不到racer,好多人说把racer打开就行,但是我打开了,也报错.
我不知道是不是因为没设racer的profile文件的原因,他的TCP/IP Adress和Port怎么设,但是我不会设,你会吗?
  回复  引用    

#39楼  2007-08-30 21:09 红薯 [未注册用户]
太好了,看了你的文章了解了好多东西,我也是本体方面的初学者,马上就面临开题,但是还是一片迷茫中,我的联系方式是kong-dr@163.com
希望能给点指点!

  回复  引用    

#40楼  2007-08-31 11:02 longlong [未注册用户]
各位大哥,我现在马上就要答辩了,我做的题目是基于本体的知识集成研究,现在系统都没有做出来,老师已经告诉我了,如果做不出来就要有毕业了,希望得到大哥们的支持,我这里有很多同学研究本体的,如果有那位大哥需要我的帮助可以和我联系,希望能得到大哥们的帮助谢谢,我的邮箱:liyao1120@126.com,能得到系统会重谢!
  回复  引用    

#41楼  2008-03-12 01:12 王风雷 [未注册用户]
请问版主,你上面的那个小例子,里面的File myFile = ...; 其中省略号的部分应该具体怎么写?比如我的.owl文件在E:\protege\test.owl;我的联系方式是koolfenglei@163.com ,期待大侠的帮助,谢谢了!!!
  回复  引用    

刚刚接触到本体,也是因为课题分到这方面了。
之前对本体在搜索方面的应用根本不清楚,老板对这方面也不太明白。但看了楼主的帖子,才茅塞顿开。啰嗦了这么久,还是说说我的课题吧。
我的课题是基于RDF的话题网络的设计与实现,简单说就是自己定一个话题,围绕它做一个可以人工进行修改和添加、也可以通过网上资源的进行修改和添加的知识库,并且最后要把关系图用界面表现出来。这几方面都是新接触的东西,很难上手。现在都不知道从何开始,希望楼和大侠们之能给以帮助和指点,定当重谢!
邮箱:yangbo_simon@sina.com
  回复  引用    

#43楼 [楼主] 2008-03-30 17:00 八进制      
to 王风雷:如File myFile = new File("e:\\protege\\test.owl");
  回复  引用  查看    

#44楼  2008-05-15 04:49 soff [未注册用户]
LZ你好,请问你有没有相关范例关于用JENA创建一个RDF并且往里面填充数据的范例或者代码呢?谢谢1!
  回复  引用    

#45楼 [楼主] 2008-05-20 14:04 八进制      
jena的文档里应该有吧
  回复  引用  查看    

#46楼  2008-06-05 09:49 yangjing [未注册用户]
请问楼主,我也很想知道41楼的答案,我是初学者,对编程也是刚开始学,以后会一直关注你的博客,跟你学习,
  回复  引用    

#47楼 [楼主] 2008-06-12 20:54 八进制      
@yangjing
41楼答案已经在43楼给出。
  回复  引用  查看    

#48楼  2008-07-07 13:14 姜彩红 [未注册用户]
八进制,你好!
看了你的上面的代码,我只能将实例全部列举出来,但是实例不是按照类来列举的。请问,你能给我指点一下么,如何编写代码来实现这个?


  回复  引用    

#49楼 [楼主] 2008-07-11 23:18 八进制      
@姜彩红
能从每个实例得到其属于的类吗,如果可以自己写一段代码就能实现了。隔的时间久了,我也不知道jena有没有直接按类列举实例的方法了。
  回复  引用  查看    

#50楼  2008-07-15 03:10 diyaZhang [未注册用户]
请问楼主, 38楼的解决方法?
  回复  引用    

#51楼  2008-07-16 00:12 diyaZhang [未注册用户]
回复50楼,我试过了,出错的应该是在VISTA下,在WINDOWS下就没有这种错误了。
  回复  引用