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 やisIndexOf
Java に似た機能を持つことですが、私の知る限り、それらは SPARQL 1.1 では利用できません。もっと簡単な解決策はありますか?