2012-06-14 9 views
7

私は英語が正しくないため正式に問題を記述できません。私は例を使ってそれを教えてください。 以下の表は、実際には「件名」、「述語」によってグループ化されています。SPARQLで複数の行セットを結合する

同じ「件名」の場合は、行にセットを定義します。今度は、同じ「述語」を含み、同じ「述語」の「数」を合計し、同じ集合を持つ別個の主題の数を数えれば、2つの集合を結合したいと思う。

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本のセットを有する2人の被験者(S1とS3)があることを示し; (p1,3)は(s1、p1,1)と(s3、p1,2)の合計です。

これらのセットを取得してJavaに保存するにはどうすればよいですか?

  • 私はSPARQLを使ってどのようにすることができますか?

  • または、これらのトリプルをJavaで保存してから、Javaを使用してこれらのセットを取得するにはどうすればよいですか?


一つの解決策は、その後数は合計その後、分離することができ述語とカウント、

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 

をCONCATされる可能性があります。 小さなデータセットではうまく動作しますが、時間がかかります。

私はこの奇妙な問題をあきらめるだろうと思います。 ありがとうございます。

答えて

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}の2つのセットは、異なるために組み合わせることはできません。したがって、すべての同じ述語の値を合計するだけではありません。お返事ありがとうございます:) – bobharris

+0

ああ、それを得ました。それは難しいかもしれませんが、私は2回目のパスを追加しました。 – user205512

+0

それは私が欲しいものに近いです:)しかし、それは走っていて、何の結果も与えないようです。また、このクエリが成功した場合、結果のテーブルからこれらのセットを取得するにはどうすればよいですか?私は結果の表に2つの列が含まれていることがわかりますが、セットに関する情報はありません。結果として、それらはJavaに格納されるので、実際にはこれらの結果が必要です。ありがとうございました。 – bobharris

関連する問題