原文鏈接
臨近期末,我有一門課程的期末項目是做一個教育領域的本體應用系統(tǒng),所以最近經(jīng)常思考本體在這樣一個系統(tǒng)中所起的作用,以及該如何實現(xiàn)。(本體是否只能在web環(huán)境下發(fā)揮作用,使用本體描述一個獨立系統(tǒng)的模型是否值得?)
臨近期末,我有一門課程的期末項目是做一個教育領域的本體應用系統(tǒng),所以最近經(jīng)常思考本體在這樣一個系統(tǒng)中所起的作用,以及該如何實現(xiàn)。(本體是否只能在web環(huán)境下發(fā)揮作用,使用本體描述一個獨立系統(tǒng)的模型是否值得?)
假設要做的是選課系統(tǒng),很容易看出系統(tǒng)里應該有這些對象:課程、學生、教師,它們之間互有聯(lián)系。現(xiàn)在的問題是,本體、Java類和數(shù)據(jù)庫各扮演怎樣的角色?我目前想到的方法有以下幾個:
- 在本體(owl)里建立這些類和關系,在Java里建立同樣的Bean類,運行時系統(tǒng)把本體里的individuals轉(zhuǎn)換為Java類的實例,也就是在內(nèi)存里得到一個Java實例的集合,選課的各種操作就是對這個集合的修改,退出系統(tǒng)時再進行反向轉(zhuǎn)換,把修改反映到本體里。在這樣的實現(xiàn)方法中,本體實際上扮演了數(shù)據(jù)庫的角色,所以當數(shù)據(jù)(individuals)很多的時候,效率會很成問題。(Protege的owl編輯工具提供了從本體生成EMF模型代碼的功能,雖然目前還是alpha版,這也許將成為同步兩種模型的不錯選擇。)
- 對上面的方法進行修改,讓本體不保存individuals,對Java實例集合的修改最終反映到關系數(shù)據(jù)庫里(利用hibernate不會很困難),運行時系統(tǒng)直接從數(shù)據(jù)庫里取得數(shù)據(jù)轉(zhuǎn)換為Java實例。這樣的實現(xiàn)可以解決效率問題,但和傳統(tǒng)應用區(qū)別不大,本體的作用幾乎為零。
- 另一種比較極端的做法是只用本體維護類和individuals,Java方面沒有任何與應用有關的模型,系統(tǒng)一開始把本體讀入內(nèi)存以rdf圖的方式存在,選課操作轉(zhuǎn)換為對此圖的修改(利用Jena等API)。這個方法存在兩個問題,一是效率,二是Java代碼的可讀性下降,這就相當于直接使用JDBC而不是hibernate對數(shù)據(jù)庫操作的區(qū)別。
在solo項目里我使用的是第一種方式,各方面效果還可以接受,但本體的作用發(fā)揮得很不夠。這是很重要的方面,因為如果和傳統(tǒng)項目沒有區(qū)別,辛辛苦苦引入本體又是為了什么,特別是對本體推理的功能,我想最關鍵的問題還是要找出最適合應用的本體,定義本體的確是一門學問。
Update:IBM Alphaworks也提供了一組本體工具(包括Orient、EODM和RStar),對EMF的支持應該不錯。今天初步試了一下Orient,它只支持RDF(S),而不支持OWL,所以無法滿足課程項目的要求,Orient的目前版本還有一些小bug,除已知的那些以外,我把.ontology文件輸出為ecore模型總是不成功,而輸出為rdf是可以的。
Update:推薦一個關于本體和模型驅(qū)動的幻燈片,主要內(nèi)容是介紹應該如何利用UML的可視化編輯功能和元模型的擴展功能來構造本體,這里面介紹了相當多的相關概念(其中很多我甚至沒聽說過),以及它們出現(xiàn)的原因,比較有利于我們理清思路。