4

複数のグラフでオブジェクトの出現回数をカウントする SPARQL クエリを作成しようとしています。サンプル データと予想される出力は次のとおりです。

名前付きグラフ g1:

@prefix g1: <http://example.com/g1#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
g1:ex1 rdfs:label "a" .
g1:ex2 rdfs:label "a" .
g1:ex3 rdfs:label "b" .
g1:ex3 rdfs:label "d" .

名前付きグラフ g2:

@prefix g2: <http://example.com/g2#> .    
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
g2:ex1 rdfs:label "a" .
g2:ex2 rdfs:label "b" .
g2:ex3 rdfs:label "c" .

SPARQL クエリの期待される出力:

?label ?g1count ?g2count
a      2        1
b      1        1
c      0        1
d      1        0

rdfs:labels の和集合を実行し、発生回数を数えることで、両方のグラフの合計数を取得できます。

prefix g1: <http://example.com/g1#>
prefix g2: <http://example.com/g2#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?label count(?label) as ?count
{
  {
    GRAPH g1: {
      ?s rdfs:label ?label
    }
  } UNION {
    GRAPH g2:
    {
      ?s rdfs:label ?label
    }
  }
}

ここから、各 UNION ブロック内でサブクエリを使用して個々のカウントを取得できると考えましたが、そのようなクエリはおそらく非効率的であることに加えて、期待される結果を得ることができませんでした。

4

2 に答える 2

4

RobVの回答からここでゴルフをしています(コメントするには大きすぎます):

prefix g1: <http://example.com/g1#>
prefix g2: <http://example.com/g2#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?label (count(?s1) as ?g1count) (count(?s2) AS ?g2count)
{
  {
    GRAPH g1: {
      ?s1 rdfs:label ?label
    }
  } UNION {
    GRAPH g2: {
      ?s2 rdfs:label ?label
    }
  }
} group by ?label order by ?label

結果:

---------------------
| label | g1c | g2c |
=====================
| "a"   | 2   | 1   |
| "b"   | 1   | 1   |
| "c"   | 0   | 1   |
| "d"   | 1   | 0   |
---------------------
于 2013-01-22T10:38:35.603 に答える
2

COUNT関数がバインドされていない値を無視し、変数に別の名前を付けるだけであるという事実を利用できます。

prefix g1: <http://example.com/g1#>
prefix g2: <http://example.com/g2#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT (COALESCE(?label, ?label2) AS ?label) (count(?label1) as ?g1count) (count(?label2) AS ?g2count)
{
  {
    GRAPH g1: {
      ?s rdfs:label ?label1
    }
  } UNION {
    GRAPH g2:
    {
      ?s rdfs:label ?label2
    }
  }
}

この関数は、引数から最初の非 null を返すCOALESCEため、実際の値をラベルに結合して単一の変数にするために使用されます。COALESCE

于 2013-01-21T18:39:51.630 に答える