2015-03-11 8 views
5

chcę pobrać z SPARQL listę miast włoskich z ponad 100k mieszkańców i używam następujące zapytanie:DISTINCT tylko jedna wartość z 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) 
} 

w wynikach dostaję za przykładowo w dwóch różnych linii (co stanowi ten sam obiekt, ale z różnymi nazwami)

http://dbpedia.org/resource/Bologna "Bolonia" @en 384038

http://dbpedia.org/resource/Bologna "Comune Bolonii" @en 384038

Jak mogę używać SELECT DISTINCT tylko w kolumnie ?city, ale nadal jako wyjściowe są kolumny zewnętrzne?

+0

prawdopodobnie związane pytanie - http://stackoverflow.com/questions/11419800/sparql-keys-vs-distinct-values ​​ – RobV

Odpowiedz

11

Możesz użyć GROUP BY do grupowania według określonej kolumny, a następnie użyć agregatu SAMPLE(), aby wybrać jedną z wartości z innych kolumn, np.

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 

Więc grupując na ?city masz tylko jeden wiersz za miastem, ponieważ zostały pogrupowane według ?city nie można bezpośrednio wybrać zmienne, które nie są zmienne grupy.

Zamiast tego należy użyć agregatora SAMPLE(), aby wybrać jedną z wartości dla każdej zmiennej innej niż grupa, która ma być użyta w ostatecznych wynikach. To będzie wybrać jedną z wartości ?name i ?pop, aby powrócić jako ?cityName i ?cityPop odpowiednio

+0

Dziękuję bardzo dużo, dokładnie tego szukałem! – drstein