10

基本上我有一个有效的查询(如下所示)。但是,我希望我的搜索在标签是实际字符串“yago”而不是包含字符串“yago”的地方更精确。如果可能的话,我想尝试不使用过滤器,因为我认为使用 FILTER 会使查询 DBpedia 花费更长的时间。

SELECT ?uri ?label 
WHERE {
?uri rdfs:label ?label.
?label bif:contains "'yago'" .
}
4

2 回答 2

16

如果您想在没有过滤器的情况下执行以下操作,您可以尝试执行以下操作:

SELECT ?uri ?label
WHERE {
?uri rdfs:label "Yago"@en .
?uri rdfs:label ?label
}

我不确定它是否比带有过滤器的相应查询快得多:

SELECT ?uri ?label
WHERE {
?uri rdfs:label ?label .
filter(?label="Yago"@en)
}
于 2012-01-21T00:50:55.593 回答
6

对原始响应的关键更正。如果您有完全匹配的语言标签,那么以下内容将起作用:

SELECT ?uri ?label
WHERE {
   ?uri rdfs:label "Yago"@en .
}

但是,如果完全匹配可能没有使用您想要的,SPARQL 支持标准正则表达式:

SELECT ?uri ?label
WHERE {
   ?uri rdfs:label ?label .
   FILTER regex(str(?label), "yago", "i")
}

...无论字符大小写如何,都会匹配字符串,您可以玩通常的正则表达式游戏来获得所需的字符串匹配。(当然,其他字符串函数,如 STRSTARTS 和 STRENDS,如果满足所需的匹配条件,效率会更高。)

于 2016-03-24T02:51:10.567 回答