1

2 つのクエリがあります。

クエリ 1:

SELECT DISTINCT ?o COUNT(?o)  
WHERE 
{ ?s1 ?somep1 <predicate_one-uri>. ?s1 ?p ?o}

クエリ 2:

SELECT DISTINCT ?o COUNT(?o)  
WHERE 
{?s2 ?somep2 <predicate_two-uri>.?s2 ?p ?o.}

クエリごとに異なる結果セットが返されます (予想どおり)。これら 2 つのセットの結合を作成する必要があります。私が理解していることから、以下のクエリで必要なセットが得られるはずです。

SELECT DISTINCT ?o COUNT(?o)  
WHERE 
{
 { ?s1 ?somep1 <predicate_one-uri>.?s1 ?p1 ?o}
  UNION 
 {?s2 ?somep2 <predicate_two-uri>.?s2 ?p2 ?o.}
}

問題は、クエリ 1 の結果の一部がユニオン セットにないことと、クエリ 2 の場合はその逆であることです。クエリ 1 とクエリ 2 のすべての結果が組み込まれていないため、ユニオンは正しく機能していません。目的の結果セットを達成するための sparql クエリ。

ただし、次のクエリを作成した場合 (単純に COUNT 関数を削除します):

SELECT DISTINCT ?o
WHERE 
{
{ ?s1 ?somep1 <predicate_one-uri>.?s1 ?p ?o}
 UNION {?s2 ?somep2 <predicate_two-uri>.?s2 ?p ?o.}
}

適切な結果セットが得られます。しかし、変数の頻度も必要です?o

4

2 に答える 2

2

, を削除して、クエリの最後にDISTINCT追加するとうまくいくと思います。GROUP BY ?o

DISTINCT重複を削除するだけです。グループ化やカウント用ではありません。

于 2010-06-06T20:34:35.930 に答える
1

ここでは完全にはわかりませんが、完全に間違っている可能性のある理論があります

理論的には、少なくともSPARQLエンジンでは、明示的なGROUP BYなしで同じクエリで変数とその変数の集計の両方を選択できないため、グループ化を暗示しているように見えるため、クエリは少し混乱します。結果は、使用しているSPARQLエンジン/トリプルストアに依存する可能性がありますか?

暗黙的なグループ化が当てはまる場合、グループ化によってユニオンの両側からの結果がグループ化されるため、期待するほど多くの結果が得られない場合があります。たとえば、クエリ 1 で 10 件の結果が得られ、クエリ 2 で 5 件の結果が得られた場合、ユニオンから取得できる結果の最大数は 15 ですが、グループ化によってユニオンの両側からの結果が結合される可能性があるため、それより少ない場合があります。これを避けるには、クエリの両側で完全に異なる変数名を使用する必要があります。次に例を示します。

SELECT * WHERE { {?s ?p ?o} UNION {?x ?y ?z}}

これにより、次のようなパターンを持つ結果テーブルが得られます。

 ?s | ?p | ?o | ?x | ?y | ?z
-----------------------------
  a |  b |  c |    |    |
    |    |    |  a |  b |  c

それらのいずれかがあなたに関連/有用であるかどうかはわかりません.Triplestore、SPARQLエンジン、API/ライブラリなどでクエリを実行している環境について詳細を提供できる場合は、私/誰かがより良いものを提供できるかもしれません.答え

于 2010-05-05T13:04:49.490 に答える