2013-08-27 1 views
8

Est-ce que quelqu'un sait comment interroger des classes avec la propriété d'objet dans Sparql? Supposons que nous avons un fichier qui contient OWL suitComment interroger des classes avec la propriété d'objet dans Sparql

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

humaine et sont des classes (Pizzas ou concepts). Dans SPARQL, cette requête ne retourne rien:

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

Mais si j'ajoute deux personnes (ou entités) en vertu de ces concepts comme

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

cette requête retourne ?x=Jim et ?y=cheesePizza Comment puis-je obtenir ?x=Human et ?y=Pizza en utilisant SPARQL?

+3

Pouvez-vous poster la version RDF de votre ontologie? Les classes ne sont pas directement liées par des propriétés dans OWL, cela se fait généralement via un axiome de restriction existentiel. Donc, ouvrez la version RDF de votre ontologie et regardez la construction; vous pouvez ensuite essayer de le faire correspondre avec votre requête SPARQL. – loopasam

+1

Il semble beaucoup plus probable que vous ayez une propriété d'objet 'hasPizza', les _rdfs: domain_ et _rdfs: range_ étant respectivement' Human' et 'Pizzas'. Ceci est relativement facile à rechercher aussi, mais c'est une tâche distincte. –

Répondre

16

Compte tenu des données comme celle-ci (en 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> 

ou même, dans la tortue plus lisible:

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

avis que l'affirmation Jim hasPizza CheesePizza est un triple le graphique. Les axiomes de domaine et de plage pour la propriété d'objet hasPizza sont deux triplets: hasPizza rdfs:domain Human et hasPizza rdfs:range Pizza. Les requêtes SPARQL correspondent aux modèles de requête par rapport aux triplets du graphique. Ainsi, à partir d'une requête comme:

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

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

vous obtiendrez des résultats tels que

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

parce qu'il ya un triple dans le graphique dont le prédicat est :hasPizza, et qui a triple un :Jim comme sujet, et :CheesePizza en tant qu'objet. Il semble que vous demandiez réellement le domaine et la plage de la propriété :hasPizza, qui sont également faciles à récupérer. Utilisez une requête comme ceci:

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

et vous obtiendrez des résultats comme celui-ci:

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