我希望有人可以帮助我处理我写的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"
我已经编写了下面的SPARQL,但它不会检索任何结果:
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
用于将获奖者与他们赢得的奖品联系起来。例如:
sub:http://data.nobelprize.org/resource/laureate/231
pred:http://data.nobelprize.org/terms/nobelPrize
obj:http://data.nobelprize.org/resource/nobelprize/Chemistry/1965
但是,rdfs:标签链接到
http://data.nobelprize.org/terms/NobelPrize
不
http://data.nobelprize.org/terms/nobelPrize
注意两者之间的区别 - 第二个URI有一个小写&#39; n&#39;在nobelprize中,第一个使用大写N.
所以我的问题是,SPARQL中是否有一种方法可以使URI不区分大小写,以便http://data.nobelprize.org/terms/NobelPrize与http://data.nobelprize.org/terms/nobelPrize匹配?我知道可以使用FILTER正则表达式或FILTER包含搜索不区分大小写的字符串,但我不知道URI是否可行。
答案 0 :(得分:2)
我认为你以错误的方式接近这一点。该数据源有两个独立的概念。拼写为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')
}