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

Rdf 如何使用SPARQL获取OWL类的数据和对象属性?,rdf,sparql,semantic-web,owl,Rdf,Sparql,Semantic Web,Owl,我有一个包含许多类的复杂OWL本体。我需要使用什么样的SPARQL查询来获取一个OWL类(例如Person类)的数据和对象属性?如果您想查询OWL本体(例如)来查找具有声明为其域的给定类(例如foaf:Person)的数据类型属性和对象属性,您可以使用如下SPARQL查询: PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFI

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

如果您想查询OWL本体(例如)来查找具有声明为其域的给定类(例如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 
}
前缀foaf:
前缀rdfs:
前缀owl:
选择?属性
从…起
在哪里{
{?属性a owl:DatatypeProperty}联合{?属性a owl:ObjectProperty}
?属性rdfs:域foaf:个人
}
除此之外,还有几点需要考虑。OWL不是面向对象编程语言,类和属性的概念与面向对象编程语言中的类和属性不同。当我们断言

p rdfs:domain C
我们没有做任何限制个人的事情,
p
可以为其提供价值。也就是说,如果我们看到

x p something
我们不知道
x
C
。事实上,当我们说
p
的域是
C
的时候,我们实际上是在说,任何时候我们有
xp something
形式的三元组,我们可以推断
x
C
。我们可以把它写成三元组的推理规则:

 x p _     p rdfs:domain C
 ------------------------- [1]
       x rdf:type C
当与
rdfs:subassof
的推理规则结合使用时,这可能会产生一些令人惊讶的结果。特别是,回想一下,当
C rdfs:subassof D
时,这意味着每当我们有
C
的实例时,我们都可以推断它也是
D
的实例。作为推理规则:

x rdf:type C    C rdfs:subClassOf D
----------------------------------- [2]
        x rdf:type D
为什么这会导致令人惊讶的结果?这意味着如果
p
的域是
C
,如果
C
D
的子类,那么说
D
p
的(或a)域也是合法的。为什么会这样?好,假设
xp
,和
prdfs:domain C
,以及
crdfs:subassof D
。好的,根据上面的
[1]
规则,我们有
xrdf:type C
。但是因为
C
D
的一个子类,所以我们还有
xrdf:type D
。既然
x
是任意的,那么只要我们有
xp
,我们也有
xrdf:type D
,但这正是拥有
prdfs:domain D
的意思

这意味着,如果您试图检索所有具有
foaf:Person
作为域的属性,那么您需要使用OWL推理器,而不仅仅是SPARQL查询,如果您想要所有结果的话。仅仅询问那些声明域为
foaf:Person
的内容不一定能找到所有结果

有一个SPARQL查询,但我还要注意,它可以通过使用
值而不是使用

{ ?property a owl:DatatypeProperty } UNION { ?property a owl:ObjectProperty }
由于其目的是
?属性
有两个值之一作为
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 .
}

类没有对象和数据属性。相反,个体具有对象和数据属性的值。堆栈溢出问题需要比这更具体一些;你能举一个例子说明你会得到什么样的数据,以及你想得到什么样的结果吗?我只是想要一个查询,列出任何OWL本体中一个OWL类的所有数据和对象属性。下面的Jukka理解了我的问题并给出了解决方案。谈论“自己的OWL类的数据和对象属性”是不太正确的,因为OWL类没有属性。我在回答中对此做了更多的解释,并提供了一个稍微修改的SPARQL查询。谢谢,Jukka,此查询非常有效,解决了我的问题。请注意,您可以在此处使用
值而不是
联合
,如
选择中所示。。。{values?propertyType{owl:DatatypeProperty owl:ObjectProperty}?property a?propertyType;rdfs:domain foaf:Person.}
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 .
}