2016-05-06 9 views
3

Скажем, в наборе данных RDF есть набор значений от 0 до 100 (например, процентов). Я хочу подсчитать количество значений в заданном диапазоне, например, 100 - 90 | 90 - 80 | ... | 10 - 0. На выходе я ожидаю, выглядит следующим образом:Агрегация значений в заданном диапазоне (интервал) с помощью SPARQL?

╔════════════════╦════════╗ 
║  Range  ║ Count ║ 
╠════════════════╬════════╣ 
║ 100 >= x < 90 ║ 4521 ║ 
║ 90 >= x < 80 ║ 650 ║ 
║  ...  ║ ... ║ 
║ 10 >= x <= 0 ║ 2650 ║ 
╚════════════════╩════════╝ 

я в настоящее время с помощью SPARQL подзапросов и фильтры, чтобы добраться до решения. Но это кажется обычным прецедентом, и моя интуиция подсказывает мне, что должен быть лучший способ сделать это. Есть ли лучший (или более эффективный) способ достичь этого ответа?

Какое текущее решение выглядит следующим образом.

PREFIX dqv: <http://www.w3.org/ns/dqv#> 
select distinct ?count90_100 ?count80_90 ?count10_0 where { 
?m a dqv:QualityMeasurement . 
{ select count(?m) as ?count90_100 where { ?m dqv:value ?value FILTER (?value > 90 && ?value <= 100) }} 
{ select count(?m) as ?count80_90 where { ?m dqv:value ?value FILTER (?value > 80 && ?value <= 90) }} 
{ select count(?m) as ?count10_0 where { ?m dqv:value ?value FILTER (?value >= 0 && ?value <= 10) }} 
} 

ответ

7

Вы можете использовать значения от блока указать верхние и нижние границы на полигонах и получить «ID» для каждого диапазона «ID». Затем вы можете группироваться в этом диапазоне. Например,

select ?rangeId (count(?x) as ?numMatches) { 
    values (?rangeId ?min ?max) { (0 0 10) 
           (1 10 20) 
           #-- ... 
           (8 80 90) 
           (9 90 100) } 

    #-- query that finds a value for ?x... 

    filter (?min <= ?x && ?x < ?max) 
} 
group by ?rangeId