SPARQL 查询中的 UNION 和 EXISTS 过滤器有什么区别

What is the difference between UNION and EXISTS filters in a SPARQL query

我正在试验 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)?

第二个查询不计算 distinct 位作者。例如,它计数 Robert Lowell 四次,因为:

  1. 他的配偶Lady Caroline Blackwood是一位作家
  2. 他的配偶Jean Stafford是一位作家
  3. 他的配偶Jean Stafford是美国小说家
  4. 他的配偶Elizabeth Hardwick是美国小说家

但是第一个查询也是错误的,算了3次Robert Lowell,因为:

  1. 他的配偶卡罗琳·布莱克伍德夫人是一位作家
  2. 他的配偶让·斯塔福德是一位作家和美国小说家
  3. 他的配偶伊丽莎白·哈德威克是美国小说家

在任一查询中使用 DISTINCT 将为您提供正确答案 (364):

SELECT (COUNT(DISTINCT ?w1) as ?nbWriter)

一般来说,要找出此类查询中错误的原因,请列出所有结果,而不是仅仅计算它们。