2013-08-27 13 views
8

Qualcuno sa come interrogare le classi con la proprietà dell'oggetto in Sparql? Supponiamo di avere un file che contiene OWL segueCome interrogare le classi con la proprietà dell'oggetto in Sparql

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

umana e pizze sono classi (o concetti). In SPARQL, questa query restituisce nulla:

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

Ma se aggiungo due individui (o enti) in virtù di tali concetti come

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

che query restituirà ?x=Jim e ?y=cheesePizza Come posso ottenere ?x=Human e ?y=Pizza usando SPARQL?

+3

Potrebbe inviare la versione RDF del all'ontologia? Le classi non sono direttamente collegate dalle proprietà in OWL, di solito vengono effettuate tramite un assioma di limitazione esistenziale. Quindi apri la versione RDF della tua ontologia e guarda il costrutto; puoi quindi provare ad abbinarlo alla tua query SPARQL. – loopasam

+1

Sembra molto più probabile che tu abbia una proprietà dell'oggetto 'hasPizza', il _rdfs: domain_ e _rdfs: range_ di cui sono' Human' e 'Pizzas', rispettivamente. Anche questo è relativamente facile da cercare, ma è un compito distinto. –

risposta

16

dati indicati come questo (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> 

o lo stesso, nella tartaruga più leggibile:

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

comunicazione che l'affermazione Jim hasPizza CheesePizza è una tripla in il grafo. Gli assiomi del dominio e della gamma per la proprietà dell'oggetto hasPizza sono due triple: hasPizza rdfs:domain Human e hasPizza rdfs:range Pizza. Le query SPARQL corrispondono ai modelli di query rispetto alle triple nel grafico. Così, da una query come:

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

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

si ottengono risultati come

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

perché non v'è una tripla nel grafico il cui predicato è :hasPizza, e che tripla ha un :Jim come soggetto, e :CheesePizza come oggetto. Sembra che tu stia effettivamente chiedendo il dominio e l'intervallo della proprietà :hasPizza, che sono anche facili da recuperare. Utilizzare una query come questa:

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

e si otterrà risultati come questo:

$ arq --data pizzas.ttl --query query.sparql 
------------------- 
| domain | range | 
=================== 
| :Human | :Pizza | 
------------------- 
Problemi correlati