3

SPARQL を使用して観測のランキングを作成したいと思います。私が持っているとします:

@prefix : <http://example.org#> .

:A :value 60 .
:B :value 23 .
:C :value 89 .
:D :value 34 .

ランキングは、:C = 1 (最高)、:A = 2、:D = 3、:B = 4 である必要があります。これまでは、次のクエリを使用して解決できました。

prefix : <http://example.org#> 
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

SELECT ?x ?v ?ranking { 
 ?x :value ?v .
 { SELECT (GROUP_CONCAT(?x;separator="") as ?ordered) {
    { SELECT ?x {
       ?x :value ?v .
      } ORDER BY DESC(?v)
    }
   }
 }
 BIND (str(?x) as ?xName)
 BIND (strbefore(?ordered,?xName) as ?before) 
 BIND ((strlen(?before) / strlen(?xName)) + 1 as ?ranking)
} ORDER BY ?ranking

ただし、そのクエリは、URI の?x長さが同じ場合にのみ機能します。より良い解決策はstrpos、PHP やisIndexOfJava に似た機能を持つことですが、私の知る限り、それらは SPARQL 1.1 では利用できません。もっと簡単な解決策はありますか?

4

1 に答える 1

6

これを行う 1 つの方法は、値のランキングとして、それ以下の値の数を取ることです。これは、値ごとに他のすべての値をチェックする必要があるため、大規模なデータ セットでは非効率的である可能性があります。ただし、文字列操作は必要ありません。

PREFIX : <http://example.org#>

SELECT ?x ?v (COUNT(*) as ?ranking) WHERE {
  ?x :value ?v .
  [] :value ?u .
  FILTER( ?v <= ?u )
}
GROUP BY ?x ?v
ORDER BY ?ranking

---------------------
| x  | v  | ranking |
=====================
| :C | 89 | 1       |
| :A | 60 | 2       |
| :D | 34 | 3       |
| :B | 23 | 4       |
---------------------
于 2013-06-26T13:06:01.083 に答える