Jena 简介
一般来说,我们在 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(),因为只有在本体里才有“类”和“属性”的概念。