Sparql 使用过滤器选择个人

Sparql use filter with selecting invidual

我想检索演员出演的所有电影。我不确定如何指定我想要结果的演员(个人)。下面的代码 returns 为空 table.

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")
}

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 .

}

在这种情况下您不需要过滤器。您可以将个人包含在三重模式中:

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 .
}