PREFIX mdb: <http://data.linkedmdb.org/resource/movie/film>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dc: <http://purl.org/dc/terms/>
SELECT ?label?resource WHERE {
?resource mdb:id ?uri .
?resource dc:title ?label .
FILTER regex(?label,'^Batman')
}
这个过滤掉所有这样的蝙蝠侠电影(我已经过滤掉了所有结果,这里只显示了五个):
-----------------------------------------------|
| Label | Resource |
|----------------------------------------------|
| Batman | db:film/2 |
| Batman | db:film/3 |
| Batman & Robin | db:film/4 |
| Batman: Mask of the Phantasm | db:film/737|
| Batman: Mystery of the Batwoman | db:film/974|
-----------------------------------------------|
但是,问题来了。如果我写“Forrest Gump”而不是“Batman”,则查询无法找到任何结果。
但是,如果我将最后一行更改为
?resource dc:title "Forrest Gump".
它在LinkedMDB数据库中找到了这部电影,所以我知道它隐藏在某处。但是当我使用FILTER regex
解决方案时,它不会返回。
我注意到如果我只搜索没有过滤器并只打印数据库中的所有电影,看起来LinkedMDB在2557上有某种LIMIT,这样网页就不会崩溃。看起来FILTER只过滤那些2557部电影。有没有办法检索更多电影?
答案 0 :(得分:1)
SPARQL 1.1引入了更多字符串函数,例如contains,strstarts和strends,它们更加专业化,并且比使用完整的正则表达式快得多。但是,它看起来并不像LinkedMDB资源管理器支持SPARQL 1.1,所以这些在这里没用。
如果你知道电影的确切名称,那么简单地要求它而不是使用正则表达式会更有效率。例如,
SELECT ?resource WHERE {
?resource movie:filmid ?uri .
?resource dc:title "Forrest Gump" .
}
返回电影db:film/38179。