这里使用的本体库是用protege4.0.2进行构建的,其建造本体的大致方法一般网上均有建议看PIZZA的列子来进行学习,这里重点实现中文本体的调用。
首先打开Protege4.0.2软件打开本体库:如下图
截取本体信息:1:文件的路径file:E:/分词专用软件/test/math.owl
2:屏幕最上方的本体编号:http://www.semanticweb.org/ontologies/2012/1/Ontology1329894930328.owl#math(这里要加上math)
然后打开Eclipse 创建一个工程,在创建一个文件(名字任意)代码如下
import java.io.*;
import java.sql.SQLException;
import java.util.Iterator;
import com.hp.hpl.jena.db.*;
import com.hp.hpl.jena.rdf.model.*;
import com.hp.hpl.jena.ontology.*;
import com.hp.hpl.jena.util.iterator.*;
public class test2 {
public static void main(String[] args) {
OntModel ontModel=ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);// 创建本体模型
//ontModel.read("file:E:/分词专用软件/ontology/DStructure.owl"); //读取当前路径下的文件,加载模型
//ontModel.read("file:E:/分词专用软件/test/Pizza.owl"); //读取当前路径下的文件,加载模型
//ontModel.read("file:E:/分词专用软件/test/math.owl"); //读取当前路径下的文件,加载模型
ontModel.read("file:E:/分词专用软件/test/DM.owl"); //读取当前路径下的文件,加载模型
OntClass cls=ontModel.createClass(":dataStructureClass");//定义一个类作为模型中数据结构类的等价类,并添加注释
cls.addComment("the EquivalentClass of DataStructure...", "EN");
//OntClass oc=ontModel.getOntClass("http://www.semanticweb.org/ontologies/2012/1/Ontology1330067689075.owl#Pizza");
//OntClass oc=ontModel.getOntClass("http://www.semanticweb.org/ontologies/2012/1/Ontology1329894930328.owl#math");
//OntClass oc=ontModel.getOntClass("http://www.DStructure.com/ontologies/DStructure.owl#数据结构");
OntClass oc=ontModel.getOntClass("http://www.semanticweb.org/ontologies/2010/3/Ontology1272336320453.owl#DM");
//oc.addEquivalentClass(cls);//将先前定义的类添加为数据结构的等价类
//迭代显示模型中的类,在迭代过程中完成各种操作
for (Iterator i=ontModel.listClasses(); i.hasNext();){
OntClass c=(OntClass)i.next(); //返回类型强制转换
if(!c.isAnon()){//如果不是匿名类,则打印类的名字
System.out.print("Class");
//获取类的URI并输出,在输出时对URI做了简化(将命名空间前缀省略)
System.out.println(c.getModel().getGraph().getPrefixMapping().shortForm(c.getURI()));
// 处理数据结构类
if (c.getLocalName().equals("数据结构")) { // 如果当前类是数据结构
System.out.println(" URI@" + c.getURI()); // 输出它的完整URI
System.out.print(" Animal's EquivalentClass is "+ c.getEquivalentClass()); // 取得它的的等价类并打印
System.out.println(" [comments:" + c.getEquivalentClass().getComment("EN")+"]"); // 输出等价类的注释
}// 处理数据结构结束
// 迭代显示当前类的直接父类
for (Iterator it = c.listSuperClasses(); it.hasNext();)
{
OntClass sp = (OntClass) it.next();
String str = c.getModel().getGraph().getPrefixMapping().shortForm(c.getURI()) // 获取URI
+ "'s superClass is " ;
String strSP = sp.getURI();
try{ // 另一种简化处理URI的方法
str = str + ":" + strSP.substring(strSP.indexOf('#')+1);
System.out.println(" Class" +str);
}catch( Exception e ){}
} // super class ends
// 迭代显示当前类的直接子类
for (Iterator it = c.listSubClasses(); it.hasNext();){
System.out.print(" Class");
OntClass sb = (OntClass) it.next();
System.out.println(c.getModel().getGraph().getPrefixMapping()
.shortForm(c.getURI())+ "'s subClass is "
+ sb.getModel().getGraph().getPrefixMapping()
.shortForm(sb.getURI()));
}// suber class ends
// 迭代显示与当前类相关的所有属性
for(Iterator ipp = c.listDeclaredProperties(); ipp.hasNext();){
OntProperty p = (OntProperty)ipp.next();
System.out.println(" associated property: " + p.getLocalName());
}// property ends
}// anonymity ends
else {}// 是匿名类
}// for ends
}
}
最后将JENA2.6.4的包放入路径(这里建议全部放入)
最后进行编译,基本就不会有问题了,显示的结果跟本体创建的类基本一致
如果出现Exception in thread "main" java.lang.NoClassDefFoundError错误信息
基本就是你路径设置问题。路径的“\”跟WINDOWS那个斜杠是相反的,另外就是你路径的文件名是否改变了,这个与JAVA Build PAth的理由是一样的。