2016-07-30 98 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 

它並不完美,所以我仍然開放提供建議。