我想使用 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中不可用。有更简单的解决方案吗?
实现此目的的一种方法是将小于或等于某个值的值的数量作为该值的排名。对于较大的数据集,这可能效率低下,因为对于每个值,它都必须检查所有其他值。但它不需要字符串操作。
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 |
---------------------
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)