2017-03-06 87 views
0

the examplehasProperty從OWL-API庫:測試一個OWL類是否是一個屬性的域/範圍

要測試一個類的實例是否必須有一個屬性,我們創建限制的一些值然後詢問該類別的可滿足性,以及來自限制的這些一些值的補充。如果交叉點是可滿足的,那麼類的實例不必擁有該屬性,否則就是這樣。

所以要檢查,如果一個類的對象屬性的一個領域,我可以用波紋管的片段:

OWLDataFactory dataFactory = manager.getOWLDataFactory(); 
OWLClassExpression restriction = dataFactory.getOWLObjectSomeValuesFrom(objectProperty, dataFactory.getOWLThing()); 
OWLClassExpression complement = dataFactory.getOWLObjectComplementOf(restriction); 
OWLClassExpression intersection = dataFactory.getOWLObjectIntersectionOf(cls, complement); 
boolean hasObjectProperty = !reasoner.isSatisfiable(intersection); 

我想知道如何檢查,如果一個類是對象的範圍屬性,並且如果它是數據屬性的域。我可以使用下面的代碼片段(基於上面的例子)來檢查數據屬性域嗎?

OWLClassExpression restriction = dataFactory.getOWLDataSomeValuesFrom(dataProperty, dataFactory.getOWLThing()); 
OWLClassExpression complement = dataFactory.getOWLDataComplementOf(restriction); 
OWLClassExpression intersection = dataFactory.getOWLDataIntersectionOf(cls, complement); 
boolean hasDataProperty = !reasoner.isSatisfiable(intersection); 

回答

1

的例子不這樣做,你在找什麼 - 它會檢查它是否是一個類的實例有一個特定屬性的屬性斷言必要。您試圖驗證的條件是較弱的 - 不管是,如果給定屬性斷言,則推斷類C是斷言的主題(或對象,對於範圍情況)的類型。

這可以通過一種更簡單的方式(代碼和複雜性)來完成,檢查屬性的域是否是您感興趣的類的超類 - 或者如果您想檢查類C是否爲完全是的域名,你可以檢查兩個類是否相同。

實施例:

OWLOntology o = ... //root ontology for the reasoner 
OWLReasoner r = ... 
OWLObjectProperty p = ... 
for (OWLObjectPropertyDomainAxiom ax: o.getObjectPropertyDomainAxioms(p)) { 
    OWLClassExpression c = ax.getDomain(); 
    NodeSet<OWLClass> allSubClasses = r.getSubClasses(c, false); 
    Node<OWLClass> allEquivalentClasses = r.getEquivalentClasses(c); 
} 

對於你只需要從對象切換到數據屬性中的示例數據屬性的域,對象屬性的範圍,你會搜索對象屬性範圍公理。