7

私は英語が下手なので、自分の問題を正式に説明することはできません。例を挙げて説明しましょう。以下の表は、実際には「主語」、「述語」によってグループ化されています。

行が同じ「サブジェクト」である場合、行にセットを定義します。ここで、同じ「述語」が含まれる 2 つのセットを結合し、同じ「述語」の「カウント」を合計し、同じセットを持つ個別のサブジェクトの数をカウントしたいと考えています。

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

したがって、このテーブルから求められるのは 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 を使用してこれらのセットを取得するにはどうすればよいでしょうか?


1 つの解決策は、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

次に、カウントを分離して合計することができます。小さなデータセットでは問題なく動作しますが、非常に時間がかかります。

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

4

1 に答える 1

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

それは動作しますか?

于 2012-06-14T09:00:17.670 に答える