如何在SPARQL中匹配精确的字符串文本?

如何在SPARQL中匹配精确的字符串文本?,sparql,Sparql,我有这个疑问。它匹配任何名字中有“南方”的东西。但我只想要其foaf:name正是“南方”的那个 该查询应该完全匹配文本South,而不是仅包含South作为子字符串的文本。对于部分匹配,您可以使用REGEX()等工具进入FILTER。从这个意义上说,您的查询引擎被破坏了-您正在使用哪个查询引擎?(为此中断注释) 数据问题 问题在于数据,而不是您的查询。如果使用以下查询: SELECT DISTINCT ?a WHERE { ?a foaf:name "Imran Khan" .

我有这个疑问。它匹配任何名字中有“南方”的东西。但我只想要其
foaf:name
正是“南方”的那个


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

(为此中断注释)

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

SELECT DISTINCT ?a 
WHERE { 
    ?a foaf:name "Imran Khan" . 
}
你会发现(正如你所说)“伊姆兰·汗·尼亚齐”。 但查看的dbpedia条目,您将看到:

foaf:name "Imran Khan Niazy"
foaf:name "Imran Khan"
这是因为RDF允许重复使用属性

原因 《南方》也发行了同样的专辑(专辑、艺术家和奇怪的《南方卢顿》)。在这些情况下,为了正确或消除歧义,既有熟悉的名字(“伊姆兰·汗”,“南”),也有更精确的名字(“伊姆兰·汗·尼亚齐”,“南(专辑)”)

决议 如果您想要更精确的匹配,请尝试添加类型(例如相册)

当心
请注意,DBpedia源于Wikipedia,提取过程并不完美。这是一个数据不可靠的区域,所以不要假设您的查询出错。

有点晚了,但无论如何。。。我想这就是你想要的:

SELECT Distinct ?TypeLabel Where { 
?a foaf:name ?name . 
?a rdf:type ?Type . 
?Type rdfs:label ?TypeLabel . 
FILTER (?name="South"^^xsd:string)
}
您可以将过滤器与xsd类型一起使用,以限制结果。 希望这有助于。。。
干杯

我正在使用。如果我们使用正则表达式,它就会崩溃。给定的查询不完全匹配。尝试“Imran Khan”而不是“South”,并显示匹配的foaf:名称,它还将返回类似“Imran Khan Niazy”的结果.由于这是DBPedia,它在Virtuoso的引擎盖下运行,他们毫无疑问打开了一些自由文本搜索功能-这可能不是标准的SPARQL行为,但如果我想按类型过滤,Virtuoso的SPARQL实现并不完全是标准的。。我必须在哪一行插入类型(类名)?一个rdf:类型?类型。如果我的类的类型是Building:?a rdf:type?Building,会是这样吗?对于同一个查询,我得到[没有结果]的原因是什么
SELECT Distinct ?TypeLabel Where { 
?a foaf:name ?name . 
?a rdf:type ?Type . 
?Type rdfs:label ?TypeLabel . 
FILTER (?name="South"^^xsd:string)
}