2012-06-14 35 views
7

由於我的英文不好,我無法正式描述我的問題;讓我用一個例子來講述它。 下面的表格實際上是由'subject','predicate'分組的。在SPARQL中結合多組行數

我們在行上定義一個集合,如果它們是相同的'主題'。現在,我想要將任意兩個集合組合在一起,如果它們包含相同的謂詞,將相同「謂詞」的「計數」相加,並計算具有相同集合的不同主題的數量。

subject predicate count 
----------------------------- 
s1   p1   1 
s1   p2   2 
s2   p1   3 
s3   p1   2 
s3   p2   2 

因此,所從該表中希望是兩組:

{2, (p1, 3), (p2, 4)}, 
{1, (p1,3)} 

其中在第一組,2表示有兩個受試者(S1和S3)具有該組; (p1,3)是來自(s1,p1,1)和(s3,p1,2)的和。

那麼如何檢索這些集合並將它們存儲在Java中?

  • 我該如何使用SPARQL做到這一點?或者,首先將這些三元組存儲在Java中,然後如何使用Java獲得這些集合?


一種解決方案可能是Concat的謂詞和計數,

SELECT (COUNT(?s) AS ?distinct) 
?propset 
(group_concat(?count; separator = \"\\t\") AS ?counts) 
{ 
    SELECT ?s 
    (group_concat(?p; separator = \" \") AS ?propset) 
    (group_concat(?c; separator = \" \") AS ?count 
    { 
     ?s ?p ?c   
    } GROUP BY ?s ORDER BY ?s 
} GROUP BY ?propset ORDER BY ?propset 

然後計數可以分離,再總結。 它在小數據集上工作正常,但非常耗時。

我想我會放棄這個奇怪的問題。 非常感謝您的回答。

回答

9

讓我們先從

select ?predicate (sum(?count) as ?totalcount) 
{ 
    ?subject ?predicate ?count 
} 
group by ?predicate 

這是基本的一點,但分組是不正確的(現在的澄清)。

分組變量應該是這樣的(希望這是正確的語法):

select ?subject (group_concat(distinct ?p ; separator = ",") AS ?propset) 
{ 
    ?subject ?p ?c 
} 
group by ?subject 

我希望給:

subject propset 
------------------ 
s1   "p1,p2" 
s2   "p1" 
s3   "p1,p2" 

所以最終的查詢應該是:

select ?predicate (sum(?count) as ?totalcount) 
{ 
    ?subject ?predicate ?count . 
    { 
     select ?subject (group_concat(distinct ?p ; separator = ",") AS ?propset) 
     { 
      ?subject ?p ?c 
     } 
     group by ?subject 
    } 
} 
group by ?propset ?predicate 

這是否行得通?

+0

是的我的意思是's1和s3具有相同的組'。對於錯字感到抱歉,我修改了它(並且改變了s2的謂詞值使其更加清晰)。但是,我想要的結果是'套集'。兩個集合{p1,p2}和{p1}不能組合,因爲它們不同。因此,我們不僅要總結每個相同謂詞的價值。謝謝你的回答:) – bobharris

+0

啊,明白了。這可能很難,但我已經添加了第二遍。 – user205512

+0

它幾乎接近我想要的:)但它繼續運行,似乎它不會給任何結果。此外,如果這個查詢成功了,我怎樣才能從結果表中檢索這些集合?我只能看到結果表包含兩列,但沒有提供關於這些集合的信息。對於結果,他們將被存儲在Java中,所以...實際上我只是想要這些結果。再次感謝你。 – bobharris