问题
Do we have a way to make an accumulated sum in SPARQL that is not reduced?
For instance,
SELECT ?p WHERE {
VALUES ?p { 1 1 2 }
}
ORDER BY ?p
would result in 1 2 4, - rather than 4.
回答1:
If you want to calculate accumulated sums in the absense of RDF data ('FROM DUAL'), it is impossible:
- SPARQL list syntax is not allowed in
VALUES, VALUESthemself are unordered.
However, if values are present in RDF data, it is possible to calculate their accumulated sums.
Consider the following example.
Input data
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 .
}
Query
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))
Output
v acc
------------------- ------------------
"1"^^xsd:integer "1"^^xsd:integer
"1"^^xsd:integer "2"^^xsd:integer
"2"^^xsd:integer "4"^^xsd:integer
The values in the example above are ordered explicetely, but it is not very hard to write a query when values are ordered implicitely (as in ABC analysis).
Let us consider another example, which uses Turtle list syntax.
Input data
INSERT DATA {
ex:data ex:values (1 1 2)
}
Query
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))
Output
v acc
------------------- ------------------
"1"^^xsd:integer "1"^^xsd:integer
"1"^^xsd:integer "2"^^xsd:integer
"2"^^xsd:integer "4"^^xsd:integer
来源:https://stackoverflow.com/questions/44440966/accumulated-sum-in-sparql