SPARQL

时间:2017-12-16 14:15:43

标签: sparql rdf rdfs

我希望有人可以帮助我处理我写的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/NobelPrizehttp://data.nobelprize.org/terms/nobelPrize匹配?我知道可以使用FILTER正则表达式或FILTER包含搜索不区分大小写的字符串,但我不知道URI是否可行。

1 个答案:

答案 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') 
}