Wikidata Sparql如何获取一个从未由某个人指导的演员列表?

时间:2016-05-18 09:34:28

标签: sparql wikidata wikidata-api

这是一个例子:

让我们说我想要一个从未被蒂姆·伯顿(Tim Burton)导演的流行电影名单中的演员名单。

我尝试按照以下步骤进行操作:

  • 选择蒂姆伯顿所指导的所有演员(子选择)
  • 从热门电影列表中选择一个演员列表(通过imdb ID)
  • 排除第二个选区(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" }
}

或关注this link

(Christopher Lee有一个过滤器,你可以删除[last one],它用于突出我在这里解释的内容:)

在这段代码中我有两部电影:Dark Shadows(由Tim Burton执导)和The Lord of the Rings 3.在这个例子中,Christopher Lee出现在两部电影中,这意味着他应该被排除在Tim Burton指导他之后黑暗的阴影。 你可以在列表中看到他的名字。

我真的不明白为什么NOT IN因子选择而失败。我尝试了Sub Select请求,我发现里面有Christopher Lee,这意味着他应该被排除在外。

你能帮助我吗?

1 个答案:

答案 0 :(得分: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