JenaontologyAPI教程.docx
《JenaontologyAPI教程.docx》由会员分享,可在线阅读,更多相关《JenaontologyAPI教程.docx(32页珍藏版)》请在冰豆网上搜索。
JenaontologyAPI教程
Jena简介
一样来讲,咱们在Protege如此的编辑器里构建了本体,就会想在应用程序里利用它,这就需要一些开发接口。
用程序操作本体是很必要的,因为在很多情形下,咱们要自动生本钱体,靠人手通过Protege创建所有本体是不现实的。
Jena是HP公司开发的如此一套API,似乎HP公司在本体这方面走得很靠前,其他大公司还在观望吗?
能够如此说,Jena对应用程序就像Protege对咱们,咱们利用Protege操作本体,应用程序那么是利用Jena来做一样的工作,固然这些应用程序仍是得由咱们来编写。
其实Protege本身也是在Jena的基础上开发的,你看若是Protege的console里报异样的话,多半会和Jena有关。
最近出了一个ProtegeOWLAPI,相当于对Jena的包装,听说利用起来更方便,那个API确实是Protege的OWLPlugin所利用的,相信作者通过OWLPlugin的开发以后,说这些话是有必然依据的。
题目是说用Jena处置OWL,其实Jena固然不只能处置OWL,就像Protege除能处置OWL外还能处置RDF(S)一样。
Jena最大体的利用是处置RDF(S),但毕竟OWL已经成为W3C的推荐标准,因此对它的支持也是大势所趋。
好了,此刻来点实际的,如何用Jena读咱们用Protege创建的OWL本体呢,假设你有一个OWL本体文件(.owl),里面概念了动物类(,注意这并非是一个实际存在的URL,不要试图去访问它),而且它有一些实例,此刻看如下代码:
OntModel m = ();
FilemyFile=...;
(new FileInputStream(myFile), "");
ResIterator iter = , (""));
while ()) {
Resource animal = (Resource) ();
}
和操作RDF(S)不同,是专门处置本体(Ontology)的,它是的子接口,具有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是一个特殊的属性,表示前者是后者的实例)
临时先写到这,关于在本体中引入其他本体和利用推理,下次继续。
本文简单介绍Jena(Jena),利用Protégé(不是最新版本)创建一个简单的生物(Creature)本体,然后参照Jena文档中的一个例子对本体进行简单的处置,输出本体中的Class、Property等信息。
本文内容安排如下:
Ø 介绍Jena
Ø 运行Jena
Ø JenaOntologyAPI
Ø 例子
Ø 参考资料
一、介绍Jena
Jena由HPLabs()开发的Java开发工具包,用于SemanticWeb(语义网)中的应用程序开发;Jana是开源的,在下载的文档中有Jena的完整代码。
Jena框架要紧包括:
a) 以RDF/XML、三元组形式读写RDF
资源描述框架是(RDF)是描述资源的一项标准(在技术上是W3C的推荐标准),Jena文档中有一部份呢详细介绍了RDF和JenaRDFAPI,其内容包括对JenaRDF包的介绍、RDF模型的创建、读写、查询等操作,和RDF容器等的讨论。
b) RDFS,OWL,DAML+OIL等本体的操作
Jena框架包括一个本体子系统(OntologySubsystem),它提供的API许诺处置基于RDF的本体数据,也确实是说,它支持OWL,DAML+OIL和RDFS。
本体API与推理子系统结合能够从特定本体中提取信息,Jena2还提供文档治理器(OntDocumentManager)以支持对导入本体的文档治理。
c) 利用数据库保留数据
Jena2许诺将数据存储到硬盘中,或是OWL文件,或是关系数据库中。
本文处置的本体确实是OWL文件读入的。
d) 查询模型
Jena2提供了ARQ查询引擎,它实现SPARQL查询语言和RDQL,从而支持对模型的查询。
另外,查询引擎与关系数据库相关联,这使得查询存储在关系数据库中的本体时能够达到更高的效率。
e) 基于规那么的推理
Jena2支持基于规那么的简单推理,其推理机制支持将推理器(inferencereasoners)导入Jena,创建模型时将推理器与模型关联以实现推理。
Protégé是一个开源的本体编辑器(目前的版本是Protégé),用户能够在GUI环境下创建本体或知识库。
有一种说法是:
Jena对应用程序就像Protégé对咱们——咱们利用Protégé操作本体,应用程序那么是利用Jena来做一样的工作。
固然这些应用程序仍是得由咱们来编写。
二、运行Jena
能够在Jena的主页()下载Jena的最新版本,目前是版本。
Jena是JavaAPI,因此需要Java运行环境。
本文利用的是jdk1.5.0_04和。
将下载的解压到任意途径,解压以后生成文件夹,将lib下的jar文件全数加入CLASSPATH,如此就能够够在任意的Java编辑器中挪用JenaAPI了。
在解压目录下有一个文件,用于配置的测试。
在操纵台运行此程序,若是你的配置正确,测试将顺利完成。
G:
\jade\lib\;G:
\jade\lib\;G:
\jade\lib\commons-codec\2.7.5若是利用Eclipse,那么能够通过修改工程的Java创建途径的方式导入Jenajar文件。
在Eclipse下创建Java工程,右健单击工程名字,选择“属性/Properties”,在打开的对话框当选择“Java创建途径/JavaBuildPath”,在右边标签当选择“库/Libraries”,以后选择“添加外部文件/AddExtenalJARs”,找到lib目录下的所有jar文件并将其添加到工程。
如此就能够够运行Jean文档中的例子了。
三、JenaOntologyAPI
的OntologyAPI包括在ontology包()中,能够在目录srccomhphpljenaontology下查看所有程序的代码,Jena本体部份的说明网页是docontology,本部份内容和程序的编写要紧参考这两个文档。
在语义网上有很多表示本体信息的本体语言,其中表达能力最强的是OWL,OWL按复杂程度分为OWLFull、OWLDL和OWLLite三个版本。
其他的本体语言还有RDFS、DAML+OIL。
JenaOntologyAPI为语义网应用程序开发者提供了一组独立于具体语言的一致编程接口。
Jena提供的接口本质上都是Java程序,也确实是.java文件通过javac以后生成的.class文件。
显然,class文件并非能提示本体创建利用的语言。
为了区别于其他的表示方式,每种本体语言都有一个自己的框架(profile),它列出了这种语言利用的类(概念)和属性的构建方式和URI。
因此,在DAML框架里,对象属性()的URI是daml:
ObjectProperty,而在OWL框架里却是owl:
ObjectProperty。
RDFS并无概念对象属性,因此在RDFS框架里,对象属性的URI是null。
在Jena中,这种框架通过参数的设置在创建时与本体模型(OntologyModel)绑定在一路。
本体模型继承自Jena中的Model类。
Model许诺访问RDF数据集合中的陈述(Statements),OntModel对此进行了扩展,以便支持本体中的各类数据对象:
类(classes)、属性(properties)、实例(个体individuals)。
本部份简单介绍要用到的几个java类或接口。
1.本体模型OntModel
本体模型(OntModel)是对JenaRDF模型的扩展(继承自RDF模型),提供了处置本体数据的功能。
利用Jena处置本体第一确实是要成立一个本体模型,以后就能够够通过本体模型中所概念的方式操作模型,比如导入子模型()、获取模型中本体的信息、操作本体属性和将本体的表示输出到磁盘文件等等。
Jena通过model包中的ModelFactory创建本体模型,ModelFactory是Jena提供用来创建各类模型的类,在类中概念了具体实现模型的成员数据和创建模型的二十多种方式。
一个最简单的创建本体模型的语句如下:
OntModelontModel=();
该语句不含参数,应用默许设置创建一个本体模型ontModel,也确实是说:
它利用OWL语言、基于内存,支持RDFS推理。
能够通过创建时应用模型类别(OntModelSpec)参数创建不同的模型,以实现不同语言不同类型不同推理层次的本体操作。
例如,下面的语句创建了一个利用DAML语言内存本体模型。
直观地讲,内存模型确实是只在程序运行时存在的模型,它没有将数据写回磁盘文件或数据库表。
OntModelontModel=();
更多类型设置能够参照OntModelSpec类中的数据成员的说明。
咱们所利用的本体是从OWL文件取得的,也确实是说,是从磁盘读取的。
读取的方式是挪用JenaOntoModel提供的Read方式。
例如
("file:
D:
/temp/Creatrue/");
确实是读取位于D盘相应目录下的文件以成立本体模型。
Read方式也有很多重载,上面挪用的方式以文件的绝对途径作为参数。
其他的方式声明如下
read(Stringurl);
read(Readerreader,Stringbase);
read(InputStreamreader,Stringbase);
read(Stringurl,Stringlang);
read(Readerreader,Stringbase,StringLang);
read(InputStreamreader,Stringbase,StringLang);
2.文档治理器Documentmanager
本体文档治理器(OntDocumentManager)是用来帮忙治理本体文档的类,它包括了导入本体文档创建本体模型、帮忙缓存下载网络上的本体等功能。
每一个本体模型都有一个相关联的文档治理器。
在创建本体模型时,能够创建独立的文档治理器并作为参数传递给模型工厂(ModelFactory)。
文档治理器有超级多的配置选项,大体能够知足应用的需求。
第一,每一个文档治理器的参数都能够通过Java代码来设置(注:
OntDocumentManager有五种重载的构造函数)。
另外,文档治理器也能够在创建的时候从一个RDF格式的策略文件读取相应设定值。
下面的例子创建一个文档治理器并将它与以创建的本体模型关联。
OntModelm=();
OntDocumentManagerdm=();
(续)——见“对Jena的简单明白得和一个例子_2”
RDF愈来愈被以为是表示和处置半结构化数据的一种极好选择。
本文中,Web开发人员PhilipMcCarthy向您展现了如何利用JenaSemanticWebToolkit,以便在Java应用程序中利用RDF数据模型。
“资源描述框架(ResourceDescriptionFramework,RDF)”最近成为W3C推荐标准,与XML和SOAP等Web标准并排。
RDF能够应用于处置特殊输入数据(如CRM)的领域,已经普遍用于社会网络和自助出版软件(如LiveJournal和TypePad)。
Java程序员将愈来愈多地得益于具有利用RDF模型的技术。
在本文中,我将带您体验惠普实验室的开放源代码JenaSemanticWebFramework(请参阅)的一些功能。
您将了解如何创建和填充RDF模型,如何将它们持久存储到数据库中,和如何利用RDQL查询语言以程序方式查询这些模型。
最后,我将说明如何利用Jena的推理能力从本体推断模型知识。
本文假设您已经就图形、三元组和模式等概念方面对RDF比较熟悉,并对Java编程有大体的了解。
创建简单的RDF模型
咱们从大体操作开始:
从头创建模型并向其添加RDF语句。
本节,我将说明如何创建描述一组虚构家庭成员之间关系的模型,如图1中所示:
图1.虚拟家庭树
将利用来自“关系”辞汇表(请参阅)的属性siblingOf、spouseOf、parentOf和childOf来描述不同的关系类型。
为简单起见,家庭成员用来自虚构名称空间的URI()进行标识。
辞汇表URI通常以Jena代码形式利用,因此将它们声明为Java常量会超级有效,减少了错误输入。
Schemagen
当您通过Jena的API来使用模型时,为模型词汇表中的每个属性定义常量非常有用。
如果有词汇表的RDF、DAML或OWL表示,Jena的Schemagen工具可以自动生成这些常量,使您的工作更加容易。
Schemagen在命令行中运行,使用的参数包括模式或本体文件的位置、要输出的类的名称和Java包。
然后可以导出生成的Java类,其Property常量用于访问模型。
还可以使用Ant将Schemagen作为构建处理的一部分来运行,保持Java常量类与正在变化的词汇表保持同步。
Jena的ModelFactory类是创建不同类型模型的首选方式。
在这种情形下,您想要空的、内存模型,因此要挪用的方式是()。
这种方式返回Model实例,您将利用它创建表示家庭中每一个成员的Resource。
创建了资源后,能够编写关于这些资源的语句并添加到模型中。
在Jena中,语句的主题永久是Resource,谓词由Property表示,对象是另一个Resource或常量值。
常量在Jena中通过Literal类型表示。
所有这些类型共享公共接口RDFNode。
将需要四个不同的Property实例表示家庭树中的关系。
这些实例利用()创建。
将语句添加到模型中的最简单方式是通过挪用()。
此方式以Resource作为主题在模型中创建语句。
该方式利用两个参数,表示语句谓词的Property和语句的对象。
addProperty()方式被过载:
一个过载利用RDFNode作为对象,因此能够利用Resource或Literal。
还有有利过载,它们利用由Java原语或String表示的常量。
在例如中,语句的对象是表示其他家庭成员的Resource。
通过利用三元组的主题、谓词和对象挪用(),还能够直接在模型上创建语句。
注意以此种方式创建Statement不将其添加到模型中。
若是想将其添加到模型中,请利用创建的Statement挪用(),如清单1所示:
清单1.创建模型来表示虚构的家庭
.
Statementstatement=(adam,parentOf,fran);
查询家庭模型
利用选择器查询模型
WordNet-hyponyms是第三个模型。
它定义模型中概念的层次结构。
概念“dog”是概念“canine”下位词,而“canine”本身是概念“carnivore”的下位词。
为了说明如何导入和持久化模型,我将WordNet数据库的RDF表示导入到MySQL中。
因为我利用的WordNet表示采纳多个单独RDF文档的形式,将这些文档导入到一个Jena模型中会归并它们的语句。
图2说明了Nouns和Glossary模型归并后WordNet模型的片段的结构:
图2.归并的WordNetnouns和glossary模型的结构
创建数据库后台模型的第一步是说明MySQL驱动类,并创建DBConnection实例。
DBConnection构造函数利用用户的ID和密码登录到数据库。
它还利用包括Jena利用的MySQL数据库名称的数据库URL参数,格式为"jdbc:
"。
Jena能够在一个数据库内创建多个模型。
DBConnection的最后一个参数是数据库类型,关于MySQL,该参数为"MySQL"。
然后DBConnection实例能够与Jena的ModelFactory一路利用来创建数据库后台模型。
创建了模型后,能够从文件系统中读入WordNetRDF文档。
不同的()方式能够从Reader、InputStream或URL填充模型。
能够通过Notation3、N-Triples或默许情形下通过RDF/XML语法解析模型。
WordNet作为RDF/XML进行序列化,因此不需要指定语法。
读取模型时,能够提供基准URI。
基准URI用于将模型中的任何相对URI转换成绝对URI。
因为WordNet文档不包括任何相对URI,因此此参数能够指定为null。
清单4显示了将WordNetRDF/XML文件导入到MySQL持久化模型的完整进程:
清单4.导入和持久化WordNet模型
Settingthesecondparameterto"true"causesan
();
.
InputStreamin=().getClassLoader().getResourceAsStream(filename);
(in,null);
commit();
由于已经填充了wordnet模型,以后能够通过挪用("wordnet",true);来访问该模型。
仅利用Jena的API查询像WordNet如此庞大的模型将有必然的限制性,因为要执行的每类查询都将需要专门编写多行的代码。
幸运的是,Jena以RDQL形式提供了一种表达通用查询的机制。
RDF数据查询语言(RDQL)
RDQL是RDF的查询语言。
尽管RDQL还不是正是的标准,但已由RDF框架普遍执行。
RDQL许诺简明地表达复杂的查询,查询引擎执行访问数据模型的繁重工作。
RDQL的语法表面上类似SQL的语法,它的一些概念对已经利用过关系数据库查询的人来讲将比较熟悉。
在JenaWeb站点中能够找到极好的RDQL指南,但几个简单的例如会对说明基础知识大有帮忙。
利用工具能够在命令行上对Jena模型执行RDQL查询。
RDFQuery从文本文件中获取RDQL查询,然后对指定的模型运行该查询。
对数据库后台模型运行查询需要相当多的参数。
清单5中显示了运行以下例如需要的完整命令行:
清单5.从命令行运行RDQL查询
$java--datajdbc:
--userdbuser--passworddbpass
--driver--dbTypeMySQL--dbNamewordnet--query
正如您看到的,这些参数中的大多数参数都提供了创建与MySQL的连接所需的详细信息。
其中重要的部份是--query,它是RDQL文件的位置。
还要注意运行需要Jena的lib目录中的所有JAR文件。
清单6显示了您将检查的第一个查询:
清单6.查找“domesticdog”的WordNet辞汇条款的RDQL查询
SELECT
?
definition
WHERE
(?
concept,wordForm>,"domesticdog"),
(?
concept,glossaryEntry>,?
definition)
USING
wnFOR<
SELECT部份声明查询要输出的变量—在本例中,是名为definition的变量。
WHERE子句引入第二个变量concept并概念与图形匹配的三元组。
查询在具有WHERE子句中的所有三元组的图形中查找语句。
因此,在英语中,WHERE子句的意思为“查找具有'domesticdog'作为单词形式的概念,并查找这些概念的辞汇条款”,如图3所示。
USING子句提供一种便利,用于声明名称空间的前缀。
图3.清单6中的WHERE子句匹配的图形
运行查询的结果为:
definition
===============================================================================
"amemberofthegenusCanis(probablydescendedfromthecommonwolf)thathas
beendomesticatedbymansinceprehistorictimes;occursinmanybreeds;"the
dogbarkedallnight""
因此这种情形仅有一个结果。
清单7中显示的下个查询的意思为“查找单词'bear'表示的概念,并查找这些概念的辞汇条款”。
清单7.查找“bear”的WordNet辞汇条款的RDQL查询
SELECT
?
definition
WHERE
(?
concept,wordForm>,"bear"),
(?
concept,glossaryEntry>,?
definition)