2013-09-13 1 views
2

Я немного смущен здесь. У меня есть следующий запрос SPARQL, который блестяще работает против LinkedMDB explorer.LinkedMDB Запрос SPARQL

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 имеет своего рода LIMIT на 2557, так что веб-страница не будет разбиваться. И похоже, что FILTER фильтрует только те 2557 фильмов. Есть ли способ получить больше фильмов?

+0

Ваша проблема воспроизводима и не похожа на проблему с вашей стороны. Я не вижу ни одного списка рассылки поддержки на своем веб-сайте, но вы можете попробовать отправить адрес электронной почты администратора по адресу [email protected] –

ответ

1

SPARQL 1.1 содержит более строковые функции, такие как contains, strstarts и strends, которые намного более специализированы и могут быть намного быстрее, чем использование полномасштабного регулярного выражения. Однако это не похоже на то, что проводник LinkedMDB поддерживает SPARQL 1.1, поэтому они не полезны здесь.

Если вы знаете точное название фильма, будет гораздо эффективнее просто запросить его вместо использования регулярных выражений. НАПРИМЕР,

SELECT ?resource WHERE { 
    ?resource movie:filmid ?uri . 
    ?resource dc:title "Forrest Gump" . 
} 

SPARQL Results

возвращает фильм db:film/38179.

+0

Спасибо за ответ. Проблема в том, что мы не знаем точного имени. В разрабатываемом нами приложении используется «окно поиска», в котором пользователь может искать фильм. Мы не можем ожидать, что пользователь узнает полное имя фильма. – user2775969

+0

Хм, да, это усложнит ситуацию. И я могу воспроизвести проблему, о которой вы говорите. Кажется, что на их месте происходит что-то странное. Если вы используете 'regex filter (? Title,"^For ")', вы даже получите несколько фильмов, начинающихся с 'For', но не Forrest Gump. –

+0

Да. Бьюсь об заклад, те фильмы, которые вы получаете, это те, которые вы получите в списке, если вы просто печатаете фильмы «все» (2557) в базе данных. Я пробовал с несколькими фильмами, и он находит всех напечатанных 2557, но не всех. Позволяет надеяться, что кто-нибудь знает решение, или, может быть, это просто ужасная ошибка! :) – user2775969

 Смежные вопросы

  • Нет связанных вопросов^_^