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

 

 

api

相关推荐