SPARQL中的累计和 [英] Accumulated sum in SPARQL

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

问题描述

我们有没有办法使SPARQL中的累计和不减少?

例如

SELECT ?p WHERE {
  VALUES ?p { 1 1 2 }
}
ORDER BY ?p

将导致%1%2%4,-而不是%4。

推荐答案

如果要计算没有rdf数据的累计和(‘FROM DUAL’),不可能:


但是,如果RDF数据中存在值,则可以计算其累计和。

考虑以下示例。

输入数据

INSERT DATA {
  ex:st ex:order "1"^^xsd:integer ;
        ex:value "1"^^xsd:integer .     
  ex:nd ex:order "2"^^xsd:integer ;
        ex:value "1"^^xsd:integer .
  ex:rd ex:order "3"^^xsd:integer ;
        ex:value "2"^^xsd:integer .
}

查询

SELECT
(SAMPLE(?v1) AS ?v)
(SUM(?v2) AS ?acc)
WHERE {
  ?e1 ex:order ?o1 ; ex:value ?v1 .
  ?e2 ex:order ?o2 ; ex:value ?v2 .
  FILTER (?o1 >= ?o2)
} GROUP BY ?e1 ORDER BY ASC(SAMPLE(?o1))

输出

  v                   acc               
 ------------------- ------------------ 
  "1"^^xsd:integer    "1"^^xsd:integer  
  "1"^^xsd:integer    "2"^^xsd:integer  
  "2"^^xsd:integer    "4"^^xsd:integer  

上例中的值是显式排序的,但是当值是隐式排序时(如ABC分析),编写查询并不是很困难。


让我们考虑另一个示例,它使用Turtle list syntax

输入数据

INSERT DATA {
  ex:data ex:values (1 1 2)
}

查询

SELECT
(SAMPLE(?v2) AS ?v)
(SUM(?v1) AS ?acc)
WHERE { 
  ex:data ex:values/rdf:rest* ?e1 .
                              ?e1 rdf:first ?v1 .
                              ?e1 rdf:rest* ?e2 .
                              ?e2 rdf:first ?v2 .
} GROUP BY (?e2) ORDER BY(COUNT(?e1))

输出

  v                   acc               
 ------------------- ------------------ 
  "1"^^xsd:integer    "1"^^xsd:integer  
  "1"^^xsd:integer    "2"^^xsd:integer  
  "2"^^xsd:integer    "4"^^xsd:integer  

这篇关于SPARQL中的累计和的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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