3

假设我想要一份热门电影列表中从未由 Tim Burton 执导的演员列表。

我尝试通过以下步骤来做到这一点:

  • 选择蒂姆·伯顿导演的所有演员(子选择)
  • 从热门电影列表中选择演员列表(通过 imdb ids)
  • 在第二个选择中从第一个选择中排除所有演员 ( 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 上有一个过滤器,您可以删除 [最后一个],它用于突出我在这里解释的内容:)

在这段代码中,我有两部电影:Dark Shadows(由 Tim Burton 导演)和 The Lord of the Rings 3。在这个例子中,Christopher Lee 出现在两部电影中,这意味着他应该被排除在外,因为 Tim Burton 导演了他在 Dark Shadows 中。您可以在列表中看到他。

我真的不明白为什么NOT IN子选择失败。我尝试了 sub 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 回答