Dois ou mais padrões

Adicionando padrões

Até então, nossas consultas só tinham um padrão que precisava ser correspondido. Por exemplo, elas selecionam itens com uma propriedade P179 (série) com o valor Q22092344 (filme da saga Star Wars). Na consulta a seguir, há dois padrões que precisam ser identificados:

Esta consulta recupera quatro itens. Esses itens satisfazem ambas as condições, ou seja, há uma relação E entre os padrões:
?item wdt:P179 wd:Q22092344.
E
?item wdt:P57 Q38222.

# Um pouco de sintaxe

Aqui temos outra maneira de formular a consulta acima, usando um ponto e vírgula para unir as declarações:

#Filmes Star Wars

SELECT ?item  ?itemLabel 
WHERE 
{ 
  ?item wdt:P179 wd:Q22092344; # item faz parte da saga de filmes Star Wars
        wdt:P57 wd:Q38222.     # item tem a propriedade diretor com o valor George Lucas
  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE]". }
}

O ponto e vírgula (;) ao final da linha 6 une os dois padrões a serem reconhecidos. Logo, a variável ?item é omitida na linha 7.

Operador UNION

Reconhecimento de padrões usando a relação OU

Vimos na seção anterior que, se listarmos dois padrões a serem reconhecidos, eles terão uma relação E. Isto é, a consulta só vai retornar os itens que correspondam a ambas as condições. Se quisermos ter uma relação OU entre as condições, precisamos utilizar o operador UNION (“união”, em português). A consulta a seguir recupera itens que são partes das sagas de filmes Star Wars ou Star Trek.

Consulta com mais de uma variável

Consultas com mais de uma variável

Até então, nossas consultas basicamente tinham uma única variável, não considerando aquelas declaradas para o rótulo e/ou descrição do item. Agora vamos ver como fazer consultas com mais de uma variável. 
A consulta a seguir recupera itens que fazem parte da saga de filmes Star Wars e seus respectivos diretores.

#Filmes Star Wars

SELECT ?item  ?itemLabel ?diretor
WHERE
{
  ?item wdt:P179 wd:Q22092344. # item faz parte da saga de filmes Star Wars
  ?item wdt:P57 ?diretor.      # o valor da propriedade "diretor" de ?item será armazenado na variável ?diretor
  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE]". }
}

Explicação da consulta

Na seção SELECT, temos as variáveis ?item e ?diretor, além de ?itemLabel e ?diretorLabel, usadas para armazenar os rótulos das variáveis correspondentes. 

Na seção WHERE, nas linhas 6 e 7, vemos os padrões que deverão ser correspondidos:
?item wdt:P179 wd:Q22092344.
?item wdt:P57 ?diretor.

O SPARQL procurará itens no Wikidata com declarações que correspondam aos padrões definidos na seção WHERE. Assim como nas outras consultas, a primeira linha da seção WHERE diz “Encontre itens que tenham uma declaração com a propriedade P179 (série) que tenham como valor Q22092344 (saga de filmes Star Wars).
A segunda linha diz “Agora encontre a propriedade P57 (diretor) de cada um desses itens, e a armazene na variável ?diretor”. 
Como vimos anteriormente, existe um E implícito entre cada declaração na seção WHERE. Isto é, apenas padrões que correspondam a todas as declarações serão devolvidos por esta consulta. 

Agora vamos rodar esta consulta:

O que precisa ser adicionado para vermos os nomes dos diretores? Adicione a informação que está faltando e rode a consulta novamente.

Ver a resposta

# Um pouco de sintaxe

Se quisermos que a consulta mostre o nome de cada diretor, mas não seu número Q, podemos omitir o ?diretor da seção SELECT, e declarar apenas ?diretorLabel. Isso implica que existirá uma variável ?diretor (que vemos na seção WHERE), mas que ela não será apresentada nos resultados da consulta.

Exercício: mais de uma variável

| Exercício: escreva uma consulta para mostrar o diretor e roteirista (P58) de cada filme na saga Star Wars.

Ver a resposta

Ou, usando uma sintaxe diferente, conforme vimos anteriormente:

A consulta que fizemos para listar os diretores de cada filme Star Wars retornou 9 resultados. Esta consulta retorna 16. Por quê?

Porque alguns dos filmes têm mais de um roteirista. Portanto, temos uma linha para cada roteirista.

Valores múltiplos

Propriedades com múltiplos valores

Ter vários valores para uma mesma propriedade não é um problema para um banco de dados como o Wikidata. Não há nada de errado em ter diversos valores para a mesma propriedade. Para algumas declarações – como os filhos de alguém, ou o idioma oficial de um país –, faz sentido existir mais de um valor. Basicamente, são pares adicionais de propriedade-valor.

Por exemplo, para o item Star Wars Episódio V: O Império Contra-Ataca (Q181795) a propriedade roteirista (P58) possui os seguintes valores:

Uma representação gráfica dessas informações:


Uma representação gráfica das propriedades diretor e roteirista e seus respectivos valores para o item Q181795 do Wikidata.

Outro exercício

| Exercício: mostre o diretor e o custo (P2130) de cada um dos filmes da saga Star Wars

ver a resposta

Ou, usando uma sintaxe diferente (veja a explicação aqui):

A consulta para recuperar os filmes da saga Star Wars e seus diretores retornou 9 resultados. Esta retorna apenas 8. Por quê? 

Porque um dos itens não tem a propriedade custo (P2130) e, portanto, é ignorado pela consulta.

A cláusula OPTIONAL

Valores ausentes e a cláusula OPTIONAL

Como vimos anteriormente, quando há mais de um padrão a ser reconhecido na cláusula WHERE, há uma relação E implícita entre as declarações, de tal modo que a consulta só devolverá padrões que correspondam a todas as declarações. Por exemplo, no último exercício, nós tivemos três padrões a serem correspondidos:

#Filmes Star Wars

SELECT ?item  ?itemLabel ?diretor ?diretorLabel ?custo
WHERE
{
  ?item wdt:P179 wd:Q22092344. # item faz parte da saga de filmes Star Wars
  ?item wdt:P57 ?diretor.      # o valor da propriedade "diretor" de ?item será armazenado na variável ?diretor
  ?item wdt:P2130 ?custo.      # o valor da propriedade "custo" de ?item será armazenado na variável ?custo
  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE]". }
}

As declarações nas linhas 6, 7 e 8 tem uma relação E entre elas. Logo, um item só será considerado um resultado válido se ele tiver todas as três propriedades: P179 (série) com o valor Q22092344 (saga de filmes Star Wars), E P57 (diretor), E P2130 (custo). Se um item não corresponder a um desses requisitos (por exemplo, se o item não tiver uma propriedade sobre seu custo), ele será ignorado pela consulta.

O SPARQL é uma linguagem de consulta de reconhecimento de padrões (“pattern-matching”, em inglês). Consultas SPARQL só retornarão dados quando o padrão definido na seção WHERE for completamente reconhecido nos itens que você está consultando. Muitos conjuntos de dados têm informações faltantes, por isso é importante ter em mente que um item só será um resultado de uma consulta se ele tiver dados válidos em cada trecho da declaração feita no WHERE. Ou seja, o SPARQL não vai retornar um item que não tenha alguma propriedade ou valor declarado na cláusula WHERE.

A palavra-chave OPTIONAL (“opcional”, em português) dentro da seção WHERE determina padrões opcionais que você quer de encontrar nos dados. OPTIONAL permite procurar por dados que talvez não estejam lá.

Rode a consulta novamente, desta vez usando um padrão opcional.

Visualização Image Grid

Visualização Image Grid

O WDQS pode mostrar os resultados de nossas consultas em vários formatos diferentes. Até aqui, sempre usamos a visualização de tabela. Vamos dar mais uma olhada no exercício anterior:

Após rodar a consulta, olhe os resultados. Acima da tabela, clique na seta à esquerda, ao lado do ícone de olho e do sinal de interrogação. Um menu suspenso vai aparecer. Escolha “Image grid” (“tabela de imagens”, em português) no menu, e o WDQS vai mostrar o logo de cada item, com seus respectivos resultados abaixo da imagem.

Outra forma de visualizar o resultado como uma “Image grid” é especificando isso na própria consulta. O código na linha 1, após o símbolo de hashtag (#), diz para a consulta que os resultados não devem ser mostrados como uma tabela, mas sim como uma série de imagens.

Você não precisa se lembrar do código exato para a visualização em “Image Grid”. Graças à ferramenta de preenchimento automático do WDQS, assim que você digitar uma hashtag (#) na janela de consulta, um menu suspenso vai aparecer com sugestões de diferentes formatos de visualização.

Instâncias e Classes

Propriedade P31 – “instância de”

A maioria das propriedades do Wikidata descrevem características que um item possui/tem. O item para Star Wars Episódio IV: Uma Nova Esperança (Q17738) tem as propriedades de diretor (P57), duração (P2047), custo (P2130), e assim por diante. Mas muitas vezes queremos saber o que um item é. A maioria dos itens do Wikidata tem ao menos uma declaração com a propriedade P31 – instância de –, que nos diz de qual classe esse item é um exemplo em particular.

  • Star Wars Episódio IV: Uma Nova Esperança (Q17738) é uma instância de filme (Q11424);
  • Star Wars (Q22092344) é uma instância de série de filmes (Q24856);
  • Star Wars (Q462) é uma instância de franquia de mídia (Q196600).

Perceba que um item não é limitado a ter apenas uma declaração de P31. Star Wars Episódio VIII: Os Últimos Jedi (Q18486021) é uma instância de filme (Q11424) e de filme 3D (Q229390).

Note também que declarações do tipo P31 tem como objetivo fazer as distinções mais genéricas possíveis. Outras informações devem ser declaradas com outras propriedades:
George Lucas (Q38222) é uma instância de ser humano (Q5).
Também poderíamos dizer que George Lucas é uma instância de diretor de cinema (Q2526255), já que ele obviamente é um membro da classe de diretores de cinema. Entretanto, a estratégia de classificação é usar um valor mais genérico na declaração de “instância de”, e incluir informações mais específicas em outras propriedades. Por exemplo, a informação de que George Lucas é um diretor de cinema é armazenada em uma declaração que usa a propriedade ocupação (P106).

Propriedade P279 – “subclasse de”

Portanto, enquanto Q17738 (Star Wars Episódio IV: Uma Nova Esperança) representa um filme específico – tem um diretor (George Lucas), uma duração (121 minutos), uma lista de membros do elenco (Carrie Fisher, Harrison Ford, …), e assim por diante – o item filme (Q11424) é um conceito geral. Filmes podem ter diretores, durações e elencos, mas o conceito geral “filme” não tem nenhum diretor, duração ou elenco em particular.

Conceitos gerais recebem uma ou mais declarações com a propriedade de subclasse (P279). Por exemplo:

  • Filme (Q11424) é uma subclasse de imagem de arte (Q4502142), mas também de obra audiovisual (Q2431196);
  • série de filmes (Q24856) é uma subclasse de série de obras (Q7725310), obra de arte (Q838948), obra audiovisual (Q2431196) e franquia de mídia (Q196600).

A importância da distinção entre instância e subclasse

Imagine que queremos uma lista de todos os filmes que fazem parte do universo fictício de Star Wars. Poderíamos rodar a seguinte consulta:

A consulta só retorna 10 filmes. Claramente, alguns filmes estão faltando nos resultados, como Star Wars Episódio I: A Ameaça Fantasma (Q165713). Por quê?

Porque alguns itens tem “longa-metragem” (Q24869) como o valor de sua declaração P31. “Longa-metragem” é uma subclasse de “filme” (Q11424). Mas o padrão na seção WHERE da consulta não combina com aquele declarado no item. Dessa forma, alguns itens que não são listados como sendo “filmes” não são recuperados na consulta. 

Poderíamos usar uma UNION para selecionar os filmes que são uma instância de “filme” ou “longa-metragem”.

Essa consulta recupera mais resultados. Ainda assim, é possível que existam mais itens relevantes (nesse caso, outros filmes que façam parte do universo Star Wars) que tenham uma propriedade “instância de” com um valor que seja referente a alguma outra subclasse de filme – filme de ação, filme 3D, filme épico… Assim, listar todas as possíveis subclasses de filmes usando diversas declarações UNION não parece ser uma estratégia muito boa. Uma solução melhor, e mais geral, é apresentada na próxima seção.

Skip to content