3

DBpediaに対してSPARQLクエリを使用して、ミュージカルのリストといくつかの関連するプロパティを取得しようとしています。ただし、適切なフィルターを使用しているにもかかわらず(私が知る限り)、結果には多くのミュージカルが複数回含まれています。これが私の質問です:

    PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    PREFIX dbo: <http://dbpedia.org/ontology/>
    PREFIX dbpprop: <http://dbpedia.org/property/>
    SELECT ?label ?abstract ?book ?music ?lyrics
    WHERE { 
        ?play <http://purl.org/dc/terms/subject> <http://dbpedia.org/resource/Category:Broadway_musicals> ;
            rdfs:label ?label ;
            dbo:abstract ?abstract ;
            dbpprop:book ?book ;
            dbpprop:lyrics ?lyrics ;
            dbpprop:music ?music .
        FILTER (LANG(?label) = 'en')    
        FILTER (LANG(?abstract) = 'en')
        FILTER (LANG(?book) = 'en')
        FILTER (LANG(?lyrics) = 'en')
        FILTER (LANG(?music) = 'en')
    }

結果のリストには、多くの重複するエントリがあります。ここにクエリを貼り付ける: DBpedia SPARQL Explorer、「Mama Mia!」で始まることがわかります。リストには重複がたくさんあります。

重複のないユニークな結果を得るために私が欠けているものはありますか?ありがとう!

[ここで「複製」されているのはミュージカルであり、トリプルではないことを明確にするために、glennmcdonaldによって編集されました。]

4

2 に答える 2

5

SPARQLは変数バインディングを返します。「複製」は、投影されたプロパティの倍数のデカルト積です。Mamma Miaには複数の音楽作家と複数の作詞家がいるため、テーブルに列を作ることができる可能性のあるすべての組み合わせを取得できます。

なんて痛いの?「解決策」は、SELECTの代わりにCONSTRUCTを使用し、テーブルの代わりにグラフを取得することです。多分このように:

http://dbpedia.org/snorql/?query=PREFIX+rdfs%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F2000%2F01%2Frdf-schema%23%3E%0D%0A++++ PREFIX + dbo%3A +%3Chttp%3A%2F%2Fdbpedia.org%2Fontology%2F%3E%0D%0A ++++ PREFIX + dbpprop%3A +%3Chttp%3A%2F%2Fdbpedia.org%2Fproperty%2F%3E %0D%0A ++++ CONSTRUCT +%7B%0D%0A ++++++++%3Fplay + rdfs%3Alabel +%3Flabel +%3B%0D%0A ++++++++++++ dbo%3Aabstract +%3Fabstract +%3B%0D %0A ++++++++++++ dbpprop%3Abook +%3Fbook +%3B%0D%0A ++++++++++++ dbpprop%3Alyrics +%3Flyrics +%3B%0D%0A ++ ++++++++++ dbpprop%3Amusic +%3Fmusic +。%0D%0A ++++%7D%0D%0A ++++ WHERE +%7B +%0D%0A ++++++++%3Fplay +%3Chttp%3A%2F%2Fpurl.org% 2Fdc%2Fterms%2Fsubject%3E +%3Chttp%3A%2F%2Fdbpedia。org%2Fresource%2FCategory%3ABroadway_musicals%3E +%3B%0D%0A ++++++++++++ rdfs%3Alabel +%3Flabel +%3B%0D%0A ++++++++++++ dbo%3Aabstract +%3Fabstract +%3B%0D%0A ++++++++++++ dbpprop%3Abook +%3Fbook +%3B%0D%0A ++++++++++++ dbpprop%3Alyrics +% 3Flyrics +%3B%0D%0A ++++++++++++ dbpprop%3Amusic +%3Fmusic +。%0D%0A ++++++++ FILTER +%28LANG%28%3Flabel%29 +%3D +% 27en%27%29 ++++%0D%0A ++++++++ FILTER +%28LANG%28%3Fabstract%29 +%3D +%27en%27%29%0D%0A +++++++ + FILTER +%28LANG%28%3Fbook%29 +%3D +%27en%27%29%0D%0A ++++++++ FILTER +%28LANG%28%3Flyrics%29 +%3D +%27en%27%29% 0D%0A ++++++++ FILTER +%28LANG%28%3Fmusic%29 +%3D +%27en%27%29%0D%0A ++++%7D%0D%0A ++++++++ FILTER +%28LANG%28%3Flabel%29 +%3D +%27en%27%29 ++++%0D%0A ++++++++ FILTER +%28LANG% 28%3Fabstract%29 +%3D +%27en%27%29%0D%0A ++++++++ FILTER +%28LANG%28%3Fbook%29 +%3D +%27en%27%29%0D%0A ++ ++++++ FILTER +%28LANG%28%3Flyrics%29 +%3D +%27en%27%29%0D%0A ++++++++ FILTER +%28LANG%28%3Fmusic%29 +%3D +%27en %27%29%0D%0A ++++%7D%0D%0A ++++++++ FILTER +%28LANG%28%3Flabel%29 +%3D +%27en%27%29 ++++%0D%0A ++++++++ FILTER +%28LANG% 28%3Fabstract%29 +%3D +%27en%27%29%0D%0A ++++++++ FILTER +%28LANG%28%3Fbook%29 +%3D +%27en%27%29%0D%0A ++ ++++++ FILTER +%28LANG%28%3Flyrics%29 +%3D +%27en%27%29%0D%0A ++++++++ FILTER +%28LANG%28%3Fmusic%29 +%3D +%27en %27%29%0D%0A ++++%7D

于 2011-02-28T04:43:14.773 に答える
3

重複は正確に重複していますか?つまり、重複する各結果のすべての変数のすべての値は同一です

その場合は、DISTINCT後にキーワードを追加しSELECTて、SPARQLエンジンに重複するソリューションを破棄させます。

そうでない場合、Glennは完全に正しいです。これは、さまざまなプロパティに複数の値が指定されているため、複数の結果が得られるためです。サブクエリなどで実行できる複雑な回避策がありますがGROUP BY、それらはクエリの効率を低下させる傾向があります。場合によっては、クライアント側で重複を処理する必要があります。

于 2011-02-28T09:58:31.023 に答える