2017-07-17 14 views
0

Ich bin ein Anfänger in SPARQL. Ich habe die pizza ontology und ich versuche, eine Abfrage zu schreiben, die alle heißen Beläge auflistet. Bisher habe ich folgendes herausgefunden:SPARQL Abfrage auf Pizza Ontologie

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX pizza: <http://www.co-ode.org/ontologies/pizza/pizza.owl#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 

SELECT ?targetPizza 
WHERE { 
?topping rdfs:subClassOf pizza:PizzaTopping . 
?topping rdfs:subClassOf ?restriction . 
?restriction owl:onProperty pizza:hasSpiciness . 
?restriction owl:someValuesFrom pizza:Hot . 

} 

Es gibt jedoch ein leeres Ergebnis zurück. Warum ist meine Abfrage falsch?

Vielen Dank im Voraus für Ihre Hilfe.

+0

Und warum wählen Sie '? TargetPizza' anstelle der '? Topping'-Variable? – AKSW

+0

Ich dachte, die Wahl der Variablen macht keinen großen Unterschied. Und sollte nicht alle Pizzas mit heißem Belag zurückgegeben werden? Aber selbst wenn ich es zum Topping ändere, ist es immer noch ein leeres Ergebnis. – Nick

+0

"Die Wahl der Variablen macht keinen Unterschied"? Sie SELECT die Variable '? TargetPizza', die nicht in der Abfrage gebunden ist. Warum glaubst du, dass das nicht wichtig ist? – AKSW

Antwort

1

Kurze Antwort: Es gibt nichts, was Ihrer Anfrage entspricht. Sie können alles sehen, was Ihre Abfragestruktur ohne die gegebene Würzigkeit Wert durch Ausführen

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 

SELECT * WHERE { 
    ?topping rdfs:subClassOf pizza:PizzaTopping . 
    ?topping rdfs:subClassOf ?restriction . 
    ?restriction rdf:type owl:Restriction . 
    ?restriction ?p ?o . 
} 

Ergebnis entsprechen würde:

+--------------------+---------------------+---------------------+ 
|  topping  |   p   |   o   | 
+--------------------+---------------------+---------------------+ 
| pizza:FishTopping | rdf:type   | owl:Restriction | 
| pizza:FishTopping | owl:onProperty  | pizza:hasSpiciness | 
| pizza:FishTopping | owl:someValuesFrom | pizza:Mild   | 
| pizza:NutTopping | rdf:type   | owl:Restriction | 
| pizza:NutTopping | owl:onProperty  | pizza:hasSpiciness | 
| pizza:NutTopping | owl:someValuesFrom | pizza:Mild   | 
+--------------------+---------------------+---------------------+ 

Also, was ist das Problem? Der nächste Schritt in die andere Richtung zu gehen um sein würde, das heißt wir überprüfen alles, was zu heißen Würze verwandt ist:

PREFIX pizza: <http://www.co-ode.org/ontologies/pizza/pizza.owl#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 

SELECT DISTINCT ?s WHERE { 
    ?s rdfs:subClassOf ?restriction . 
    ?restriction owl:onProperty pizza:hasSpiciness . 
    ?restriction owl:someValuesFrom pizza:Hot . 
} 

Ergebnis:

+------------------------------+ 
|    s    | 
+------------------------------+ 
| pizza:HotGreenPepperTopping | 
| pizza:JalapenoPepperTopping | 
| pizza:TobascoPepperSauce | 
| pizza:CajunSpiceTopping  | 
| pizza:HotSpicedBeefTopping | 
+------------------------------+ 

Also, wie kann das sein? Nun, die kurze Antwort ist, keine der würzigen Belag ist definiert als Instanz der Klasse pizza:PizzaTopping, können Sie dies mit einem zusätzlichen optionalen Triple-Muster validieren können

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX pizza: <http://www.co-ode.org/ontologies/pizza/pizza.owl#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 

SELECT distinct ?s ?type WHERE { 
    ?s rdfs:subClassOf ?restriction . 
    ?restriction owl:onProperty pizza:hasSpiciness . 
    ?restriction owl:someValuesFrom pizza:Hot . 
    OPTIONAL {?s rdf:type ?type } 
} 

Ergebnis:

+------------------------------+------------+ 
|    s    | type | 
+------------------------------+------------+ 
| pizza:HotGreenPepperTopping | owl:Class | 
| pizza:JalapenoPepperTopping | owl:Class | 
| pizza:TobascoPepperSauce | owl:Class | 
| pizza:CajunSpiceTopping  | owl:Class | 
| pizza:HotSpicedBeefTopping | owl:Class | 
+------------------------------+------------+ 
+0

Vielen Dank Sir, Ihre Antwort wird sehr geschätzt. – Nick

-1
SELECT ?targetPizza 
WHERE { 
?targetPizza rdfs:subClassOf pizza:PizzaTopping . 
?targetPizza rdfs:subClassOf ?restriction . 
?restriction owl:onProperty pizza:hasSpiciness . 
?restriction owl:someValuesFrom pizza:Hot . 

} 
+0

Tut mir leid, dass das nicht funktioniert. – Nick

0

Ich glaube, Sie nur wählen haben alle Subklassen von Pizza Topping, dann sind Sie sollten Abfrage richtig funktionieren:

SELECT ?targetPizza 
WHERE { 
?targetPizza rdfs:subClassOf* pizza:PizzaTopping . 
?targetPizza rdfs:subClassOf ?restriction . 
?restriction owl:onProperty pizza:hasSpiciness . 
?restriction owl:someValuesFrom pizza:Hot . 

}

Verwandte Themen