dyn*_*obo 5 string search sparql dbpedia
我有一个包含电影标题的列表,想要在DBpedia中查找这些标题以获得诸如“导演”之类的元信息。但是我很难用SPARQL识别正确的电影,因为标题有时不完全匹配。
如何使用SPARQL从DBpedia中获得电影电影的最佳匹配?
一些有问题的例子:
我当前的方法是查询所有电影的DBpedia端点,然后通过检查单个标记(不带标点符号),按标题排序和返回第一个结果来进行过滤。例如:
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
Run Code Online (Sandbox Code Playgroud)
这种方法非常慢,有时也会失败,例如:
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
Run Code Online (Sandbox Code Playgroud)
正确的结果排在第二位:
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
Run Code Online (Sandbox Code Playgroud)
任何想法如何解决这个问题?甚至更好:通常如何使用SPARQL查询与字符串的最佳匹配?
谢谢!
我采用了评论中提到的正则表达式方法,并提出了一个效果很好的解决方案,比我用 bif:contains 得到的任何解决方案都要好:
SELECT ?resource ?title ?match strlen(str(?title)) as ?lenTitle strlen(str(?match)) as ?lenMatch
WHERE {
?resource foaf:name ?title .
?resource rdf:type schema:Movie .
?resource dbo:director ?director .
bind( replace(LCASE(CONCAT('x',?title)), "^x(die)*(?:.*?(hard))*(?:.*?(with))*.*$", "$1$2$3") as ?match )
}
ORDER BY DESC(?lenMatch) ASC(?lenTitle)
LIMIT 5
Run Code Online (Sandbox Code Playgroud)
它并不完美,所以我仍然愿意接受建议。