我希望有人可以帮助我处理我正在编写的 SPARQL 查询。我可能会弄错一些术语,我不是 SPARQL 专家。
我正在尝试从诺贝尔奖 SPARQL 端点 (data.nobelprize.org/sparql) 获取一些信息,检索对象标签与特定字符串匹配的谓词标签。
例如,如果我搜索一个 objectLabel 包含字符串“Robert Burns Woodward”的对象,我应该会收到许多结果,包括:
predicateLabel, objectLabel "Laureate","Robert Burns Woodward" "LaureateAward","Chemistry 1965, Robert Burns Woodward" "AwardFile","Nobel Lecture Robert Burns Woodward"
I have written the SPARQL below which should work, however it does not retrieve any results:
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT ?predicateLabel ?objectLabel
WHERE
{
?subject ?predicate ?object .
?object rdfs:label ?objectLabel .
?predicate rdfs:label ?predicateLabel .
FILTER contains(?objectLabel, 'Robert Burns Woodward')
}
原因是?谓词 URI 与链接到相应 rdfs:label 属性的 URI 的大小写不同。
例如,谓词
http://data.nobelprize.org/terms/nobelPrize
用于将获奖者与他们所赢得的奖项联系起来。例如:
子:http://data.nobelprize.org/resource/laureate/231
预测:http://data.nobelprize.org/terms/nobelPrize
对象:http://data.nobelprize.org/resource/nobelprize/Chemistry/1965
但是,rdfs:label 链接到
http://data.nobelprize.org/terms/NobelPrize
不是
http://data.nobelprize.org/terms/nobelPrize
请注意两者大小写的区别 - 第二个 URI 在 Nobelprize 中使用小写“n”,而第一个 URI 使用大写 N。
所以我的问题是,SPARQL 中有没有办法使 URI 不区分大小写,以便 http://data.nobelprize.org/terms/NobelPrize将与 http://data.nobelprize.org/terms/nobelPrize 匹配?我知道可以使用 FILTER regex 或 FILTER contains 搜索不区分大小写的字符串,但我不知道 URI 是否可以。
最佳答案
我认为你处理这个问题的方式是错误的。该数据源有两个不同的概念。拼写为 NobelPrize
的资源表示诺贝尔奖的类别,如 the ontology 中所示。 。拼写为 nobelPrize
的资源是另一种资源,即获奖者与特定诺贝尔奖之间的关系。
换句话说:它们是不同的,故意如此,并且您不应该尝试通过不区分大小写的匹配将它们变成相同的东西。
有点奇怪的是,nobelPrize
属性在 SPARQL 端点中没有标签,因为根据本体文件它应该有一个标签。但考虑到它没有标签,您只能返回谓词 URI 本身。您可以选择使用 strafter
剪切命名空间部分来缩短它,如下所示:
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT (strafter(str(?predicate), "http://data.nobelprize.org/terms/") as ?predicateLabel) ?objectLabel
WHERE
{
?subject ?predicate ?object .
?object rdfs:label ?objectLabel .
FILTER contains(?objectLabel, 'Robert Burns Woodward')
}
另一种方法稍微复杂一些,但概念上更简洁,它不是返回谓词的名称,而是返回谓词指向的对象类型的名称:
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT ?objectClassName ?objectLabel
WHERE
{
?subject ?predicate ?object .
?object a ?objectClass .
?objectClass rdfs:label ?objectClassName .
?object rdfs:label ?objectLabel .
FILTER contains(?objectLabel, 'Robert Burns Woodward')
}
关于sparql - SPARQL 中不区分大小写的 URI 匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47846563/