2015-03-11 6 views
5

möchte ich mit SPARQL die Liste der italienischen Städte mit mehr als 100k der Bevölkerung holen und ich verwende die folgende Abfrage:DISTINCT nur auf einen Wert mit SPARQL

PREFIX dbo: <http://dbpedia.org/ontology/> 
SELECT ?city ?name ?pop WHERE { 
    ?city a dbo:Settlement . 
    ?city foaf:name ?name . 
    ?city dbo:populationTotal ?pop . 
    ?city dbo:country ?country . 
    ?city dbo:country dbpedia:Italy . 
    FILTER (?pop > 100000) 
} 

In den Ergebnissen ich für Beispiel in zwei verschiedenen Linien (die die gleiche Einheit darstellen, aber mit unterschiedlichen Namen):

http://dbpedia.org/resource/Bologna "Bologna" @de 384038

http://dbpedia.org/resource/Bologna "Comune di Bologna" @de 384.038

Wie kann ich SELECT DISTINCT nur in der Spalte ?city verwenden, aber nach wie vor als Ausgabe mit den outher Spalten?

+0

Möglicherweise verwandte Frage - http://stackoverflow.com/questions/11419800/sparql-keys-vs-distinct-values ​​ – RobV

Antwort

11

Sie können GROUP BY verwenden, um nach einer bestimmten Spalte zu gruppieren, und dann das Aggregat SAMPLE() verwenden, um einen der Werte aus den anderen Spalten auszuwählen, z.

PREFIX dbo: <http://dbpedia.org/ontology/> 

SELECT ?city (SAMPLE(?name) AS ?cityName) (SAMPLE(?pop) AS ?cityPop) 
WHERE 
{ 
    ?city a dbo:Settlement . 
    ?city foaf:name ?name . 
    ?city dbo:populationTotal ?pop . 
    ?city dbo:country ?country . 
    ?city dbo:country dbpedia:Italy . 
    FILTER (?pop > 100000) 
} 
GROUP BY ?city 

So durch die Gruppierung auf der ?city erhalten Sie nur eine einzige Zeile pro Stadt, da Sie von ?city gruppiert haben, können Sie nicht direkt Variablen auswählen, die keine Gruppengrößen sind.

Sie müssen stattdessen das SAMPLE() Aggregat verwenden, um einen der Werte für jede der Nicht-Gruppenvariablen auszuwählen, die Sie in den Endergebnissen haben möchten. Dies wird einer der Werte von ?name wählen und ?pop zurückzukehren, wie ?cityName und ?cityPop bzw.

+0

Danke sehr Es ist genau das, wonach ich gesucht habe! – drstein