SPARQL查询中UNION和EXISTS过滤器之间的区别是什么

时间:2016-06-03 10:43:43

标签: sparql dbpedia

我正在尝试使用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)?

1 个答案:

答案 0 :(得分:2)

第二个查询不计算不同的编写者。例如,它计算Robert Lowell四次,因为:

  1. 他的配偶Lady Caroline Blackwood是作家
  2. 他的配偶Jean Stafford是作家
  3. 他的配偶Jean Stafford是美国小说家
  4. 他的配偶Elizabeth Hardwick是美国小说家
  5. 但是第一个查询也是不正确的,因为罗伯特·洛厄尔三次,因为:

    1. 他的配偶Lady Caroline Blackwood是一名作家
    2. 他的配偶让斯塔福德是一位作家和美国小说家
    3. 他的配偶Elizabeth Hardwick是美国小说家
    4. 在任一查询中使用DISTINCT都会给出正确答案(364):

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

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