本體(ontology)學習之我見——Jena規則編寫——中文顯示與owl:inverseOf推理結果不全
本體建立以後,接下來就是考慮怎樣去使用本體。之前已經說過,我的主要用途就是找出本體例項中的衝突(inconsistent)以及推匯出新的關係,而這兩者都要用到規則。筆者主要運用運用Jena提供的基於自定義規則的推理機來實現以上兩點,當然你也可以使用Jena+pellet或是通過Jena的dig介面(是這樣吧?意會)。
因為新增到本體中的例項資料是中文,所以嘗試新建localname為中文的資源,事實證明可以。然而在基於自己編的規則推理中文名稱時,如:已知 張三 isFatherOf 李四 推出 李四 hasFather 張三,結果不成功,而英文名稱就可以。查了一下Java api發現InputStreamReader
FileInputStream file = new FileInputStream(owl_path);//owl_path當然是owl檔案路徑
InputStreamReader in = new InputStreamReader(file, "UTF-8");//解決中文問題
Model model = ModelFactory.createDefaultModel();
model.read(in, null);
編寫推理規則時,覺得對於逆屬性(owl:inverse),知道其中一對就可以推出另一對,如上文中的isFatherOf與hasFather,於是便寫了如下規則:[owl_inverseOf2:(?pa owl:inverseOf ?pb)(?a ?pa ?b) ->(?b ?pb ?a)],然而測試結果顯示:只有部分實現正確推理,還有一部分推理不出來,很是鬱悶~於是檢查了本體檔案(.owl),發現在一對你關係中只有一個使用owl:inverseOf標註了,儘管在protege中兩個屬性的 inverse Property都標註出了其逆屬性~於是又添加了一條規則[owl_inverseOf1:(?pa owl:inverseOf ?pb)->(?pb owl:inverseOf ?pa)]在一對逆屬性的宣告中都用owl:inverseOf,結果就正確了。
PS.為了檢測規則是否能推理出預期的關係,不需要把修改後的Model寫入本體,可以通過getDeductionsModel只獲取推理出的模型,程式碼如下:
Model dedumodel=model.getDeductionsModel();
if(dedumodel==null){
System.out.println("error");
}
else{
System.out.println("deduced statements:");
StmtIterator stmIter=dedumodel.listStatements();
while(stmIter.hasNext()){
Statement stm=stmIter.nextStatement();
RDFNode object=stm.getObject();
if(object instanceof Resource){
System.out.println(stm.getSubject().getLocalName()+"**"+stm.getPredicate().getLocalName()+"**"+object.asResource().getLocalName());
}
else
System.out.println(stm.getSubject().getLocalName()+"**"+stm.getPredicate().getLocalName()+"**"+object.toString());//獲取取出uri字首後的
}
}