1

我正在使用此查询来搜索包含单词“Medi”的所有标签

select distinct ?label where 
{ 
    ?concept rdfs:label  ?label 
    filter contains(?label,"Medi") 
    filter(langMatches(lang(?label),"en")) 
}

但是,一旦我将术语从“Medi”更改为“Medicare”,它就不起作用并超时。我如何让它与像 Medicare 这样的较长单词一起使用,即提取所有包含 Medicare 一词的标签。

4

1 回答 1

2

您的查询必须遍历 DBpedia 中的所有标签 - 这是一个相当大的数字 - 然后应用字符串包含检查。这确实很贵。

即使是计数查询也会导致“估计超时错误”:

select count(?label) where 
{ 
    ?concept rdfs:label  ?label 
    filter(regex(str(?label),"Medi")) 
    filter(langMatches(lang(?label),"en")) 
}

两种选择:

  1. Virtuoso 有一些全文搜索支持:

    SELECT DISTINCT ?label WHERE { 
      ?concept rdfs:label ?label .
      ?label bif:contains "Medicare"
      FILTER(langMatches(lang(?label),"en"))
    }
    
  2. 由于公共 DBpedia 端点是一个共享端点,因此解决方案是将 DBpedia 数据集加载到您自己的三重存储中,例如 Virtuoso。在那里你可以调整最大值。估计的执行超时参数。
于 2017-05-12T16:23:23.180 回答