2013-08-27 14 views
8

Kann jemand Klassen mit Objekteigenschaft in Sparql abfragen? Angenommen wir eine OWL-Datei, dieWie Klassen mit Object-Eigenschaft in Sparql abgefragt werden

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

Mensch folgt enthält und Pizzen sind Klassen (oder Konzepte). In SPARQL Diese Abfrage gibt nichts:

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

Aber wenn ich zwei Personen hinzufügen (oder Einheiten) unter diesen Begriffen wie

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

diese Abfrage kehrt ?x=Jim und ?y=cheesePizza Wie kann ich ?x=Human und ?y=Pizza mit SPARQL?

+3

Könnten Sie die RDF-Version Ihrer Ontologie posten? Klassen sind nicht direkt durch Eigenschaften in OWL verknüpft, sie werden normalerweise über ein Existenzbeschränkungsaxiom ausgeführt. Öffnen Sie also die RDF-Version Ihrer Ontologie und schauen Sie sich das Konstrukt an. Sie können dann versuchen, es mit Ihrer SPARQL-Abfrage abzugleichen. – loopasam

+1

Es klingt viel wahrscheinlicher, dass Sie eine Objekteigenschaft 'hasPizza' haben, die _rdfs: domain_ und _rdfs: range_ davon' Human' bzw. 'Pizzas' sind. Dies ist relativ einfach zu suchen, aber es ist eine unterschiedliche Aufgabe. –

Antwort

16

wie diese gegebene Daten (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> 

oder gleich sein, in der lesbaren Schildkröte:

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

Hinweis, dass die Behauptung Jim hasPizza CheesePizza in einer Dreifach ist der Graph. Die Domänen- und Bereichsaxiome für die Objekteigenschaft hasPizza sind zwei Tripel: hasPizza rdfs:domain Human und hasPizza rdfs:range Pizza. SPARQL-Abfragen stimmen Abfragemuster mit den Tripeln im Diagramm überein. So wird aus einer Abfrage wie:

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

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

Sie werden die Ergebnisse erhalten wie

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

, weil es ein triple im Graphen, dessen Prädikat ist :hasPizza, und das dreifache eines :Jim als Gegenstand hat, und :CheesePizza als das Objekt. Es klingt wie Sie tatsächlich nach der Domain und Reichweite der :hasPizza Eigenschaft fragen, die auch einfach zu finden sind. Verwenden Sie eine Abfrage wie folgt:

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

und Sie werden Ergebnisse wie diese:

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