2016-07-30 45 views
1

我有一个电影名称列表,并希望在DBpedia中查看这些信息,例如“导演”等元数据。但是我很难用SPARQL识别正确的电影,因为标题有时不完全匹配。使用SPARQL查询与字符串的最佳匹配?

如何使用SPARQL从DBpedia中为电影标题匹配最佳

一些有问题的例子:

  • 我的清单: “虎胆龙威:用复仇” 与DBpedia中:
  • 我的列表 “终极警探3”: “公共的蜂​​” 与DBpedia中: “公共的蜂​​:一只狗的故事”

我目前的做法是查询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一般的字符串的最佳匹配?

谢谢!

+0

SPARQL端点不是文本搜索引擎,因此,对SPARQL标准中的字符串匹配只有有限的支持。一些三重商店确实有一些扩展的支持,这取决于基础实施。例如。一些三重商店使用Lucene进行文本搜索,而另一些像Virtuoso则有一些内置功能。 – AKSW

+0

DBpedia端点使用Virtuoso,因此您可以查看http://docs.openlinksw.com/virtuoso/rdfsparqlrulefulltext/。例如。 'bif:contains'的索引文字比普通的REGEX快得多。来自文档的一个例子是''foaf:Name?name。 ?名称bif:包含“'rich *'”。',它可以匹配foaf:Name包含单词Rich的所有主题。这将匹配理查德,里奇等 – AKSW

+0

@AKSW感谢与bif提示:包含。我会看看那个。 – dynobo

回答

2

我适应了正则表达式的方法mentioned in the comments,并与非常有效的解决方案,比任何我可以用BIF得到更好的上前:包含:

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 

它并不完美,所以我仍然开放提供建议。