How to query Classes with Object Property in Sparql
Asked Answered
I

1

12

Does any one know how to query Classes with Object Property in Sparql? Assume we have an OWL file which contains follows

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

Human and Pizzas are classes (or concepts). In SPARQL, this query returns nothing:

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

But if I add two individuals (or entities) under those concepts like

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

that query will return ?x=Jim and ?y=cheesePizza How can I get ?x=Human and ?y=Pizza using SPARQL?

Infantryman answered 27/8, 2013 at 6:7 Comment(2)
Could you post the RDF version of your ontology? Classes are not directly linked by properties in OWL, it is usually done via an existential restriction axiom. So open the RDF version of your ontology and look the construct; you can then try to match it with your SPARQL query.Depressive
It sounds much more likely that you have an object property hasPizza, the rdfs:domain and rdfs:range of which are Human and Pizzas, respectively. This is relatively easy to search for too, though, but it is a distinct task.Tracietracing
T
19

Given data like this (in 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>

or the same, in the more readable 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 .

notice that the assertion Jim hasPizza CheesePizza is one triple in the graph. The domain and range axioms for the hasPizza object property are two triples: hasPizza rdfs:domain Human and hasPizza rdfs:range Pizza. SPARQL queries match query patterns against the triples in the graph. Thus, from a query like:

prefix :        <http://example.org/pizzas#>

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

you will get results such as

$ arq --data pizzas.ttl --query query.sparql
-----------------------
| x    | y            |
=======================
| :Jim | :CheesePizza |
-----------------------

because there is one triple in the graph whose predicate is :hasPizza, and that triple has a :Jim as the subject, and :CheesePizza as the object. It sounds like you're actually asking for the domain and range of the :hasPizza property, which are also easy to retrieve. Use a query like this:

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 .
}

and you'll get results like this:

$ arq --data pizzas.ttl --query query.sparql
-------------------
| domain | range  |
===================
| :Human | :Pizza |
-------------------
Tracietracing answered 27/8, 2013 at 13:20 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.