How to query Classes with Object Property in Sparql

后端 未结 1 1675
耶瑟儿~
耶瑟儿~ 2021-01-02 05:48

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
<         


        
相关标签:
1条回答
  • 2021-01-02 06:11

    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 |
    -------------------
    
    0 讨论(0)
提交回复
热议问题