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

4

我正在尝试使用DBpedia SPARQL端点进行实验,并注意到在使用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

为什么这两个查询之间会有差异?它们不是等价的吗(请参见以前的问题和答案在SPARQL查询中添加OR子句的正确方法)?


这个问题有点令人困惑。它们会给出不同的结果,还是相同的结果(都是371)? - Peter M.
1
是的,我犯了一个错误。它们给出不同的结果。第一个结果是371,第二个是414。 - Philippe G.
2
请在“w1”上使用“DISTINCT”,两者应该返回相同的结果。 - UninformedUser
1个回答

4

第二个查询没有计算出不同的作者。例如,它将Robert Lowell计为四次,因为:

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

但是第一个查询也是不正确的,它将Robert Lowell计为三次,因为:

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

在任何一个查询中使用DISTINCT都可以得到正确的答案(364):

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

通常情况下,为了找到此类查询中错误的原因,请列出所有结果而不仅仅是计数。

好的诊断。仅就最后一句话而言,我会点赞:花一两分钟进行调试可以节省在 Stack Overflow 上提问和等待答案的时间。 - Joshua Taylor
Joshua和svick是正确的,我在发布这个问题之前应该进行更多的测试。 - Philippe G.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接