我的本体中有MultiPetsOwner类,并且在当前设置中我希望能够检测到2个实例(Harry和Alex)。
但是当我为它运行DL查询“hasPet min 2 Animal”时,没有相应的实例。
与此同时,DL查询“hasPet some Animal”似乎有效 - 它为我提供了我期望的PetOwner类实例。
我做错了什么?如果“hasPet min 2 Animal”查询不正确,我应该使用什么来获取所有MultiPetsOwner s ?
我的.owl文件的内容可以在这里找到:http://pastebin.com/5xcriLRE
答案 0 :(得分:3)
在OWL中没有唯一名称假设(UNA),这意味着具有不同URI的两个人不一定彼此不同。这意味着,标准的OWL推理器,即用于DL查询的推理器,如果没有本体中的信息,则无法回答您的查询。两只动物a
和b
不是同一个人(通过猫头鹰:differentFrom):
你的本体论:
hasPet(x, a), Animal(a)
hasPet(x, b), Animal(b)
-> Q: hasPet min 2 Animal?
-> A: NO RESULT
使用额外的OWL公理
hasPet(x, a), Animal(a)
hasPet(x, b), Animal(b)
a ≠ b
-> Q: hasPet min 2 Animal?
-> A: x
替代方法:使用SPARQL作为查询语言
SELECT ?x WHERE {
?x :hasPet ?pet .
?pet a :Animal
} GROUP BY ?x
HAVING(COUNT(?pet) >= 2)
请注意,此查询可能不会考虑所需的推断。
答案 1 :(得分:2)
OWL正在开放世界假设中工作。在你的情况下,这意味着没有假设个人是不同的。你必须明确断言。在Protégé中,选择所有个体,在您的情况下选择所有动物,然后编辑 - > “让所有人都与众不同”。
如果您运行hasPet min 2 Animal
,它会为您提供预期的结果,但您可以在类MultiPetsOwner
的推断实例中运行推理器后看到它们。