我正在尝试使用DBpedia SPARQL endpoint,我注意到使用UNION或EXISTS过滤器的类似查询之间存在差异。
SELECT (COUNT(?w1) as ?nbWriter) WHERE {
?w1 a dbo:Writer;
dbo:spouse ?w2 .
FILTER ( EXISTS {?w2 a dbo:Writer} || EXISTS {?w2 a yago:AmericanNovelists.} )
}
生成结果nbWriters=371
SELECT (COUNT(?w1) as ?nbWriter) WHERE {
?w1 a dbo:Writer;
dbo:spouse ?w2 .
{?w2 a dbo:Writer.}
UNION
{?w2 a yago:AmericanNovelists.}
}
生成结果nbWriters=414
为什么这两个查询之间存在差异?它们不相同(参见上一个问题和答案Proper way to add OR clause to SPARQL query)?
答案 0 :(得分:2)
第二个查询不计算不同的编写者。例如,它计算Robert Lowell四次,因为:
但是第一个查询也是不正确的,因为罗伯特·洛厄尔三次,因为:
在任一查询中使用DISTINCT
都会给出正确答案(364):
SELECT (COUNT(DISTINCT ?w1) as ?nbWriter)
通常,要查找此类查询中出错的原因,请列出所有结果,而不是仅计算它们。