SPARQL/错误的聚合函数
外观
< 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
或其他聚合函数MIN
、MAX
、SUM
或AVG
。 - 您也可以使用
GROUP_CONCAT
将所有值列在一个变量中,例如将所有?childLabel
的值列入?names
。 - 所有变量都应该使用上述表达式进行转换,即使一个变量只有一个值。
自己尝试一下,看看在SELECT
代码的其余部分进行更改会发生什么。
例如,如果您使用?childLabel
,您可能会在错误列表的底部找到文本“选择表达式中的非聚合变量: childLabel”。
错误消息始终是“选择表达式中的非聚合变量: xxxxx”,无论是GROUP BY
中缺少变量,还是SELECT
子句中未聚合的变量。