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

SPARQL查询中UNION和EXISTS过滤器之间的区别是什么,sparql,dbpedia,Sparql,Dbpedia,我正在进行实验,并且注意到使用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 while查询 SELECT (COU

我正在进行实验,并且注意到使用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

while查询

SELECT (COUNT(?w1) as ?nbWriter) WHERE {
    ?w1 a dbo:Writer;
    dbo:spouse ?w2 .
    {?w2 a dbo:Writer.} 
    UNION
    {?w2 a yago:AmericanNovelists.} 
}
生成结果
nbWriters=414


为什么这两个查询之间存在差异?它们是否不相等(参见前面的问题和答案)

第二个查询不统计不同的写入程序。例如,它计数四次,因为:

  • 他的配偶是个作家
  • 他的配偶是个作家
  • 他的配偶是一位美国小说家
  • 他的配偶是一位美国小说家
  • 但第一个查询也不正确,它计算了Robert Lowell三次,因为:

  • 他的配偶卡罗琳·布莱克伍德夫人是一位作家
  • 他的配偶吉恩·斯塔福德是一位作家和美国小说家
  • 他的配偶伊丽莎白·哈德威克是一位美国小说家
  • 在任一查询中使用
    DISTINCT
    ,都会得到正确答案(364):


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

    这个问题令人困惑。他们给出了不同的结果,还是相同的结果(都是371)?是的,我犯了一个错误。他们给出了不同的结果。第一个给出371,第二个给出414。请在
    w1
    上使用
    不同的
    ,然后两者都返回相同的结果。诊断正确。我会投票支持最后一句话:一两分钟的调试可以节省提问和等待堆栈溢出答案的时间。Joshua和svick是对的,我应该在发布此问题之前进行更多测试。
    
    SELECT (COUNT(DISTINCT ?w1) as ?nbWriter)