如何匹配SPARQL中的确切字符串文字?

时间:2010-04-07 10:47:04

标签: sparql

我有这个查询。它匹配名称中包含“South”的任何内容。但我只想要那个foaf:name正是“南方”的人。

SELECT Distinct ?TypeLabel 
WHERE
{
    ?a     foaf:name   "South" .
    ?a     rdf:type    ?Type .
    ?Type  rdfs:label  ?TypeLabel .
}

3 个答案:

答案 0 :(得分:5)

有点迟了但无论如何......我认为这就是你要找的东西:

SELECT Distinct ?TypeLabel Where { 
?a foaf:name ?name . 
?a rdf:type ?Type . 
?Type rdfs:label ?TypeLabel . 
FILTER (?name="South"^^xsd:string)
}

您可以将FILTER与xsd类型一起使用以限制结果。 希望这可以帮助... 干杯!

答案 1 :(得分:4)

(打破对此的评论)

数据问题

问题是数据,而不是您的查询。如果使用以下查询:

SELECT DISTINCT ?a 
WHERE { 
    ?a foaf:name "Imran Khan" . 
}

你发现(正如你所说)“Imran Khan Niazy”。 但是查看Imran Khan的dbpedia条目,您会看到两者:

foaf:name "Imran Khan Niazy"
foaf:name "Imran Khan"

这是因为RDF允许重复使用属性。

原因

“南方”有同样的问题(专辑,艺术家和奇怪的'南卢顿')。出于正确性或消除歧义的目的,这些是熟悉的名称(“Imran Khan”,“South”)和更精确的名称(“Imran Khan Niazy”,“South(album)”)的情况。

分辨率

如果您想要更精确的匹配,请尝试为相册添加类型(例如http://dbpedia.org/ontology/MusicalWork)。

当心

请注意,DBpedia来自维基百科,并且提取过程并不完美。这是一个存在数据不稳定的区域,因此不要认为您的查询出错了。

答案 2 :(得分:3)

该查询应该与文字South完全匹配,而不是仅包含South作为子字符串的文字。对于部分匹配,您可以转到FILTER,例如REGEX()。从这个意义上说,您的查询引擎已被破坏 - 您正在使用哪个查询引擎?