维基数据中的模糊实体查询与Sparql超时

时间:2017-07-09 17:51:02

标签: sparql wikidata

我正在尝试使用Sparql(通过在线端点)在Wikidata中进行模糊(即部分或不区分大小写)实体标签查找。不幸的是,这些返回“ QueryTimeoutException:查询截止日期已过期。”我假设这是因为查询返回了太多结果,无法通过维基数据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离线,都是值得赞赏的。

3 个答案:

答案 0 :(得分:3)

更具体。 Triplestores可以处理事物,而不是字符串。例如,以下查询工作正常:

SELECT ?item WHERE {
    ?item wdt:P735 wd:Q2958359 .
    ?item rdfs:label ?label .
    FILTER (CONTAINS(LCASE(STR(?label)), "lindbergh"))
}

如果无法充分具体,则需要全文搜索功能。

  • 事实上,Blazegraph supports使用魔术bds:search谓词进行全文搜索,但在Wikidata上未启用此功能。
  • 此外,Blazegraph supports使用魔法fts:search谓词进行外部全文搜索。当前实现仅支持Apache Solr。也许支持维基数据中使用的ElasticSearch相对容易,但无论如何,这个工具都没有启用。

有一个task以另一种维基数据魔术服务的形式提供全文搜索,但此功能在公共端点上仍然无法使用。

作为一种解决方法,可以在Quarry上使用SQL查询。 This是我对Quarry的询问:

USE wikidatawiki_p; 
DESCRIBE wb_terms;

SELECT CONCAT("Q", term_entity_id) AS wikidata_id, term_language, term_text, term_search_key
FROM wb_terms
WHERE term_type = 'label' AND
                         term_search_key IN (LOWER('Lindbergh'), LOWER('Charles Lindbergh'));

Quarry的查询时限为30 分钟

答案 1 :(得分:2)

如果您更改过滤器以使用“contains”功能,则可以在线执行此操作。

示例:

 SELECT ?item WHERE {
            ?item rdfs:label ?label .
            FILTER( contains(lcase(?label), 'arles lin' ))
 }
 LIMIT 20

<强>参考: contains被列为可在SPARQL中使用的XPath函数之一。请参阅:https://www.w3.org/2009/sparql/wiki/Feature:FunctionLibrary#XQuery_1.0_and_XPath_2.0_Functions_and_Operators

enter image description here

示例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

答案 2 :(得分:0)

您现在可以使用here中所述的Wikidata魔术服务,直接从SPARQL使用MediaWiki API。

示例:

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