Rdf 为什么此DL查询不返回任何个人?

Rdf 为什么此DL查询不返回任何个人?,rdf,owl,protege,dlquery,description-logic,Rdf,Owl,Protege,Dlquery,Description Logic,此DL查询未返回任何个人: 查询(Protégé语法):hasPet恰好是一个家庭动物 以下是本体的一部分: :hasPet a owl:ObjectProperty; rdfs:domain :Human; rdfs:range :DomesticAnimal; owl:inverseOf : petOf; :Joe a :Human; hasPet :Lassy.

此DL查询未返回任何个人:

  • 查询(Protégé语法):
    hasPet恰好是一个家庭动物
以下是本体的一部分:

:hasPet a           owl:ObjectProperty;
        rdfs:domain :Human;
        rdfs:range  :DomesticAnimal;
        owl:inverseOf : petOf;


:Joe    a           :Human;
        hasPet      :Lassy.

:Bob    a           :Human;
        hasPet      :Sparkey, Lucky.
查询:

  • petOf value Bob
    返回
    Sparkey
    Lucky
  • petOf value Joe
    返回
    Lassy
  • hasPet正好1
    不返回任何内容
为什么最后一个查询没有返回Joe?
我用佩莱、赫密特和FaCT++在Protégéwith Pellet、HermiT和FaCT++中试用过它,但它不起作用。

类表达式
hasPet justly 1 DomesticAnimal
作为实例,正好包含那些通过属性
hasPet
与一个
DomesticAnimal
相关的个体。恰好一意味着至少一个,但不超过一个。基于三元组

:Joe :hasPet :Lassy .
:Bob :hasPet :Sparkey ;
     :hasPet :Lucky .
我们知道乔和鲍勃每人至少有一只宠物,但我们不知道他们可能有多少只。乔可能有其他宠物而不是拉西,所以我们不知道乔有一只宠物。Sparkey和Lucky可能是同一个人,所以Bob至少有一只宠物,但我们没有Bob宠物数量的上限

OWL和RDF一样,都会产生错误,这意味着OWL不会假设提供的数据是对世界上所有真实事物的详尽枚举。如果是这样的话,那么推断就没有意义了。没有断言
spo
并不意味着
不是(spo)
,而是说还没有关于
spo
的判断

不过,您可以在数据中添加更多的知识,以得到您想要的结论。你用以下描述乔:

Joe a Human ;
    hasPet Lassy ;
    hasPet only { Lassy } .

Lassy a DomesticAnimal .
从这里你可以推断出

Joe a (hasPet exactly 1 DomesticAnimal) .
对于Bob来说,你似乎认为Sparkey和Lucky是不同的动物,所以你需要猫头鹰:与之不同的

Bob a Human ;
    hasPet Sparkey, Lucky .

Sparkey a DomesticAnimal .

Lucky a DomesticAnimal ; 
      owl:differentFrom Sparkey .
我没有在这些公理中包括
Bob hasPet only{Sparkey,Lucky}
,因为它们不是推断Bob有多只宠物的必要条件,但您可以包括它。我还只包含了一个与本可以做出的断言不同的
owl:differentFrom。现在大家都知道鲍勃有两种不同的宠物,因此他不是一只宠物,而恰恰是一只家养动物。将这些数据加载到Protégé后,DL查询
hasPet恰好1 DomesticAnimal
按预期工作:

实例本体 如果您希望能够快速地将这个结构加载到Protégé中,那么这里有一个本体,其中包含了如上所述的个人、属性和公理。我没有定义
petOf
属性,但您仍然可以将前两个查询作为
inverse hasPet value Joe
inverse hasPet value Bob
运行,并获得预期结果

@前缀:。
@前缀rdfs:。
@前缀owl:。
@前缀xsd:。
@前缀rdf:。
@前缀owa:。
鲍伯
猫头鹰:名字是个人,猫头鹰:人类;
owa:hasPet owa:Sparkey,owa:Lucky。
小矮人
猫头鹰:名字是个人的,owa:家养的。
小姑娘
猫头鹰:名字是个人的,owa:家养的。
[]猫头鹰:完全不同;
猫头鹰:远程成员(owa:Lucky owa:Sparkey)。
奥瓦:乔
猫头鹰:名字是个人,猫头鹰:人类;
猫头鹰:限制;
猫头鹰:来自的所有值
[猫头鹰:班级;
猫头鹰:其中之一(猫头鹰:拉西)
] ;
owl:onProperty owa:hasPet
] ;
owa:hasPet owa:Lassy。
猫头鹰:本体论。
奥瓦:幸运
猫头鹰:名字是个人的,owa:家养的。
owa:人类
猫头鹰:上课。
哈斯佩特
猫头鹰:对象属性。
家庭动物
猫头鹰:上课。

除了下面的答案外,还可以看一下的答案。答案很棒!我也在努力寻找解决方案——愚蠢的开放世界假设!非常感谢你的回答。Protege允许您只需单击一次,即可将所有声明的个人区分开来。是否有一项功能允许您自动对每个个体的断言属性创建限制,以断言没有其他可能的值(即模拟封闭世界假设)?你如何发展你的本体论?你是用乌龟写的吗?@loopasam…是的!X不是跟在D和D'后面吗?不“在逻辑系统中,通常更容易理解,也就是说,粗略地说,添加信息永远不会让你收回以前的结论。如果你有一个巨大的数据集,例如DBpedia,并且可以从它的一个很小的子集证明P,你真的不想搜索整个剩余的数据,以确保数据集中没有其他数据会使你收回它。@Anthony这是我提供整个本体的原因之一。您可以保存它,并在Protégé中打开它,查看事物是如何表示的。我在回答中使用的语法实际上非常接近。例如,定义了单个Joe后,转到“个人”选项卡,选择Joe,单击“类型”旁边的“+”按钮,转到“类表达式编辑器”选项卡,然后输入,例如,
hasPet only{Lassy}
。(这取决于属性
hasPet
和已定义的个体
Lassy
)类似地,您可以准确地键入
hasPet 1 DomesticAnimal
@Anthony Protege输入语法大致相同,尽管您将只使用类表达式。这种方法可能更有用。也有代码示例(但您需要使用中的“ShowManchester syntax”按钮启用Manchester语法)。