7

重複を返す sparql クエリがあり、値の 1 つ (subjectID) のみでそれらをクリーンアップしたい。パラメータの1つだけではなく、選択された値の組み合わせに対して一意の値を見つけるように見えるDISTINCTとは異なります。ここで誰かがグループ化を提案しているのを見ましたが、グループ化の後にすべてのパラメーターをリストする場合にのみ適用できるようです (私の sparql エンドポイントは、たとえば、SELECT の非グループ キー変数: ?occupation に文句を言います)。内部選択を実行しようとしましたが、この特定のクエリでは機能しないようです。クエリ自体に問題がある可能性があります(liveInオプションの値が重複を引き起こしているようです)?

SPARQL の学習曲線の早い段階でリレーショナル DB に十分満足していますが、それ以外の場合は初心者のために明白なことを自由に説明してください! :)

select distinct  
  ?subjectID ?englishName ?sex ?locatedIn15Name 
  ?dob ?dod ?dom ?bornLocationName ?occupation 
  where { 
      ?person a hc:Person ;
      hc:englishName ?englishName ;
      hc:sex ?sex; 
      hc:subjectID ?subjectID; 
       optional { ?person hc:livedIn11 ?livedIn11 .
           ?livedIn11 hc:englishName ?lived11LocationName . 
           ?livedIn11 hc:locatedIn11 ?locatedIn11 .
           ?locatedIn11 hc:englishName ?locatedIn11Name .
           ?locatedIn11 hc:locatedIn15 ?locatedIn15 .
 ?locatedIn15 hc:englishName ?locatedIn15Name .
 } . 
       optional {?person hc:born ?dob } .
       optional {?person hc:dateOfDeath ?dod } .
       optional {?person hc:dateOfMarriage ?dom } .
       optional { ?person hc:bornIn ?bornIn . 
       ?bornIn hc:englishName ?bornLocationName . 
             ?bornIn hc:easting ?easting . 
             ?bornIn hc:northing ?northing } .
       optional {  ?person hc:occupation ?occupation } 
       FILTER regex(?englishName, "^FirstName LastName")
      } 
  GROUP BY 
  ?subjectID ?englishName  ?sex 
   ?locatedIn15Name ?dob ?dod ?dom 
  ?bornLocationName ?occupation 
4

2 に答える 2

12

エラーメッセージについて:

SELECT の非グループ キー変数: ?occupation

SAMPLE()集計を使用すると、これを回避できます。これにより、グループ化するだけ?subjectIDで、残りの変数の値を選択することができますが、他の変数の値を 1 つだけ取得することだけを考えている場合に限ります。

これの簡単な例を次に示します。

SELECT ?subjectID (SAMPLE(?dob) AS ?dateOfBirth)
WHERE
{
  ?person a hc:Person ;
          hc:subjectID ?subjectID .
  OPTIONAL { ?person hc:born ?dob }
}
GROUP BY ?subjectID
于 2012-07-10T18:58:31.993 に答える
9

最初に注意すべきことは、実際にはRDF/SPARQLにはキーのようなものはないということです。グラフをクエリしている?subjectID場合、選択している他の変数の値の可能な組み合わせがいくつかある可能性があります。これは、クエリしているグラフの形状が原因です。おそらく、あなたの人は複数の英語名を持っているか、またはその逆です。同じ英語名を複数の人が共有できます。

SPARQL SELECTクエリは奇妙な獣です。グラフ構造をクエリしますが、結果をフラットテーブルとして表示します(技術的には、一連の変数バインディングですが、同じ結果になります)。基本的にグラフ内のさまざまなパスをたどることで、変数の値のさまざまな組み合わせを見つけることができるため、重複が発生します。

したがって、結果に重複する値が含まれるという事実?subjectIDは避けられません。これは、これらがRDFグラフの観点から、クエリに対する独自のソリューションであるためです。実際に情報を失うことなく結果を除外することはできないため、一般に、破棄する「重複」を正確に知らずに解決策を提供することは困難です主題ごとに1つの可能な英語名のみが必要ですか、それとも1つの可能な英語名が必要ですか。生年月日(データに複数ある場合でも)?

ただし、このような結果をより簡単に処理/処理するためのヒントを次に示します。

まず、変数ORDER BYに句を使用することを選択できます?subjectID。これにより、の値が同じである複数の行が?subjectID表示されますが、それらはすべて順番に並んでいるため、結果をより効率的に処理できます。

別の解決策は、クエリを2つに分割することです。すべての一意のサブジェクト(および、サブジェクトが与えられた場合に一意であることが事前にわかっている他のすべての値)のみを選択する最初のクエリを実行してから、結果を繰り返し処理します。個別のクエリを実行して、個々のsubjectID値ごとに、関心のある他の値を取得します。このソリューションは異端のように聞こえるかもしれませんが(特にSQLのバックグラウンドを持っている場合)、1つの巨大なクエリですべてを実行しようとするよりも実際には迅速で簡単な場合があります。

さらに別の解決策は、RobVによって提案されたものです。SAMPLE特定の変数の集計を使用して、1つの(ランダムな)一意の値を選択するだけです。そのバリエーションは、GROUP_CONCAT可能なすべての値を単一の文字列に連結することによって単一の値を作成する集計を使用することです。

于 2012-07-11T21:21:23.520 に答える