我想要检索演员所扮演的所有电影。我不知道如何指定我想要哪个演员(保护中的个人)。下面的代码返回空表。
PREFIX f: <http://imdb.com/movie.owl#>
SELECT ?title
WHERE {
?movie a f:Movie .
?movie f:Title ?title .
?actor a f:Actor .
?actor f:playsIn ?movie .
FILTER(?actor = "Actor_1")
}
答案 0 :(得分:4)
OWL个体由IRI识别,因此,您必须在查询中使用完整或前缀IRI而不是字符串文字:
PREFIX f: <http://imdb.com/movie.owl#>
SELECT ?title
WHERE {
?movie a f:Movie .
?movie f:Title ?title .
?actor a f:Actor .
?actor f:playsIn ?movie .
FILTER(?actor = <http://imdb.com/movie.owl#Actor_1>)
}
正如@Joshua Taylor正确指出的那样,如果支持SPARQL 1.1,您应该使用VALUES
功能,与FILTER
相比,这可能更符合此处的目的:
PREFIX f: <http://imdb.com/movie.owl#>
SELECT ?title
WHERE {
VALUES ?actor { f:Actor_1 }
?movie a f:Movie ;
f:Title ?title .
?actor a f:Actor ;
f:playsIn ?movie .
}
答案 1 :(得分:-1)
在这种情况下,您不需要过滤器。您可以将个人包含在三重模式中:
PREFIX f: <http://imdb.com/movie.owl#>
SELECT DISTINCT ?title
WHERE {
?movie a f:Movie .
?movie f:Title ?title .
?actor a f:Actor .
<http://imdb.com/movie.owl#Actor_1> f:playsIn ?movie .
}
此查询不仅更短,而且在针对更大的数据集运行时具有更好的性能。
当然,如果您声明了前缀,则不需要整个URI:
SELECT DISTINCT ?title
WHERE {
?movie a f:Movie .
?movie f:Title ?title .
?actor a f:Actor .
f:Actor_1 f:playsIn ?movie .
}