我在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后不会遗漏完整的记录...
答案 0 :(得分:4)
DBpedia端点返回它认为过于昂贵的查询的部分结果。
使用这两个查询执行SELECT COUNT(*) WHERE …
,看起来第一个查询应返回8k结果,第二个查询应返回60k结果。你的CONSTRUCT
每个结果应生成2-3个三元组,因此第一个查询应该产生16-24k三元组,第二个查询应该产生120-180k三元组。当我运行查询时,我从任一查询中得到了奇怪的10001三元组数。很明显,结果被截断了。
尝试LIMIT
和OFFSET
(可能带有ORDER BY
)。