У меня есть список с названиями фильмов и хочу посмотреть их в DBpedia для метаинформации типа «режиссер». Но мне сложно определить правильный фильм с помощью SPARQL, потому что названия иногда точно не совпадают.Запрос для лучшего соответствия строке с SPARQL?
Как я могу получить наилучший матч для названия фильма из DBpedia с использованием SPARQL?
Некоторые проблемные примеры:
- Мой список: "Die Hard: с удвоенной силой" против DBpedia: "Die Hard с удвоенной силой"
- Мой список: "Hachi" против DBpedia: «Hachi: Рассказ собаки»
Мой текущий подход для запроса DBpedia endpoint для всех фильмов, а затем фильтровать по проверке отдельных лексем (без знаков препинания), заказ по названию и возвращает первый результат. Например:
SELECT ?resource ?title ?director WHERE {
?resource foaf:name ?title .
?resource rdf:type schema:Movie .
?resource dbo:director ?director .
FILTER (
contains(lcase(str(?title)), "die") &&
contains(lcase(str(?title)),"hard")
)
}
ORDER BY (?title)
LIMIT 1
Этот подход очень медленно и иногда выходит из строя, например:
SELECT ?resource ?title ?director WHERE {
?resource foaf:name ?title .
?resource rdf:type schema:Movie .
?resource dbo:director ?director .
FILTER (
contains(lcase(str(?title)), "hachi")
)
}
ORDER BY (?title)
LIMIT 10
, где правильный результат находится на втором месте:
resource title director
http://dbpedia.org/resource/Chachi_420 "Chachi 420"@en http://dbpedia.org/resource/Kamal_Haasan
http://dbpedia.org/resource/Hachi:_A_Dog's_Tale "Hachi: A Dog's Tale"@en http://dbpedia.org/resource/Lasse_Hallström
http://dbpedia.org/resource/Hachiko_Monogatari "Hachikō Monogatari"@en http://dbpedia.org/resource/Seijirō_Kōyama
http://dbpedia.org/resource/Thachiledathu_Chundan "Thachiledathu Chundan"@en http://dbpedia.org/resource/Shajoon_Kariyal
Любые идеи, как решить эту проблему проблема? Или еще лучше: Как запросить наилучшие совпадения с строкой с SPARQL в целом?
Спасибо!
Конечные точки SPARQL не являются текстовыми поисковыми системами, поэтому существует ограниченная поддержка соответствия строк в стандартах SPARQL. Некоторые тройные магазины имеют некоторую расширенную поддержку, в зависимости от базовой реализации. Например. некоторые трёхместные магазины используют Lucene для текстового поиска, в то время как другие, такие как Virtuoso, имеют встроенные функции. – AKSW
Конечная точка DBpedia использует Virtuoso, поэтому вы можете посмотреть http://docs.openlinksw.com/virtuoso/rdfsparqlrulefulltext/. Например. 'bif: contains' намного быстрее индексированных литералов, чем обычный REGEX. Примером из документов является '? S foaf: Name? Name. ? name bif: содержит "'rich *'". ', который будет соответствовать всем тем, чьи' foaf: Name' содержат слово Rich. Это будет соответствовать Ричарду, Ричи и т. Д. – AKSW
@AKSW Спасибо за подсказку с bif: contains. Я посмотрю на это. – dynobo