带Sparql超时的Wikidata中的模糊实体查询

带Sparql超时的Wikidata中的模糊实体查询,sparql,wikidata,Sparql,Wikidata,我想做一个模糊的ie。。通过在线端点使用Sparql在Wikidata中查找部分或不区分大小写的实体标签。不幸的是,这些返回QueryTimeoutException:查询截止日期已过期。我假设这是因为查询返回的结果太多,无法在Wikidata的1分钟超时时间内通过过滤器运行 以下是具体的查询: def findByFuzzyLabel(self, item_label): qstring = ''' SELECT ?item WHERE { ?i

我想做一个模糊的ie。。通过在线端点使用Sparql在Wikidata中查找部分或不区分大小写的实体标签。不幸的是,这些返回QueryTimeoutException:查询截止日期已过期。我假设这是因为查询返回的结果太多,无法在Wikidata的1分钟超时时间内通过过滤器运行

以下是具体的查询:

def findByFuzzyLabel(self, item_label):
    qstring = '''
        SELECT ?item WHERE {
            ?item rdfs:label ?label .
            FILTER( lcase(str(?label)) = "%s")
        }
        LIMIT 20
        ''' % (item_label)
    results = self.query(qstring)
有没有办法在Wikidata的实体标签上执行部分字符串和/或不区分大小写的标签查找,或者我需要在下载原始数据时离线执行此操作


我正在寻找像Lindbergh这样的标签与Charles Lindbergh匹配,并在某些情况下处理案例不敏感。无论是通过Sparql还是在Python中离线,我们都非常感谢您提供的任何建议。

如果您将过滤器更改为使用contains函数,您可以在线执行此操作

例如:

参考: contains列为可以在SPARQL中使用的XPath函数之一。见:

示例2:使用更多三元组优化结果

PREFIX skos: <http://www.w3.org/2004/02/skos/core#Concept>
SELECT ?item  ?label WHERE {
            ?item rdfs:label ?label .
            ?item rdf:type dbo:Person   #Works with our without this too, also try skos:Category
            FILTER( contains(lcase(?label), 'arles lin' ) && LANGMATCHES(LANG(?label), "en")) 
 }
 LIMIT 20

具体点。TripleStore处理对象,而不是字符串。例如,以下查询工作正常:

SELECT ?item WHERE {
    ?item wdt:P735 wd:Q2958359 .
    ?item rdfs:label ?label .
    FILTER (CONTAINS(LCASE(STR(?label)), "lindbergh"))
}
如果不够具体,则需要全文搜索功能

事实上,Blazegraph使用magic bds:search谓词进行全文搜索,但Wikidata上未启用此功能。 此外,Blazegraph使用magic fts:search谓词进行外部全文搜索。当前实现仅支持Apache Solr。也许支持ElasticSearch相对容易,它在Wikidata中使用,但无论如何,这个功能没有启用。 有一种方法可以以另一种Wikidata magic服务的形式提供全文搜索,但该功能在公共端点上仍然不可用

作为一种变通方法,可以在上使用SQL查询。以下是我对采石场的疑问:

使用wikidatawiki\u p; 描述wb_术语; 选择CONCATQ、term_entity_id作为wikidata_id、term_语言、term_文本、term_搜索键 来自wb_术语 其中,term_type='label'和 下'Lindbergh',下'Charles Lindbergh'中的搜索关键词;
对Quarry的查询时间限制为30分钟。

您现在可以直接从SPARQL使用MediaWiki API,使用文档中的Wikidata magic服务

例如:

SELECT * WHERE {
  SERVICE wikibase:mwapi {
      bd:serviceParam wikibase:api "EntitySearch" .
      bd:serviceParam wikibase:endpoint "www.wikidata.org" .
      bd:serviceParam mwapi:search "cheese" .
      bd:serviceParam mwapi:language "en" .
      ?item wikibase:apiOutputItem mwapi:item .
      ?num wikibase:apiOrdinal true .
  }
  ?item (wdt:P279|wdt:P31) ?type
} ORDER BY ASC(?num) LIMIT 20

与查询中相同的精确字符串匹配(限制为20)不应超时。好的,您有一个小写函数,可能这会阻止使用索引。对于模糊匹配,您通常需要一个全文索引,它还不是SPARQL规范的一部分。作为另一种选择——而不是模糊——REGEX确实允许字符串包含匹配。但同样,这是昂贵的,需要对数据进行完整扫描。另一个好方法是使用Wikidata转储并将其加载到具有全文索引支持的适当的三重存储中,或者可以自己进行索引,例如使用Lucene。@AKSW不过,您不需要正则表达式进行包含匹配。很好用不幸的是,这个查询仍然过于昂贵,它必须对数据进行全面扫描。只有全文索引应该足够有效。删除str typecast使其比原始查询快得多。您最初的问题是关于如何进行不区分大小写的模糊搜索,如果您在dbpedia上尝试contains选项,它会起作用。现在看看优化选项会很有意思…这不是我的查询…我现在对你的查询有一个超时。而且,str不是类型转换!它只返回文本的词汇形式。这是很有用的,因为它不会对完整的文本字符串应用匹配,该字符串还可以由数据类型和/或语言标记组成。好的,也许稍后再试。我在原始答案中添加了另一个sparql查询示例和屏幕截图。。对我来说很好。如果您添加更多可选的三元组(可能与个人、类别等匹配),则速度可能会更快。
SELECT * WHERE {
  SERVICE wikibase:mwapi {
      bd:serviceParam wikibase:api "EntitySearch" .
      bd:serviceParam wikibase:endpoint "www.wikidata.org" .
      bd:serviceParam mwapi:search "cheese" .
      bd:serviceParam mwapi:language "en" .
      ?item wikibase:apiOutputItem mwapi:item .
      ?num wikibase:apiOrdinal true .
  }
  ?item (wdt:P279|wdt:P31) ?type
} ORDER BY ASC(?num) LIMIT 20