Modificando seus resultados

Modificando seus resultados

Nas consultas que vimos até agora, todos os itens que correspondiam a certo padrão eram selecionados e mostrados nos resultados. Mas muitas vezes temos interesse em apenas alguns dos resultados, ou em certo aspecto deles. Nesta seção você vai aprender algumas palavras-chave e funções que o ajudarão a retirar o máximo possível de seus dados.

Até então, nossas consultas tinham apenas duas cláusulas. SELECT, onde declaramos as variáveis que serão mostradas nos resultados, e WHERE, onde estão os padrões que devem ser reconhecidos nos dados.

# Filmes Star Wars
SELECT ?item
WHERE
{
  ?item wdt:P179 wd:Q22092344.
}

Na próxima seção, você vai aprender a modificar os resultados de suas consultas. Isso pode ser feito adicionando palavras-chave e funções adicionais à cláusula SELECT, à WHERE, ou depois de WHERE. Na verdade, você já pode ter visto um exemplo disto neste tutorial – o modificador DISTINCT, que pode ser adicionado à SELECT, para remover duplicatas dos resultados.

COUNT

COUNT

A função de agregação COUNT (“contar”, em português) pode ser usada para escrever consultas que respondam à pergunta: “Quantos itens correspondem a um certo padrão?”. Em tais casos, não estamos interessados em quais são os itens que correspondem ao padrão de nossa consulta, mas sim em quantos deles existem. 

Suponha que queremos saber quantos itens existem no Wikidata sobre mulheres que são químicas. Para isso, poderíamos usar a consulta a seguir:

Acima da tabela com os resultados, o WDQS mostra quantos itens foram encontrados, e quantos milissegundos foram necessários para rodar a consulta.

Mas essa estratégia nem sempre funciona. Suponha que queremos saber quantos itens existem no Wikidata sobre atrizes. A princípio, poderíamos apenas editar a consulta acima:

# Mulheres que são atrizes

SELECT ?item ?itemLabel
WHERE {
  ?item wdt:P31 wd:Q5.            # Item é uma instância de ser humano.
  ?item wdt:P21 wd:Q6581072.      # Item tem sexo / gênero feminino.
  ?item wdt:P106 wd:Q33999.      # Item tem ocupação: atriz.
   SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE]". }
}

A princípio, o WDQS retornaria todos os itens que correspondem ao nosso padrão, e nos diria quantos deles existem. Entretanto, como o número de itens que correspondem ao padrão é muito grande, a consulta entrará em timeout (“tempo esgotado”, em português). Isso acontece porque há um tempo limite de 60 segundos para que uma consulta seja executada. Toda consulta que demore mais do que isso para rodar entrará em timeout.

Usaremos outra abordagem para saber quantas atrizes existem no Wikidata. Declaramos uma nova variável na cláusula SELECT, chamada ?contadorAtrizes. A variável será definida como o COUNT (a contagem) de itens cujo padrão corresponda àquele definido na cláusula WHERE.

Esta consulta tem apenas um resultado: a variável contadorAtrizes, com o valor da contagem de todos os itens que correspondem ao padrão de busca (seres humanos, de sexo ou gênero feminino, e que sejam atrizes).

GROUP BY

GROUP BY

Agora que você aprendeu como usar uma função de agregação como a COUNT, é hora de combiná-la com uma função do SPARQL chamada GROUP BY (“agrupar por”, em português). GROUP BY agrupa dados do conjunto de dados, facilitando a execução de funções como COUNT em  grupos de dados para análise.

Tome, por exemplo, a consulta que recupera o número de tenistas no Wikidata. Na consulta a seguir, nós adicionamos uma variável – ?gênero – e pedimos que o WDQS nos mostre os resultados agrupados por esta variável.

Note que a variável usada no modificador GROUP BY deve ser listada na cláusula SELECT.

Você pode notar também que, se somar a contagem de itens de todos os grupos, ela é inferior ao número total contado na consulta original (sem o agrupamento por gênero). Isso ocorre porque, de fato, existem alguns jogadores de tênis para os quais nenhuma informação sobre sexou ou gênero é fornecida. (Ver cláusula OPCIONAL)

Exercício: GROUP BY

| Exercício: Escreva uma consulta que seleciona filmes que forma indicados a um prêmio, e quantas nomeações cada um deles recebeu

Dica: Procure filmes que tenham a propriedade P1411 (indicado a).

Outra dica: Garanta que sua consulta não seleciona somente filmes, mas também itens que sejam uma subclasse de filme. Use DISTINCT para remover as duplicatas dos resultados.

ver a resposta

Note que o modificador DISTINCT é aplicado ao prêmio, não ao item. Se um item tiver mais de uma declaração com P31 (instância de), e se houver mais de um caminho para a classe filme (por exemplo, se um item for tanto um filme quanto um filme 3D, que é uma subclasse de filme), DISTINCT garantirá que as indicações a prêmios serão contadas uma única vez.

Se você quiser ver qual filme recebeu mais indicações a prêmios, desça até a parte dos resultados e clique na coluna “count” no topo da tabela. Isso ordenará os resultados de acordo com os valores dessa coluna. Na próxima seção, você aprenderá como ordenar os resultados na própria consulta.

ORDER BY

ORDER BY

ORDER BY (“ordenar por”, em português) é um modificador que ordena os resultados de acordo com uma variável ou expressão. A ordenação pode ser crescente (ASC) ou decrescente (DESC).

Tome por exemplo a consulta a seguir que mostra o número de nomeações a prêmios por filme, em ordem decrescente:

HAVING

HAVING

HAVING (“tendo”, em português) é um modificador que filtra groupos que não correspondem a uma condição. Ele sempre é usado em combinação a GROUP BY.

Por exemplo: podemos fazer a consulta do exemplo acima mostrar apenas filmes que receberam mais de 5 nomeações a algum prêmio.

Note que o modificador HAVING deve vir diretamente após o GROUP BY.

LIMIT

LIMIT

O modificador LIMIT (“limite”, em português) pode ser usado após a cláusula WHERE para especificar um número de resultados que deve ser retornado na consulta. 

Por exemplo: a consulta a seguir mostra os 10 maiores sucessos de bilheterias que sejam parte de uma série de filmes:

Perceba que o modificador GROUP BY só funciona se for usado juntamente com uma função de agregação (como COUNT). Os modificadores ORDER BY e LIMIT não precisam de uma função de agregação.

Qualificadores

Qualificadores

Vamos revisitar a consulta sobre filmes com mais de 5 nomeações a prêmios.

# Filmes que foram nomeados a prêmios, e a contagem de quantas nomeações receberam

SELECT ?item ?itemLabel (COUNT(DISTINCT ?prêmio) as ?contadorPrêmio)
WHERE {
  ?item wdt:P31/wdt:P279* wd:Q11424.      # item é uma instância de filme, ou de alguma subclasse de filme
  ?item wdt:P1411 ?prêmio.                # item foi nomeado a algum prêmio, e esse valor é armazenado em ?prêmio
  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE]" . }
}
GROUP BY ?item ?itemLabel                 # Os resultados são apresentados por filme
HAVING (?contadorPrêmio > 5)              # somente filmes com mais de 5 nomeações
ORDER BY DESC (?contadorPrêmio)           # em ordem decrescente

Essa consulta conta quaisquer tipos de prêmios. Como podemos alterá-la para ver os filmes com mais indicações ao Oscar?

Podemos especificar que o prêmio em questão deve ser uma instância de um Oscar:

Entretanto, alguns filmes podem ser nomeados duas ou mais vezes para o mesmo prêmio. Por exemplo, o filme “All About Eve” (Q200299) recebeu duas nomeações ao prêmio de Melhor atriz coadjuvante:

Se nossa consulta se basear apenas no valor da propriedade “indicado a”, então ambas nomeações seriam declarações idênticas e, portanto, seriam consideradas somente uma vez.

Se você já aprendeu como consultar declarações com qualificadores, então deve se lembrar que, no modelo de dados do Wikidata, para cada propriedade direta que liga um item a um valor, há também uma propriedade simples (p) que conecta o item a um nó de declaração. Então, neste caso, para cada indicação ao prêmio, há um nó de declaração diferente. Para recuperar o número correto de indicações ao prêmio da Academia por filme, a consulta precisa contar para cada filme quantos nós de declaração “indicados a” existem para os quais o valor (ou seja, o prêmio) é um prêmio da Academia:

Agora sim a consulta conta as declarações de prêmios referentes a prêmios que sejam uma instância de um Oscar. Note que os próprios nomeados são qualificadores de cada declaração de prêmio, mas não são relevantes para a contagem realizada pela consulta.

Skip to content