2014-01-29 66 views
1

這是我的實際問題: ?var0是組變量,?var1不是。但每當我嘗試驗證語法,總會有以下錯誤信息:我該如何適應sparql計算?

Non-group key variable in SELECT: ?var1 in expression (sum(?var0)/?var1) 

完整的查詢:

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX cz: <http://www.vs.cs.hs-rm.de/ontostor/SVC#Cluster> 
PREFIX n: <http://www.vs.cs.hs-rm.de/ontostor/SVC#Node> 

SELECT ((SUM(?var0)/?var1) AS ?result) 
WHERE{ 
    ?chain0 rdf:type rdfs:Property . 
    ?chain0 rdfs:domain <http://www.vs.cs.hs-rm.de/ontostor/SVC#Cluster> . 
    ?chain0 rdfs:range <http://www.vs.cs.hs-rm.de/ontostor/SVC#Node> . 

    ?this ?chain0 ?arg0 . 
    ?arg0 n:node_realtime_cpu ?var0 . 
    ?this cz:node_count ?var1 . 
} 

我的問題是如何糾正一些計算,以適應SPARQL語法?

+1

請顯示查詢的其餘部分。如果'?var1'不是一個組變量,那麼當您按照您要分組的任何變量進行分組時,該組具有'?var1'(組中每個結果一個)的值的集合。如果你知道它們都是一樣的,那麼你可以'sample(?var1)',或者除了你正在分組的其他任何東西之外,你可以用'var1'進行分組。 ?var1 ...')。否則,組中的'?var1'可能會有許多不同的值,並且您尚未指定如何將它們聚合爲一個用於計算的值。 –

+1

如果你可以顯示你的查詢的其餘部分,它可能會更清楚你想要做什麼,你會得到更有幫助的迴應。就像現在一樣,沒有足夠的信息來真實地告訴你想要做什麼。 –

回答

1

眼前的問題是,?var1不進行分組,所以修復是簡單地追加

GROUP BY ?var1

在查詢結束。

然而,這是否給你你實際需要的計算是另一回事。

你不太清楚你想要計算什麼,但它看起來好像你試圖確定集羣的平均值node_realtime_cpu。如果是這樣的話,你也許可以通過只使用SPARQL的AVG函數,而不是做你的計算:

SELECT (AVG(?var0) AS ?result) 
WHERE{ 
    ?chain0 rdf:type rdfs:Property . 
    ?chain0 rdfs:domain <http://www.vs.cs.hs-rm.de/ontostor/SVC#Cluster> . 
    ?chain0 rdfs:range <http://www.vs.cs.hs-rm.de/ontostor/SVC#Node> . 

    ?this ?chain0 ?arg0 . 
    ?arg0 n:node_realtime_cpu ?var0 . 
} 
GROUP BY ?this // grouping on the cluster identifier so we get an average _per cluster_ 

另一種替代方案是,讓您的查詢原樣,但集團對兩個變量:

GROUP BY ?this ?var1 

哪一個最好取決於你的數據是什麼樣的,以及你想要計算的是什麼。

+0

感謝您的答案,它現在的作品:) 我不完全知道什麼是要計算。我只需要將一些函數從XML轉換爲SPARQL,因此優先級在語法上是正確的;) – user2983384

+0

不夠公平。順便說一句,如果您覺得我的答案已經幫助您解決了問題,您可以通過「接受」答案(upvote-downvote按鈕下方的勾號)來指出。請參閱[「我應該怎麼做,當有人回答」](http://stackoverflow.com/help/someone-answers)。當然不是必需的,但如果你願意的話也很好:) –