1. 程式人生 > >本體(ontology)學習之我見——Jena操作本體遇到的問題

本體(ontology)學習之我見——Jena操作本體遇到的問題

很多人在照葫蘆畫瓢式的建好自己的本體後又要迷茫了,建的本體有什麼用?這就需要把本體融入到你的Java程式中,我就是用Jena來操作本體的~具體jena環境怎樣搭建,以及具體怎樣操作本體就不說了,網上搜Jena簡介或jena教程應該會有很多,其實都是一樣的,可能都來自IBM實驗室的那個版本吧(猜測)~只在此介紹一下遇到的問題~

OntModel ontModel=ModelFactory.createOntologyModel(); //定義的本體模型變數ontMedel

問題一:首次接觸Jena,對其中的API很陌生,還好網上有個介紹Jena api“Jena-javadoc.chm"文件~初次使用很是窩火,因為直接在索引裡查函式基本都找不到,感覺被忽悠了~後來換了個方法,先找出該函式所屬的類(函式肯定都是類的成員吧,類名一般在索引裡能查到),進入該類的介面後Ctrl+F再查函式,基本都能找到 如看到一句ModelFactory.createOntologyModel()不知所云,你可以現在索引中找到ModelFactory,點進去,然後Ctrl+F,輸入createOntologyModel基本就能找到了

問題二:ModelFactory.createOntologyModel(OntModelSpec spec, Model base)一開始以為Spec引數無所謂,結果出問題了~檢視OntModelSpec讓我想到了建本體時最後一步的選項”Please select the format in which the ontology will be saved (by default)“,然後下拉框中有RDF/XML、OWL/XML等選項,這貌似和OntModelSpec的選項有點關係吧,具體看介紹OntModelSpec吧。我最後把本體的型別給改了,protege中File->Gather Ontologies,改完之後就好了,這個問題困擾了我整整一天啊~我沒改之前會出現執行後會出現一堆Error和warning,分別給出一個:

Error: {E201} Multiple children of property element

warning:{E201} Multiple children of property element

問題三:同樣是.owl檔案,假設路徑為c:/ontologies/test.owl,普通的File檔案讀取路徑為File file=new File("c://ontologies//test.owl"),二本體模型的讀取格式為ontModel.read("file:c/ontologies/test.owl"); //此為url的格式

問題四:建本體時我只建了Class和property,individual準備在程式中動態新增,Class和property也可以新增,不可能什麼都在protege介面中新增~然而無論我怎麼createindividual()或是ontModel.add(Resource arg1,Property arg2,RDFNode arg3)都沒用,沒法新增individual或是statement到owl檔案中。經過一番掙扎後頓悟,就像高階語言中檔案流一樣,比如java,FileInputStream.read()只是把檔案從磁碟讀到緩衝區,對緩衝區中資料一番操作後,必須呼叫FileOutputStream.write才能把資料從緩衝區寫回磁碟~本體檔案也是這樣,直接上程式碼~

File f=new File(filepath);

//讀出

FileInputStream in;

   try {

  in = new FileInputStream(f);

  ontModel.read(in, null);

  in.close();

} catch (FileNotFoundException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

//寫回

FileOutputStream out = null;

   try {

  out = new FileOutputStream(f);

  ontModel.write(out,"");

  out.close();

   } catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}