SPARQL三元组中不区分大小写的匹配项

时间:2017-11-14 11:36:12

标签: sparql

有没有办法让以下查询不区分大小写?

ASK {
    VALUES (?r) { (dbr:Game_of_Thrones) }
        { ?r ?p ?o }
        UNION
        { ?s ?r ?o }
        UNION
        { ?s ?p ?r }
    }

无论我使用dbr:Game_of_Thrones还是dbr:game_of_thrones,都会返回true。

我尝试使用LCASE(),但不允许在三元组中使用。还有另外一种方法吗? 我正在使用DBpedia SPARQL端点(https://dbpedia.org/sparql)。

1 个答案:

答案 0 :(得分:2)

IRI是区分大小写的,原因很充分。如果您真的想解决这个问题,那么您必须在每个FILTER(lcase(str(?tmp)) = lcase(str(?r)))子句中使用UNION

ASK {
    VALUES (?r) { (dbr:Game_of_Thrones) }
        { ?tmp ?p ?o. FILTER(LCASE(STR(tmp)) = LCASE(STR(?r))) }
        UNION
        { ?s ?r ?o. FILTER(LCASE(STR(tmp)) = LCASE(STR(?r))) }
        UNION
        { ?s ?p ?r. FILTER(LCASE(STR(tmp)) = LCASE(STR(?r))) }
    }

注意,这可能导致性能不佳,因为它必须扫描所有三元组并进行字符串比较。

对于模糊搜索,您应该考虑全文索引。

我建议省略第二个UNION条款,只要您正在寻找可能不是模式实体的资源,因此,永远不会出现在RDF三元组的谓词位置。< / p>