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