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 四次,因为:
- 他的配偶Lady Caroline Blackwood是一位作家
- 他的配偶Jean Stafford是一位作家
- 他的配偶Jean Stafford是美国小说家
- 他的配偶Elizabeth Hardwick是美国小说家
但是第一个查询也是错误的,算了3次Robert Lowell,因为:
- 他的配偶卡罗琳·布莱克伍德夫人是一位作家
- 他的配偶让·斯塔福德是一位作家和美国小说家
- 他的配偶伊丽莎白·哈德威克是美国小说家
在任一查询中使用 DISTINCT
将为您提供正确答案 (364):
SELECT (COUNT(DISTINCT ?w1) as ?nbWriter)
一般来说,要找出此类查询中错误的原因,请列出所有结果,而不是仅仅计算它们。
我正在试验 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 四次,因为:
- 他的配偶Lady Caroline Blackwood是一位作家
- 他的配偶Jean Stafford是一位作家
- 他的配偶Jean Stafford是美国小说家
- 他的配偶Elizabeth Hardwick是美国小说家
但是第一个查询也是错误的,算了3次Robert Lowell,因为:
- 他的配偶卡罗琳·布莱克伍德夫人是一位作家
- 他的配偶让·斯塔福德是一位作家和美国小说家
- 他的配偶伊丽莎白·哈德威克是美国小说家
在任一查询中使用 DISTINCT
将为您提供正确答案 (364):
SELECT (COUNT(DISTINCT ?w1) as ?nbWriter)
一般来说,要找出此类查询中错误的原因,请列出所有结果,而不是仅仅计算它们。