| Exercício: Quantos filmes existem no Wikidata?
Dica: certifique-se que sua consulta não recupera apenas filmes, mas também itens que sejam subclasses de filmes.
Mais uma dica: use DISTINCT para retirar as duplicatas dos resultados.
Dica: certifique-se que sua consulta não recupera apenas filmes, mas também itens que sejam subclasses de filmes.
Mais uma dica: use DISTINCT para retirar as duplicatas dos resultados.
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)
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.
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 (“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 (“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.
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.
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.
Uma abordagem para este problema é recuperar itens de mulheres que tenham “atriz” como ocupação (ou uma subclasse de atriz, como “atriz de cinema”). E, então, contar o número de Oscars aos quais elas foram indicadas. Note, entretanto, que isso inclui todas as categorias de Oscars.
Por exemplo, a atriz Emma Thompson foi nomeada ao Oscar de Melhor Roteiro, e Melhor Adaptação.
Outra possível abordagem seria olhar as vencedoras de “Oscar de Melhor Atriz”, e “Oscar de Melhor Atriz Coadjuvante”:
Até então, vimos modificadores que operam na cláusula SELECT, ou após a WHERE. Outro modificador útil é FILTER (“filtrar”, em português), que pode aparecer dentro de WHERE. Mostraremos duas formas de filtrar informações: a função FILTER, que seleciona apenas os itens que cumpram certo requisito (excluindo os itens que não cumprem) e a FILTER NOT EXISTS (“filtrar não existentes”, em português), que é uma cláusula que exclui resultados que combinem com certo padrão.
A função FILTER remove resultados com base na expressão que aparece entre os seus parênteses. Só são usados os resultados para os quais a expressão dentro dos parênteses for verdadeira.
Digamos que queremos editar a consulta dos 10 maiores sucessos de bilheterias que são parte de uma série de filmes, para que a consulta só retorne os filmes que foram lançados antes de 2000.
Na linha 8, adicionamos um padrão de seleção para armazenar o valor da propriedade P577 (data de publicação) na variável ?data. Na linha seguinte, usamos FILTER para selecionar apenas os filmes cuja data de publicação seja anterior a 01-01-2000.
Note que escrevemos a data limite “2000-01-01” entre aspas. Também adicionamos ^^xsd:dateTime logo em seguida, para indicar que aquele valor representa uma data.
Outra forma de realizar essa mesma consulta é usando a função YEAR (“ano”, em português). Essa função recebe uma data (ou valor do tipo dateTime), e retorna apenas o ano da data.
Vamos retomar a consulta de atrizes indicadas a mais de três Oscars. Mas, agora, vamos editá-la para que retorne apenas as atrizes que nunca receberam um Oscar.
Adicionaremos a cláusula FILTER NOT EXISTS, na qual especificamos os padrões que NÃO devem estar presentes nos dados. No nosso caso, a atriz não pode ter uma propriedade P166 (prêmios recebidos) com um valor que seja uma instância de (P31) Oscar (Q19020):
Em outras palavras, a consulta exclui os itens que possuam declarações que correspondam ao padrão definido dentro da cláusula FILTER NOT EXISTS.
Dica: selecione Estados soberanos (Q3624078) que tenham um chefe do executivo (P6) cuja data de nascimento (P569) tenha o ano 1980, ou algum ano posterior a ele. Outra alternativa é definir que o aniversário deles deve ser em 01-01-1980, ou depois disso.
Outra maneira de escrever esta consulta é usando o formato de data exata: