2017-04-04 67 views
0

我對使用owl api有一個簡短的問題。OWL Api,從父級A移動到B

假設我有一個叫Species的類,它有一個Subclass哺乳動物,它有一個Subclass Primate,它有一個子類Human。

物種 - >哺乳動物 - >靈長類動物 - >人類

出於某種原因,我想在我們的軟件重新分類這一點,並說,靈長類動物不再視爲哺乳動物,相反,他們應該是一個直接子類種類。

含義我們的圖形看起來應該像現在這樣

物種 - >靈長類動物 - >人類

任何人可以請點我在正確的方向?

找到我們的父類是很容易的,使用OWL-API

reasoner.getSuperClasses(chield, true).entities().collect(Collectors.toSet[OWLClass]) 

,但我怎麼能「分離」我的類現在從它的父?

回答

2

如果你有一個本體,其中的關係:

  • 物種 - >哺乳動物
  • 哺乳動物 - >靈長類動物
  • 靈長類動物 - >人類

直接斷言(不是結果推理計算)。

然後在owlapi這被表示爲公理:

  1. OWLSubClass(哺乳動物,物種)
  2. OWLSubClass(靈長類動物,哺乳動物)
  3. OWLSubClass(人,靈長類動物)

的解決方案可能是刪除舊的子類斷言並添加新的(除非您正在玩艾倫時間)。

OWLDataFactory factory = manager.getOWLDataFactory(); 
ontology.remove(factory.getOWLSubClassOfAxiom(primate, mammal)); 
ontology.add(factory.getOWLSubClassOfAxiom(primate, species)); 

注:如果您使用的是版本低於5 owlapi的那麼我們就必須使用OWLOntologyManager刪除/添加公理本體:

manager.remove(ontology, axiom) 
manager.add(ontology, axiom) 

如果專業化直接關係都沒有在你的本體論中聲稱;它會更加複雜。你必須知道爲什麼'人類'是查看'哺乳動物'的一個子類。也許'推理者'的'解釋'系統可以幫助你。

+1

不只是「可能」 - 如果子類公理被聲明,它必須被移除以改變層次結構。如果推斷,有必要理解爲什麼,並消除/抵消推理的原因。 – Ignazio

+0

非常感謝。這是否也會保留所有可能的子類和人類個體。或者我將不得不手動跟蹤它們? – berlinguyinca