Wikidata Sparql:如何获得从未由给定人员指导的演员列表?
Wikidata Sparql: how to get a list of actors that where never directed by a given person?
假设我想要一份热门电影列表中从未由蒂姆伯顿执导的演员列表。
我尝试按照以下步骤进行操作:
- Select 蒂姆波顿导演过的所有演员 (sub select)
- Select 流行电影列表中的演员列表(按 imdb id)
- 从第一个 selection 中排除第二个 selection (
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 有一个滤镜,你可以去掉[最后一个],用来突出我在这里解释的内容:)
在此代码中,我有两部电影:暗影(由蒂姆伯顿执导)和指环王 3。在此示例中,克里斯托弗李出现在两部电影中,这意味着他应该被排除在外,因为蒂姆伯顿执导他在黑暗阴影中。
你可以看到他在列表中。
我真的不明白为什么 NOT IN
会因为子 select 而失败。我尝试了 sub Select 请求,我在里面找到了 Christopher Lee,这意味着他应该被排除在外。
如果我没理解错的话,你想要所有在给定电影中表演过但从未在蒂姆伯顿导演的任何电影中表演过的演员。我会使用 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
假设我想要一份热门电影列表中从未由蒂姆伯顿执导的演员列表。
我尝试按照以下步骤进行操作:
- Select 蒂姆波顿导演过的所有演员 (sub select)
- Select 流行电影列表中的演员列表(按 imdb id)
- 从第一个 selection 中排除第二个 selection (
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 有一个滤镜,你可以去掉[最后一个],用来突出我在这里解释的内容:)
在此代码中,我有两部电影:暗影(由蒂姆伯顿执导)和指环王 3。在此示例中,克里斯托弗李出现在两部电影中,这意味着他应该被排除在外,因为蒂姆伯顿执导他在黑暗阴影中。 你可以看到他在列表中。
我真的不明白为什么 NOT IN
会因为子 select 而失败。我尝试了 sub Select 请求,我在里面找到了 Christopher Lee,这意味着他应该被排除在外。
如果我没理解错的话,你想要所有在给定电影中表演过但从未在蒂姆伯顿导演的任何电影中表演过的演员。我会使用 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