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

use*_*211 2 rdf semantic-web owl sparql

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

Jos*_*lor 7

除了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)

为什么会导致令人惊讶的结果呢?好吧,这意味着如果域名pC,并且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)