rdf - 如何在 Sparql 中查询具有对象属性的类

标签 rdf sparql ontology owl rdfs

有人知道如何在 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 HumanhasPizza 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/

相关文章:

java - 我应该使用什么样的 jena 词汇来创建主要基于 ART 的 PDF?

java - 如何重命名本体的前缀

python - 如何在 Python 中解析和加载本体?

ontology - 猫头鹰本体相互(循环)依赖是否安全或合理?

uml - 将 UML 转换为 OWL 本体

java - 使用 OWL API 4 检查本体一致性和可满足性

java - 从lastfm.rdfize.com 添加RDF 模型

javascript - 为使用 dbpedia 的 sparql 查询生成 url

SPARQL查询传递不同版本的arq

从本体导出数据 - Protege