我有这个查询。它匹配任何名称中带有“South”的东西。但我只想要一个foaf:name
完全是“南”的人。
SELECT Distinct ?TypeLabel
WHERE
{
?a foaf:name "South" .
?a rdf:type ?Type .
?Type rdfs:label ?TypeLabel .
}
我有这个查询。它匹配任何名称中带有“South”的东西。但我只想要一个foaf:name
完全是“南”的人。
SELECT Distinct ?TypeLabel
WHERE
{
?a foaf:name "South" .
?a rdf:type ?Type .
?Type rdfs:label ?TypeLabel .
}
有点晚了,但无论如何......我认为这就是你要找的:
SELECT Distinct ?TypeLabel Where {
?a foaf:name ?name .
?a rdf:type ?Type .
?Type rdfs:label ?TypeLabel .
FILTER (?name="South"^^xsd:string)
}
您可以将 FILTER 与 xsd 类型一起使用以限制结果。希望这会有所帮助......干杯!
(打破对此的评论)
问题是数据,而不是您的查询。如果使用以下查询:
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 源自 Wikipedia,提取过程并不完美。这是一个充满不稳定数据的区域,所以不要假设您的查询出错了。
该查询应与文字完全匹配,South
而不是仅包含South
作为子字符串的文字。对于部分匹配,您可以FILTER
使用 eg REGEX()
。从这个意义上说,您的查询引擎已损坏-您正在使用哪个查询引擎?