2016-05-06 4 views
3

In einem RDF-Dataset gibt es eine Reihe von Werten, die von 0 bis 100 reichen (z. B. Prozentsätze). Ich möchte die Anzahl der Werte in einem bestimmten Bereich zählen, z. B. 100 - 90 | 90 - 80 | ... | 10 - 0. Der Ausgang Ich erwarte, sieht wie folgt aus:Aggregation von Werten in einem bestimmten Bereich (Intervall) mit SPARQL?

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

Ich bin derzeit mit SPARQL Subqueries und Filter auf die Lösung zu erhalten. Aber das scheint ein häufiger Anwendungsfall zu sein und meine Intuition sagt mir, dass es einen besseren Weg geben sollte, dies zu tun. Gibt es eine bessere (oder effizientere) Möglichkeit, diese Antwort zu erhalten?

Welche aktuelle Lösung sieht wie folgt aus.

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) }} 
} 

Antwort

7

Sie könnten einen Werte Block verwenden, um die oberen und unteren Grenzen für die Bereiche angeben, und eine „id“ für jeden Bereich „id“ zu bekommen. Dann können Sie auf diesem Bereich gruppieren. Zum Beispiel

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 
Verwandte Themen