如何在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)
}