跳轉到內容

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子句中未聚合的變數。


華夏公益教科書