如何使用SPARQL获取OWL类的数据和对象属性?

时间:2014-01-14 14:07:52

标签: rdf sparql semantic-web owl

我有一个复杂的OWL本体,有许多类。我需要使用什么SPARQL查询来获取一个OWL类的数据和对象属性(例如,Person类)?

2 个答案:

答案 0 :(得分:7)

除了Jukka Matilainen's answer之外,还有几点需要考虑。 OWL不是面向对象的编程语言,类和属性的概念与面向对象编程语言中的类和属性不同。当我们断言

p rdfs:domain C

我们没有做任何限制p可以拥有价值的个人的事情。也就是说,如果我们看到

,那就不一致了
x p something

我们不知道xC。事实上,当我们说p的域名为C时,我们实际上说的是,只要我们有x p something格式的三倍,我们就可以推断 xC。我们可以将其写为三元组的推理规则:

 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,而CD的子类,那么说D也是合法的是p的(或)域。为什么会这样?好吧,假设x p _p rdfs:domain CC rdfs:subClassOf D。好吧,根据上面的规则[1],我们有x rdf:type C。但是,因为CD的子类,我们也有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 
}