因为项目要用到Protege中构建的本体,这些本体又在Protege中编辑,所以存储结构是使用其内部的结构。要想使用Jena推理机,必须要将Protege中的KnowledgeBase导出为Jena内兼容的结构。庆幸的是,ProtegeAPI提供的转换接口。
(1)从本地项目中导出Jena Model,并打印所有的Triple,程序如下:
public static void getLocalModel() {
Collection errors = new ArrayList();
Project p = new Project("d:\\human.pprj", errors);
OWLModel owlmodel = (OWLModel) p.getKnowledgeBase();
Iterator<TripleStore> listtriplestore = owlmodel.getTripleStoreModel()
.listUserTripleStores();
while (listtriplestore.hasNext()) {
TripleStore ts = listtriplestore.next();
System.out.println(ts.getName().toString());
Iterator<Triple> itriple = ts.listTriples();
while (itriple.hasNext()) {
Triple triple = itriple.next();
System.out.println("triple:" + triple.getSubject() + ","
+ triple.getPredicate() + "," + triple.getObject());
}
}
owlmodel.getOntModel().write(System.out);
}
(2)从数据库导出Jena Model,并且进行推理,程序如下:
/**
* 从Protege本体数据库中导出Jena本体,并且进行推理
*/
public static void connectTest() {
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://IPaddress:3306/protege?useUnicode=true&characterEncoding=UTF-8";
String table = "test";
String user = "root";
String password = "root";
OWLDatabaseKnowledgeBaseFactory factory = new OWLDatabaseKnowledgeBaseFactory();
Collection errors = new ArrayList();
Project prj = Project.createBuildProject(factory, errors);
try {
OWLDatabaseKnowledgeBaseFactory.setSources(prj.getSources(),
driver, url, table, user, password);
prj.createDomainKnowledgeBase(factory, errors, true);
OWLModel owlmodel = (OWLModel) prj.getKnowledgeBase();
Model ont = owlmodel.getOntModel();
ont.write(new FileOutputStream("onto/human_pro.rdf"));
List<Rule> rule = Rule.rulesFromURL("rules/humantest.rules");
Reasoner reasoner = new GenericRuleReasoner(rule);
InfModel inf = ModelFactory.createInfModel(reasoner, ont);
inf.difference(ont).write(
new FileOutputStream("onto/human_infer_pro.rdf"));
} catch (Exception e) {
e.printStackTrace();
} finally {
prj.dispose();
}
}