3

人気のある映画のリストの中で、ティム バートンが監督したことのない俳優のリストが必要だとしましょう。

私はこの手順でそれをやろうとしました:

  • ティム・バートンがこれまでに監督したすべての俳優を選択 (サブ選択)
  • 人気のある映画のリストから俳優のリストを選択します (imdb id による)
  • 2 番目の選択で最初の選択からすべてのアクターを除外する ( NOT IN)

これは私が試したコードです(NOT IN失敗、理由はわかりません):

SELECT DISTINCT ?actor ?actorLabel
WHERE {
  ?film wdt:P31 wd:Q11424
        ;wdt:P161 ?actor
        ;wdt:P345 ?imdbId .
  {
    SELECT ?excludeActors
    WHERE {
      ?film wdt:P31 wd:Q11424
            ; wdt:P57 wd:Q56008
            ; wdt:P161 ?excludeActors .
    }
  } .
  FILTER(?actor NOT IN (?excludeActors)) . 
  FILTER(?imdbId = "tt1077368" || ?imdbId = "tt0167260") . 
  SERVICE wikibase:label { bd:serviceParam wikibase:language "fr" }
}

または、このリンクに従ってください

([最後のフィルター] を削除できる Christopher Lee のフィルターがあります。これは、ここで説明する内容を強調するために使用されます:)

このコードには、ダーク シャドウ (ティム バートン監督) とロード オブ ザ リング 3 の 2 つの映画があります。この例では、クリストファー リーは両方の映画に出演しています。彼がリストに載っていることがわかります。

NOT INサブセレクトで失敗する理由が本当にわかりません。サブ Select リクエストを試してみたところ、中に Christopher Lee が見つかりました。これは、彼を除外する必要があることを意味します。

4

1 に答える 1

4

私の理解が正しければ、指定された映画に出演したが、ティム・バートン監督の映画には一度も出演したことのないすべての俳優が必要です。私は使用しますFILTER NOT EXISTS

SELECT DISTINCT ?actor ?actorLabel
WHERE {
  VALUES ?imdbId { "tt1077368" "tt0167260" }
  ?film wdt:P31 wd:Q11424
        ;wdt:P161 ?actor
        ;wdt:P345 ?imdbId .
  FILTER NOT EXISTS {
      [] wdt:P31 wd:Q11424
            ; wdt:P57 wd:Q56008
            ; wdt:P161 ?actor .
  } 
  SERVICE wikibase:label { bd:serviceParam wikibase:language "fr" }
}
LIMIT 100
于 2016-05-18T11:37:54.793 に答える