有人知道如何在 Sparql 中查询具有对象属性的类吗? 假设我们有一个 OWL 文件,其中包含以下内容
Human ----(hasPizza)---> Pizzas
人类和披萨是类(或概念)。在 SPARQL 中,此查询不返回任何内容:
select ?x ?y where {
?x hasPizza ?y
}
但是如果我在这些概念下添加两个个人(或实体),例如
Human:Jim ----(hasPizza)---> Pizzas:cheesePizza
该查询将返回 ?x=Jim
和 ?y=cheesePizza
如何使用 SPARQL 获取 ?x=Human
和 ?y=Pizza
?
最佳答案
给定这样的数据(RDF/XML 格式):
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:pizzas="http://example.org/pizzas#"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
<owl:Ontology rdf:about="http://example.org/pizzas"/>
<owl:Class rdf:about="http://example.org/pizzas#Pizza"/>
<owl:Class rdf:about="http://example.org/pizzas#Human"/>
<owl:ObjectProperty rdf:about="http://example.org/pizzas#hasPizza">
<rdfs:domain rdf:resource="http://example.org/pizzas#Human"/>
<rdfs:range rdf:resource="http://example.org/pizzas#Pizza"/>
</owl:ObjectProperty>
<owl:NamedIndividual rdf:about="http://example.org/pizzas#Jim">
<rdf:type rdf:resource="http://example.org/pizzas#Human"/>
<pizzas:hasPizza>
<owl:NamedIndividual rdf:about="http://example.org/pizzas#CheesePizza">
<rdf:type rdf:resource="http://example.org/pizzas#Pizza"/>
</owl:NamedIndividual>
</pizzas:hasPizza>
</owl:NamedIndividual>
</rdf:RDF>
或者相同,在更具可读性的 Turtle 中:
@prefix : <http://example.org/pizzas#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix pizzas: <http://example.org/pizzas#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
pizzas:Jim
a pizzas:Human , owl:NamedIndividual ;
pizzas:hasPizza pizzas:CheesePizza .
pizzas:hasPizza
a owl:ObjectProperty ;
rdfs:domain pizzas:Human ;
rdfs:range pizzas:Pizza .
pizzas:Human
a owl:Class .
pizzas:Pizza
a owl:Class .
<http://example.org/pizzas>
a owl:Ontology .
pizzas:CheesePizza
a pizzas:Pizza , owl:NamedIndividual .
请注意,断言 Jim hasPizza CheesePizza
是图中的一个三元组。 hasPizza
对象属性的域和范围公理是两个三元组:hasPizza rdfs:domain Human
和 hasPizza rdfs:range Pizza
。 SPARQL 查询将查询模式与图中的三元组进行匹配。因此,从这样的查询:
prefix : <http://example.org/pizzas#>
select ?x ?y where {
?x :hasPizza ?y
}
您将得到诸如
之类的结果$ arq --data pizzas.ttl --query query.sparql
-----------------------
| x | y |
=======================
| :Jim | :CheesePizza |
-----------------------
因为图中有一个三元组,其谓词为 :hasPizza
,并且该三元组以 :Jim
作为主语,并且 :CheesePizza
code> 作为对象。听起来您实际上是在询问 :hasPizza
属性的域和范围,这也很容易检索。使用如下查询:
prefix : <http://example.org/pizzas#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?domain ?range where {
:hasPizza rdfs:domain ?domain ;
rdfs:range ?range .
}
你会得到这样的结果:
$ arq --data pizzas.ttl --query query.sparql
-------------------
| domain | range |
===================
| :Human | :Pizza |
-------------------
关于rdf - 如何在 Sparql 中查询具有对象属性的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18458150/