因为项目要用到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(); } }