我正在研究语义网,我想知道:在编写限制语言方面有什么不同:
:Person
a owl:Class ;
rdfs:subClassOf
[ a owl:Restriction ;
owl:onProperty :hasParent ;
owl:allValuesFrom :Person
] .
并编写范围限制,如:
:hasParent rdfs:range :Person.
在我看来,它意味着相同:父母必须有一种人。没有任何区别吗?
答案 0 :(得分:9)
第一个代码段表示拥有父母的:Person
必须拥有:Person
- 父级。但是,:Dog
的父级可能不是:Person
。第二个片段说任何拥有父母的东西都必须有:Person
- 父母,无论这是什么东西。
在krajol的评论之后编辑:
第一个代码段的allValuesFrom
限制不等同于:
:hasParent rdfs:domain :Person;
rdfs:range :Person .
在allValuesFrom
限制的情况下,父母仍然可能不是人。如果是rdfs:domain
/ rdfs:range
组合,则无法实现。受allValuesFrom
限制,可以说人有父母,狗有父母等。有域/范围,你不能。
答案 1 :(得分:1)
还有另一个值得注意的区别。当类上有多个rdfs:range(或rdfs:domain)三元组时,范围或域是所述范围/域的连接(交集)。请参阅the RDFS spec,但措辞不明确,this post。
如果在本体上执行推理,您会发现rdfs:range / domain三元组是针对所述范围/域类的所有超类推断的。虽然在语义上是正确的,但这可能会令人困惑或难以使用。 allValuesFrom 不会发生这种情况。
答案 2 :(得分:0)
(添加一个已经回答的问题的答案,因为我发现接受的答案的本质缺乏。)
[ a owl:Restriction ;
owl:onProperty :hasParent ;
owl:allValuesFrom :Person
]
可以理解为“hasParent
谓词的任何值(可能没有)属于Person
类型的所有事物的类”。
通过说Person
是这个类的子类,我们说它是这个类的一个更专业的版本。因此,Person
仍然只能将其他Person
s作为hasParent
的值。
这与rdfs:range
不同,因为我们没有声明hasParent
本身的有效域/范围。要回收Antoine's example,我们仍然可以说:
:dog1 a :Dog.
:dog2 a :Dog.
:dog1 :hasParent :dog2.