我想使用 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 中不可用。有更简单的解决方案吗?