我有一个复杂的OWL本体,有许多类。我需要使用什么SPARQL查询来获取一个OWL类的数据和对象属性(例如,Person类)?
答案 0 :(得分:7)
除了Jukka Matilainen's answer之外,还有几点需要考虑。 OWL不是面向对象的编程语言,类和属性的概念与面向对象编程语言中的类和属性不同。当我们断言
时p rdfs:domain C
我们没有做任何限制p
可以拥有价值的个人的事情。也就是说,如果我们看到
x p something
我们不知道x
是C
。事实上,当我们说p
的域名为C
时,我们实际上说的是,只要我们有x p something
格式的三倍,我们就可以推断 x
是C
。我们可以将其写为三元组的推理规则:
x p _ p rdfs:domain C
------------------------- [1]
x rdf:type C
与rdfs:subClassOf
的推理规则结合使用时,会产生一些可能令人惊讶的后果。特别要记住,当C rdfs:subClassOf D
时,这意味着只要我们有C
的实例,我们就可以推断它也是D
的一个实例。作为推理规则:
x rdf:type C C rdfs:subClassOf D
----------------------------------- [2]
x rdf:type D
为什么会导致令人惊讶的结果?好吧,这意味着如果p
的域名是C
,而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查询的accepted answer,但我也注意到可以使用values
而不是使用
{ ?property a owl:DatatypeProperty } UNION { ?property a owl:ObjectProperty }
由于意图是?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 .
}
如上所述,您可能希望包含声明的域是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 .
}
答案 1 :(得分:2)
如果要查询OWL本体(例如FOAF ontology)以查找具有声明为其域的给定类(例如foaf:Person)的数据类型属性和对象属性,则可以使用像这样的SPARQL查询:
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 {
{ ?property a owl:DatatypeProperty } UNION { ?property a owl:ObjectProperty }
?property rdfs:domain foaf:Person
}