如何对SPARQL中的值进行排名? [英] How to rank values in SPARQL?

查看:12
本文介绍了如何对SPARQL中的值进行排名?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用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
但是,仅当?x的URI具有相同长度时,该查询才有效。更好的解决方案是拥有一个类似于PHP中的strpos或Java中的isIndexOf的函数,但据我所知,它们在SPARQL1.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       |
---------------------

这篇关于如何对SPARQL中的值进行排名?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆