string - 使用 SPARQL 查询与字符串的最佳匹配?

标签 string search sparql dbpedia

我有一个电影片名列表,想在 DBpedia 中查找这些片名。对于像“导演”这样的元信息。但是我很难用 SPARQL 识别正确的电影,因为标题有时不完全匹配。

如何使用 SPARQL 从 DBpedia 获得电影标题的最佳匹配?

一些有问题的例子:

  • 我的 list :“死而复生”与 DBpedia:“死而复生”
  • 我的 list :“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 查询与字符串的最佳匹配?

    谢谢!

    最佳答案

    我采用了正则表达式方法 mentioned in the comments并提出了一个效果很好的解决方案,比我能用 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
    

    它并不完美,所以我仍然愿意接受建议。

    关于string - 使用 SPARQL 查询与字符串的最佳匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38671325/

    相关文章:

    javascript - 在 javascript 中,如何在数组中搜索子字符串匹配项

    javascript - JQGrid(搜索输入: true) Bug

    search - 用于在 vim 中进行 inc-search 的 Emacs 样式突出显示

    rdf - 将 SPARQL 查询限制为某种类

    java - 数据导入期间超出 Fuseki GC 开销限制

    c++ - c_str 函数有什么用?

    string - 批处理或 PowerShell : How to get the last word from string?

    c - c中字符串在内存中的表示方式

    python - 如何返回仅对应于特定日期的字符串中分号后的数字?

    sparql - SPARQL查询图中 "values"的范围是什么