Protégé Core API 学习
英文文档链接:(http://protege.stanford.edu/doc/dev.html#api )
Protégé提供了接口供其他应用程序访问知识库。这些应用程序不需要使用Protégé的用户界面,这些应用接口主要在protege.jar包的edu.stanford.smi.protege.model.Project类中的getKnowledgeBase()方法可以获取知识库的内容。
使用Protege项目中的本体
Protege支持两种标准,一个是较早的Frame,另一个是OWL。由于我们的项目使用的是OWL标准,所以主要对OWL标准的支持部分学习。
Protege提供了KnowledgeBase类,主要描述所有的知识。而OWLModel正是继承自这个类,所以可以搭建从项目数据到本体的桥梁。如何获取Protege中的本体呢,我使用了两种方式。
一种是:读取本地项目中的本体。代码如下:
package test;
import java.util.*;
import com.hp.hpl.jena.ontology.OntModel;
import edu.stanford.smi.protege.exception.OntologyLoadException;
import edu.stanford.smi.protege.model.*;
import edu.stanford.smi.protegex.owl.jena.JenaOWLModel;
public class KnowledgeBasePrinter {
private static final String PROJECT_FILE_NAME = "d:\\human.pprj";
public static void main(String[] args ) throws OntologyLoadException{
Collection errors = new ArrayList();
Project project = new Project(PROJECT_FILE_NAME, errors);
if (errors.size() == 0) {
JenaOWLModel kb = (JenaOWLModel)project.getKnowledgeBase();
OntModel ontModel = kb.getOntModel();
ontModel.write(System.out);
} else {
displayErrors(errors);
}
waitForContinue();
}
private static void displayErrors(Collection errors) {
Iterator i = errors.iterator();
while (i.hasNext()) {
System.out.println("Error: " + i.next());
}
}
private static void waitForContinue() {
System.out.println("Press <Enter> to continue");
try {
System.in.read();
} catch (Exception e) {}
}
}
这个类描述了从本地项目中读取知识库中的内容,打印出这个本体。由于我的应用程序中需要将Protege中的owl本体和JenaAPI中的本体进行互操作,Protege支持这种转换。所以,上面的程序中我将本体转换为OntModel,然后进行打印操作。
第二种:调用远程项目中的本体。主要改动部分代码,如下有两种方式。
RemoteProjectManager rpm = RemoteProjectManager.getInstance();
Project p = rpm.getProject("ip+端口号", "用户名", "密码", "项目名称", true);
KnowledgeBase kb = p.getKnowledgeBase();
或者
Project p = null;
try {
RemoteServer server = (RemoteServer) Naming.lookup("//localhost/" + Server.getBoundName());
if (server != null) {
RemoteSession session = server.openSession("Timothy Redmond",
SystemUtilities.getMachineIpAddress(),
"troglodyte");
if (session != null) {
RemoteServerProject serverProject = server.openProject("Newspaper", session);
if (serverProject != null) {
p = RemoteClientProject.createProject(server, serverProject, session, true);
}
}
}
} catch (Exception e) {
Log.getLogger().severe(Log.toString(e));
}
这样,就可以在自己的应用程序中使用Protege项目中的本体了。目前测试的情况是,使用远程的本体时会丢失部分数据,暂时还没有解决,还要继续探索。