跳转到内容

SPARQL/错误的聚合函数

来自维基教科书,自由的教科书

在使用GROUP BY时,编码错误可能会出现错误的聚合函数。有关GROUP BY的描述,请参阅修饰符章节。

错误“错误的聚合函数”没有具体说明错误是什么,因此本解释将帮助您找出原因。

这是一个正确的示例。此示例列出了巴赫的孩子,并按他们的母亲分组

SELECT ?mother ?motherLabel (COUNT(?child) AS ?children) 
        (GROUP_CONCAT(DISTINCT ?childLabel; SEPARATOR=", ") AS ?names)
WHERE
{
  ?child wdt:P22 wd:Q1339.# ?child has father Bach
  ?child wdt:P25 ?mother.
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". 
                          ?mother rdfs:label ?motherLabel.
                          ?child  rdfs:label ?childLabel.
                         }
}
GROUP BY ?mother ?motherLabel

试试看!

第一个条件是分组变量应该匹配。

  • SELECT中,分组是按两个变量?mother?motherLabel进行的。
  • GROUP BY中,应该列出相同的变量?mother ?motherLabel

自己尝试一下,看看使用GROUP BY ?mother会发生什么。
在错误列表的底部,您可能会找到文本“选择表达式中的非聚合变量: motherLabel”。
如果完全省略GROUP BY,则错误消息类似“选择表达式中的非聚合变量: mother”。


第二个条件SELECT中的其余变量应该每个都只产生一个值。

  • 您需要使用能产生一个值的表达式,例如COUNT或其他聚合函数MINMAXSUMAVG
  • 您也可以使用GROUP_CONCAT将所有值列在一个变量中,例如将所有?childLabel的值列入?names
  • 所有变量都应该使用上述表达式进行转换,即使一个变量只有一个值。

自己尝试一下,看看在SELECT代码的其余部分进行更改会发生什么。
例如,如果您使用?childLabel,您可能会在错误列表的底部找到文本“选择表达式中的非聚合变量: childLabel”。


错误消息始终是“选择表达式中的非聚合变量: xxxxx”,无论是GROUP BY中缺少变量,还是SELECT子句中未聚合的变量。


华夏公益教科书