1. 程式人生 > >本體(ontology)學習之我見——Jena規則編寫——中文顯示與owl:inverseOf推理結果不全

本體(ontology)學習之我見——Jena規則編寫——中文顯示與owl:inverseOf推理結果不全

     本體建立以後,接下來就是考慮怎樣去使用本體。之前已經說過,我的主要用途就是找出本體例項中的衝突(inconsistent)以及推匯出新的關係,而這兩者都要用到規則。筆者主要運用運用Jena提供的基於自定義規則的推理機來實現以上兩點,當然你也可以使用Jena+pellet或是通過Jena的dig介面(是這樣吧?意會)。

      因為新增到本體中的例項資料是中文,所以嘗試新建localname為中文的資源,事實證明可以。然而在基於自己編的規則推理中文名稱時,如:已知 張三 isFatherOf 李四 推出 李四 hasFather 張三,結果不成功,而英文名稱就可以。查了一下Java api發現InputStreamReader

(InputStream in, String charsetName)還有個字符集引數,加入“UTF-8"就可以了,程式碼:

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字首後的
    }
     }