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,但使用这种技术,我总是有查询过期的问题。