use*_*211 2 rdf semantic-web owl sparql
我有一个复杂的OWL本体,有很多类.我需要使用什么SPARQL查询来获取一个OWL类(例如,Person类)的数据和对象属性?
除了Jukka Matilainen的答案之外,还有几点需要考虑.OWL不是面向对象的编程语言,类和属性的概念与面向对象编程语言中的类和属性不同.当我们断言时
p rdfs:domain C
Run Code Online (Sandbox Code Playgroud)
我们没有做任何限制p可以拥有价值的个人的事情.也就是说,如果我们看到它并不矛盾
x p something
Run Code Online (Sandbox Code Playgroud)
我们不知道那x是一个C.事实上,当我们说p域名时,我们实际上说的C是,只要我们有三倍的形式x p something,我们可以推断出这x是一个C.我们可以将其写为三元组的推理规则:
x p _ p rdfs:domain C
------------------------- [1]
x rdf:type C
Run Code Online (Sandbox Code Playgroud)
当与推理规则结合使用时,这会产生一些可能令人惊讶的后果rdfs:subClassOf.特别是,回想一下,当C rdfs:subClassOf D这意味着任何时候我们都有一个实例C,我们可以推断它也是一个实例D.作为推理规则:
x rdf:type C C rdfs:subClassOf D
----------------------------------- [2]
x rdf:type D
Run Code Online (Sandbox Code Playgroud)
为什么会导致令人惊讶的结果呢?好吧,这意味着如果域名p是C,并且if C是子类D,那么说它D是(或者)域的合法也是合法的p.为什么会这样?好吧,假设那个x p _,那个p rdfs:domain C,那个C rdfs:subClassOf D.那么,按照[1]上面的规则,我们有x rdf:type C.但是因为它C是一个子类D,我们也有x rdf:type D.既然x是随意的,那么我们随时x p _都有x rdf:type D,但这正是它的意思p rdfs:domain D.
这意味着如果您尝试检索具有foaf:Person域的所有属性,那么如果您想要所有结果,则需要使用OWL推理器,而不仅仅是SPARQL查询.只要求具有声明域的事物foaf:Person就不一定能找到所有结果.
SPARQL查询有一个公认的答案,但我也注意到它可以通过使用values而不是使用它来清理一下
{ ?property a owl:DatatypeProperty } UNION { ?property a owl:ObjectProperty }
Run Code Online (Sandbox Code Playgroud)
由于意图是?property具有两个值中的一个rdf:type,我们可以将查询缩短为:
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
SELECT ?property
FROM <http://xmlns.com/foaf/spec/index.rdf>
WHERE {
values ?propertyType { owl:DatatypeProperty owl:ObjectProperty }
?property a ?propertyType ;
rdfs:domain foaf:Person .
}
Run Code Online (Sandbox Code Playgroud)
如上所述,您可能希望包含声明的域是其子类的任何属性foaf:Person,虽然我们无法使用SPARQL查询计算整个OWL类层次结构,但我们至少可以对属性路径执行一些操作:
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
SELECT ?property
FROM <http://xmlns.com/foaf/spec/index.rdf>
WHERE {
values ?propertyType { owl:DatatypeProperty owl:ObjectProperty }
?property a ?propertyType ;
rdfs:domain/rdfs:subClassOf* foaf:Person .
}
Run Code Online (Sandbox Code Playgroud)