我有点糊涂了。我有以下SPARQL查询,它可以很好地处理LinkedMDB explorer。
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,这样网页就不会崩溃。看起来过滤器只过滤了这2557部电影。有没有办法检索更多的电影?
发布于 2013-09-13 21:26:16
SPARQL1.1引入了更多的字符串函数,比如contains、strstarts和strends,它们比使用完整的正则表达式要专业得多,速度也快得多。然而,看起来LinkedMDB资源管理器还不支持SPARQL1.1,所以这些在这里没有用处。
如果您知道电影的确切名称,那么简单地请求它将比使用正则表达式效率高得多。例如,
SELECT ?resource WHERE {
?resource movie:filmid ?uri .
?resource dc:title "Forrest Gump" .
}SPARQL Results
返回胶片db:film/38179。
https://stackoverflow.com/questions/18783869
复制相似问题