Rdf 如何使用SPARQL获取OWL类的数据和对象属性?
我有一个包含许多类的复杂OWL本体。我需要使用什么样的SPARQL查询来获取一个OWL类(例如Person类)的数据和对象属性?如果您想查询OWL本体(例如)来查找具有声明为其域的给定类(例如foaf:Person)的数据类型属性和对象属性,您可以使用如下SPARQL查询: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
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 .
}