这是一个例子:
让我们说我想要一个从未被蒂姆·伯顿(Tim Burton)导演的流行电影名单中的演员名单。
我尝试按照以下步骤进行操作:
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,这意味着他应该被排除在外。
你能帮助我吗?
答案 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