Sparql使用filter选择invidual

时间:2017-04-17 12:25:36

标签: sparql protege

我想要检索演员所扮演的所有电影。我不知道如何指定我想要哪个演员(保护中的个人)。下面的代码返回空表。

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

2 个答案:

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