利用Protégé Core API使用Protégé 项目中的本体
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项目中的本体了。目前测试的情况是,使用远程的本体时会丢失部分数据,暂时还没有解决,还要继续探索。