最近开始看jena的api,对自己建的本体做一些工作。不过自己也是个菜鸟,很多东西可能在别人眼里都很浅显。不过做了,总要留点东西。
下面的一些内容是根据jena document里的例子"Textual rendering of the class hierarchy"来讲的。我只是根据自己的需要利用了一部分里面的内容。
1. OntModel m = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM, null );
用createOntologyModel建立一个model,其中里面的参数可选,对应不同的语言,如DAML_LANG, OWL_DL_LANG, OWL_LANG, OWL_LITE_LANG, RDFS_LANG.复杂的模型需要用到OntModelSpec。
2. m.getDocumentManager().addAltEntry( "http://www.dut.cn/sars", "file:D:/sars.owl" );提供一个入口,
也就是确定文件的位置,第一个参数是URI,可以不用真实存在的,第二个是owl文件所在的位置,这个必须是真实的咯~
3. m.read("http://www.dut.cn/sars");read有多个构造函数,这个是最简单的一个,用上面的addAltEntry的URL参数;
其实上面的addAltEntry也可以不用,而直接采用读取本地文件的方法,代码如下:
try
{
m.read(new FileInputStream("D://sars.owl"),"");
}
catch(IOException ioe)
{
System.err.println(ioe.toString());
}
其中try不能少。第2个参数是对应一个绝对的URI,如果没有就用“”。
4. rootclasses()是罗列出第一层里的class。首先定义一个list用来存放各个class,m.listClasses()将罗列出所有的class,然后通过判断来选取第一层的类。不过在javadoc里找到了另外一个函数listHierarchyRootClasses();完全可以替换原来的做法。
5. 下面的这个程序主要列出本体中的各个class,同时将各个class的subclass和property,在我的本体中全是ObjectProperty及其Range罗列出来,由于在定义本体的时候有has和is开头的互逆的属性,这里仅需要has开头的属性,所以用字符串判断的方法来取得这些属性及其Range。不知道有没有别的方法~:)
package cn.dut.www;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Iterator;
import com.hp.hpl.jena.ontology.OntClass;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.ontology.OntModelSpec;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.ontology.*;
public class ReadOWL {
public static void main(String[] args) {
// create the model and import owl file
OntModel model = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM, null );
try
{
model.read(new FileInputStream("D://sars.owl"),"");
}
catch(IOException ioe)
{
System.err.println(ioe.toString());
}
//the class number
int j=0;
//list classes
for(Iterator i=model.listClasses();i.hasNext();)
{
j++;
OntClass c = (OntClass) i.next();
String strClass=c.getModel().usePrefix(c.getURI());
System.out.println(j+strClass.substring(1));
//to list sub-classes for each class
for(Iterator k=c.listSubClasses(true);k.hasNext();)
{
System.out.print(" "+"hasSubClass");
OntClass subclass=(OntClass)k.next();
String strSubClass=subclass.getModel().usePrefix(subclass.getURI());
System.out.println(strSubClass.substring(1));
}
//list property for each class
for(Iterator y=c.listDeclaredProperties(true);y.hasNext();)
{
OntProperty property=(OntProperty)y.next();
String strPropertyName=property.getModel().usePrefix(property.getURI());
String strRange=property.getRange().toString();
String strRangeName=property.getModel().usePrefix(strRange);
//show just the "has" Properties
if(strPropertyName.substring(1).substring(0,3).equals("has"))
{
System.out.print(" ");
System.out.print(strPropertyName.substring(1));
System.out.println(strRangeName.substring(1));
}
}
}
};
}