我们是否有办法在SPARQL中累计一笔未减少的金额?
例如,
SELECT ?p WHERE {
VALUES ?p { 1 1 2 }
}
ORDER BY ?p
会导致1 2 4,而不是4。
答案 0 :(得分:1)
如果你想在没有RDF数据('FROM DUAL
')的情况下计算累积总和,那是不可能的:
VALUES
,{/ li>中为not allowed
VALUES
他们自己是unordered。但是,如果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