Wikidata Sparql:如何获得一个演员列表,而这些演员从来没有被指定的人导演过?

Wikidata Sparql:如何获得一个演员列表,而这些演员从来没有被指定的人导演过?,sparql,wikidata,Sparql,Wikidata,比如说,我想要一份流行电影名单中从未由蒂姆·伯顿执导过的演员名单 我尝试通过以下步骤来实现: 选择Tim Burton曾经执导过的所有演员(子选择) 从流行电影列表中选择演员列表(通过imdb ID) 从第二个选择中的第一个选择中排除所有参与者(不在) 以下是我尝试过的一个不起作用的代码(不在中的失败,我不知道原因): selectdistinct?actor?actorLabel 在哪里{ ?胶片wdt:P31 wd:Q11424 ;wdt:P161?演员 ;wdt:P345?imdbId

比如说,我想要一份流行电影名单中从未由蒂姆·伯顿执导过的演员名单

我尝试通过以下步骤来实现:

  • 选择Tim Burton曾经执导过的所有演员(子选择)
  • 从流行电影列表中选择演员列表(通过imdb ID)
  • 从第二个选择中的第一个选择中排除所有参与者(
    不在
以下是我尝试过的一个不起作用的代码(不在中的
失败,我不知道原因):

selectdistinct?actor?actorLabel
在哪里{
?胶片wdt:P31 wd:Q11424
;wdt:P161?演员
;wdt:P345?imdbId。
{
选择?排除参与者
在哪里{
?胶片wdt:P31 wd:Q11424
;wdt:P57 wd:Q56008
;wdt:P161?不包括演员。
}
} .
过滤器(?作用子不在(?排除作用子))。
过滤器(?imdbId=“tt1077368”| |?imdbId=“tt0167260”)。
服务wikibase:标签{bd:serviceParam wikibase:语言“fr”}
}
或跟随

(Christopher Lee上有一个过滤器,您可以删除[最后一个],它用于突出显示我在这里解释的内容:)

在这段代码中,我有两部电影:《暗影》(蒂姆·伯顿执导)和《指环王3》。在这个例子中,克里斯托弗·李出现在两部电影中,这意味着他应该被排除在外,因为蒂姆·伯顿在《暗影》中导演了他。 你可以看到他在名单上


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

如果我理解正确,您希望所有演员都在给定的电影中表演,但从未在Tim Burton导演的任何电影中表演过。我将使用
过滤器不存在

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

你完全理解了,给了我正确的答案,谢谢!这看起来是可行的,但我建议使用
值{“tt1077368”“tt0167260”}
而不是第一个过滤器。谢谢Joshua!这个技巧将允许我为我的请求赢得一些空间!(我有很多imdb ID,HTTP Get请求的大小是有限的。)你们当中有人知道如何避免在没有标签的情况下保存结果吗?有时(不是在这种情况下)我有结果,其中?varLabel将等于id(Q11…11)。我添加了一个有效的过滤器,它是rdfs:label?id_标签过滤器(lang(?id_label)=“fr”),但也许还有另一种方法?我还需要知道如何查找不区分大小写的文本,例如:?label rdfs:label“christopher lee”@en(它不起作用)我编辑答案是为了使用值而不是过滤器。至于标签,我想不出别的办法。对于不区分大小写的文本比较,可以将标签绑定到变量,使用使其小写,并在筛选器中进行比较。然而,这种查询可能会变得非常慢。是的,我找到了只在过滤器上工作的LCASE,但使用这种技术,我总是有查询过期的问题。