SPARQL неправильно группирует мои результаты

У меня есть следующий запрос SPARQL, чтобы получить список стран с наименьшей плотностью населения на км и их президентов (лидеров):

PREFIX type: <http://dbpedia.org/class/yago/>
PREFIX prop: <http://dbpedia.org/property/>

SELECT ?country_name ?populationdensity ?leader
WHERE {
    ?country a dbpedia-owl:Country ;
             rdfs:label ?country_name ;
             prop:populationDensityKm ?populationdensity ;
        dbpedia-owl:leader ?leader .
    FILTER (?populationdensity < 10 && langMatches(lang(?country_name), "en")) .
} 
GROUP BY ?populationdensity
ORDER BY ASC(?populationdensity)
limit 10 

Как видите, я группирую результаты по плотности населения, но получаю результаты, которые включают многочисленные дубликаты плотности населения: Запрос SPARQL

введите здесь описание изображения

Может кто-нибудь сказать мне, что я делаю неправильно? Я предполагаю, что это как-то связано со списком лидеров, где для каждой страны возвращается более одного. Есть ли способ как-то ограничить это до 1 лидера на страну?


person jjj    schedule 24.09.2014    source источник


Ответы (1)


Во-первых, вы должны поместить все переменные, которые вы используете, в предложение group by. В настоящее время Virtuoso плохо анализирует запросы и допускает то, чего не должен. Во-вторых, вам нужно выбрать только одного лидера, если вам все равно, какой из них, вы должны использовать SAMPLE. Если вы хотите их все, используйте group_concat. вариация.

PREFIX type: <http://dbpedia.org/class/yago/>
PREFIX prop: <http://dbpedia.org/property/>

SELECT ?country_name ?populationdensity (sample(?leader) as ?ls)
WHERE {
    ?country a dbpedia-owl:Country ;
             rdfs:label ?country_name ;
             prop:populationDensityKm ?populationdensity ;
        dbpedia-owl:leader ?leader .
    FILTER (?populationdensity < 10 && langMatches(lang(?country_name), "en")) .
} 
GROUP BY ?country_name ?populationdensity
ORDER BY ASC(?populationdensity)
limit 10 

Если вы хотите, чтобы текущий лидер вам нужно заменить строку

dbpedia-owl:leader ?leader .

С это

dbpprop:leaderTitle/dbpprop:incumbent ?leader .
person Jerven    schedule 25.09.2014
comment
Это именно то, что я искал с точки зрения возврата одного результата. Однако он не возвращает правильный результат. Например, нынешним лидером Гренландии является Алека Хаммонд (премьер-министр), а не Микаэла Энгелл (спикер Инатсисартута). Итак, вместо того, чтобы брать первый результат из списка лидеров, есть ли способ вывести правильное имя лидера? Я предполагаю, что это будет возможно только в том случае, если ваш запрос ищет не только лидера, но и конкретно имя человека с титулом лидера: президент или премьер-министр. Я собираюсь принять ваш ответ, но если у вас есть время, посмотрите, возможно ли это. - person jjj; 25.09.2014
comment
В одном запросе это будет работать так, но я не уверен, как реализовать это в моем собственном запросе: SELECT DISTINCT ?x3 WHERE { ?x0 rdf:type dbpedia-owl:Country. ?x0 rdfs:label Argentina@en. ?x0 dbpprop:leaderTitle ?x1. ?x1 dbpprop:действующий ?x2. ?x2 rdfs:метка ?x3. } - person jjj; 25.09.2014