2017-06-08 17 views
1

SPARQLの累積合計を減らさない方法がありますか?SPARQLの累積合計

例えば、

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

は、1〜2 4をもたらす - なくSPARQLは、RDFクエリ言語である4

+3

私が間違っているとは限りませんが、それはSPARQLクエリでは不可能です。私の視点から見ると、クライアント側のコードはSPARQLがRのようなRDFデータのクエリ言語に過ぎないため、唯一の方法です。 – AKSW

答えて

0

。これらの値が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 

例えばABOの値(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 

あなたはRDFデータの不在に蓄積された合計を計算する(いわば、FROM DUAL)したい場合は、私は怖い、それは不可能です: