令人困惑的可选 - 消失的记录

时间:2012-03-21 19:14:48

标签: sparql dbpedia optional

我在SPARQL语句中使用OPTIONAL短语时遇到问题。当我像这样查询dbpedia时:

CONSTRUCT { ?guitarist rdfs:label ?name . ?guitarist rdfs:comment ?desc . ?guitarist dbpprop:placeOfBirth ?placebirth }
WHERE {
  ?guitarist dbpprop:wikiPageUsesTemplate <http://dbpedia.org/resource/Template:Infobox_musical_artist> . 
  ?guitarist rdfs:label ?name .
  ?guitarist rdfs:comment ?desc .
  ?guitarist dbpprop:placeOfBirth ?placebirth .
  FILTER ( lang(?name) = "en" && lang(?desc) = "en" )
} 

罗杰沃特斯出生地和其他数据被退回。但当我把它变成这个时,所有Roger_Waters记录都丢失了:

CONSTRUCT { ?guitarist rdfs:label ?name . ?guitarist rdfs:comment ?desc . ?guitarist dbpprop:placeOfBirth ?placebirth }
WHERE {
  ?guitarist dbpprop:wikiPageUsesTemplate <http://dbpedia.org/resource/Template:Infobox_musical_artist> . 
  ?guitarist rdfs:label ?name .
  ?guitarist rdfs:comment ?desc .
  OPTIONAL { ?guitarist dbpprop:placeOfBirth ?placebirth }
  FILTER ( lang(?name) = "en" && lang(?desc) = "en" )
}

我做错了什么 - 我认为应用OPTIONAL后不会遗漏完整的记录...

1 个答案:

答案 0 :(得分:4)

DBpedia端点返回它认为过于昂贵的查询的部分结果。

使用这两个查询执行SELECT COUNT(*) WHERE …,看起来第一个查询应返回8k结果,第二个查询应返回60k结果。你的CONSTRUCT每个结果应生成2-3个三元组,因此第一个查询应该产生16-24k三元组,第二个查询应该产生120-180k三元组。当我运行查询时,我从任一查询中得到了奇怪的10001三元组数。很明显,结果被截断了。

尝试LIMITOFFSET(可能带有ORDER BY)。