2016-10-30 3 views
1

Ich versuche, Stadt mit der höchsten Bevölkerung zu wählen. Meine Abfrage sieht wie folgt aus:Sparql Syntaxfehler bei verschachtelten Wählen

PREFIX dct: <http://purl.org/dc/terms/> 
PREFIX dbpedia: <http://dbpedia.org/resource/> 
PREFIX db: <http://dbpedia.org/> 
PREFIX dbp: <http://dbpedia.org/property/> 
PREFIX dbc: <http://dbpedia.org/resource/Category:> 
PREFIX dbo: <http://dbpedia.org/ontology/> 

SELECT ?population ?capital 
WHERE { 

    ?x dct:subject dbc:Countries_in_Europe . 
    ?x dbo:capital ?capital . 
    ?capital dbo:populationTotal ?population . 

    FILTER (?population = 
     (
      SELECT MAX(?popul) AS ?pop 
      WHERE{ 
       ?capital dbo:populationTotal ?popul . 
      } 
     ) 
) 

} 
LIMIT 200 

I This PDF Seite gefolgt haved 5. Ich verwende Apache-jena-Fuseki-2.4.0 und bekommen einen Syntaxfehler Encountered " "select" "SELECT "" at line 18, column 1. Irgendwelche Ideen, wo ist das Problem?

+1

Wo sehen Sie im verknüpften PDF-Dokument (oder anderswo), dass die von Ihnen verwendete Unterabfrage-Syntax von Apache Jena Fuseki unterstützt wird? Es scheint, dass die Verfasser mögliche Überarbeitungen der Sprache vorschlagen. Die Beispiele, die in dem Papier angegeben sind, werden nicht als derzeit unterstützte Syntax beansprucht. Sie betrachten sozusagen eine "Feature-Anfrage", nicht in einem Benutzerhandbuch. –

+0

Dies funktioniert sogar mit Syntaxfehler, aber es gibt jedes Kapital mit Pop zurück. number ... filter scheint nicht zu funktionieren, wie ich es erwartet habe – TomP

Antwort

3

Ich weiß nicht, wo Sie gesehen haben, dass Sie das Ergebnis einer SELECT-Abfrage an eine Variable im FILTER binden können, aber das ist völlig falsch. Dies funktioniert möglicherweise für SQL, nicht jedoch für SPARQL.

PREFIX dbo: <http://dbpedia.org/ontology/> 
PREFIX dbp: <http://dbpedia.org/property/> 
PREFIX dct: <http://purl.org/dc/terms/> 
PREFIX dbc: <http://dbpedia.org/resource/Category:> 
PREFIX dbpedia: <http://dbpedia.org/resource/> 
PREFIX db: <http://dbpedia.org/> 

SELECT ?population ?capital 
WHERE 
    { ?x  dct:subject   dbc:Countries_in_Europe ; 
       dbo:capital   ?capital . 
    ?capital dbo:populationTotal ?population 
    FILTER (?population = ?pop) 

    # sub-SELECTs are evaluated first and encapsulated by { } 
    # in addition (as to TomP's comment), you have to restrict to European captials here 
    { SELECT (MAX(?popul) AS ?pop) 
     WHERE 
     { ?x  dct:subject   dbc:Countries_in_Europe ; 
        dbo:capital   ?capital . 
      ?capital dbo:populationTotal ?popul } 
    } 
    } 
LIMIT 200 

Aber, wenn Sie wirklich wollen „mit den höchsten Bevölkerungs Hauptstadt in Europa“, die haben, warum nicht mit der einfachen und offensichtlicher Weise, die Ihre Aufgabe widerspiegelt, dh ORDER BY + LIMIT 1:

PREFIX dbo: <http://dbpedia.org/ontology/> 
PREFIX dbp: <http://dbpedia.org/property/> 
PREFIX dct: <http://purl.org/dc/terms/> 
PREFIX dbc: <http://dbpedia.org/resource/Category:> 
PREFIX dbpedia: <http://dbpedia.org/resource/> 
PREFIX db: <http://dbpedia.org/> 

SELECT ?population ?capital 
WHERE 
    { ?x  dct:subject   dbc:Countries_in_Europe ; 
       dbo:capital   ?capital . 
    ?capital dbo:populationTotal ?population  
    } 
ORDER BY DESC(?population) 
LIMIT 1 
+1

"Ich weiß nicht, wo Sie gesehen haben, dass Sie das Ergebnis einer SELECT-Abfrage an eine Variable im FILTER binden können, aber das ist völlig falsch." - Es ist in dem Papier in der Frage verlinkt. Es scheint jedoch, als ob die Zeitung nicht zu sagen scheint "Das funktioniert in aktueller Software.", Sondern "SPARQL könnte in Zukunft so erweitert werden." –

+0

U sait, dass sub-Select als erstes ausgewertet wird, also müssen Sie mehr hinzufügen. ? x dct: Thema dbc: Countries_in_Europe; dbo: Hauptstadt? Hauptstadt. Muss auch hinzugefügt werden. Dann wird es funktionieren – TomP

+0

@TomP Du hast Recht. Ich habe nicht überprüft, was das Ziel der Anfrage ist, aber ich denke, er möchte die Hauptstadt in Europa mit der höchsten Bevölkerung haben. Aber das ist einfacher zu lösen mit 'ORDER BY DESC (? Population)' + 'LIMIT 1' – AKSW