Как запросить классы со свойством Object в Sparql

кто-нибудь знает, как запрашивать классы со свойством объекта в Sparql? Предположим, у нас есть файл OWL, который содержит следующие

Human ----(hasPizza)---> Pizzas

человек и пицца-это классы (или понятия). В SPARQL этот запрос ничего не возвращает:

select ?x ?y where {
  ?x hasPizza ?y
}

но если я добавлю два человека (или сущности) под этими понятиями, как

Human:Jim ----(hasPizza)---> Pizzas:cheesePizza

этот запрос вернет ?x=Jim и ?y=cheesePizza Как я могу получить ?x=Human и ?y=Pizza использование SPARQL?

1 ответов


данные, подобные этим (в 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>

или то же самое, в более читаемой черепахе:

@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 как объект. Похоже, вы действительно просите домен и диапазон :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 |
-------------------