Esercizio: FILTER

| Esercizio: scrivi una query che mostri gli stati sovrani il cui capo del governo è nato nel 1980 o successivamente.

Suggerimento: selezionare gli stati sovrani (Q3624078) che hanno un capo di governo (P6) la cui data di nascita (P569) è l’anno 1980 o successivo, o che hanno la data di nascita 01-01-1980 o successiva.

mostra la soluzione

Un altro modo per scrivere la query è utilizzare il formato della data esatta:

Escludere dei risultati

FILTER – escludere dei risultati

Finora abbiamo visto modificatori che operavano sulla clausola SELECT o dopo la clausola WHERE. Un altro utile modificatore è FILTER, che può apparire all’interno della clausola WHERE.
Dimostreremo il filtraggio in due modi: la funzione FILTER che seleziona solo gli elementi che soddisfano la condizione del filtro (cioè esclude gli elementi che non lo fanno) e FILTER NOT EXISTS che è una clausola che esclude i risultati che corrispondono a determinati schemi.

Funzione FILTER

La funzione FILTER esclude gli elementi in base all’espressione che appare all’interno delle parentesi della funzione: vengono utilizzati solo i risultati per i quali l’espressione tra parentesi è vera.

Supponiamo di voler modificare la query sui 10 film di maggior incasso che fanno parte di una serie, in modo che la query restituisca solo i film usciti prima del 2000.

Alla riga 8, abbiamo aggiunto un modello di corrispondenza per raccogliere il valore della proprietà P577 (data di pubblicazione) con la variabile ?date. Nella riga successiva abbiamo utilizzato FILTER per includere solo gli elementi la cui data di pubblicazione è precedente al 01-01-2000.

Nota che mettiamo la data del criterio (01-01-2000) tra virgolette e aggiungiamo “^^xsd:dateTime” dopo, per indicare che il formato di questo valore è una data.

Funzione YEAR

Un altro modo per scrivere questa query è usare la funzione YEAR. Questa funzione incorporata restituisce la parte dell’anno di una data (o un valore dateTime):

FILTER NOT EXISTS

Diciamo di voler modificare la query sulle attrici nominate per più di tre Academy Awards, in modo che la query restituisca solo quelle attrici che non hanno mai ricevuto un Academy Award.

Aggiungiamo la clausola FILTER NOT EXISTS, nella quale specifichiamo i pattern che NON devono essere abbinati, ovvero che l’attrice ha una proprietà P166 (premio ricevuto) che ha un valore che è un’istanza (P31) di Academy Awards (Q19020):

In altre parole, la query esclude gli elementi che hanno istruzioni che corrispondono al modello fornito all’interno della clausola FILTER NOT EXISTS.

Esercizio

| Esercizio: quali attrici sono state nominate per più di 3 premi Oscar e quante nomination ciascuna ha ricevuto?

mostra la soluzione

Un modo per affrontare questa domanda è recuperare gli elementi riguardanti donne che hanno “atrice” come occupazione (o una sua sottoclasse, come “attrice cinematografica”) e contare il numero di premi Oscar per cui sono state nominate. Nota, tuttavia, che questo include tutti i premi Oscar.

Ad esempio, l’attrice Emma Thompson è stata anche nominata all’Oscar per la miglior sceneggiatura non originale.

Un altro approccio è guardare i vincitori dell'”Oscar alla miglior attrice” e “Oscar alla miglior attrice non protagonista”:

Qualificatori

Qualificatori

Let’s look again at the query about films with more than 5 nominations.

# Films that were nominated for more than 5 awards, and the count of nominations.

SELECT ?item ?itemLabel (COUNT(DISTINCT ?award) AS ?count)
WHERE {
  ?item wdt:P31/wdt:P279* wd:Q11424.     # Item is instance of a film or subclass thereof
  ?item wdt:P1411 ?award.                # Item was nominated for an award, collected by ?award
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE]". }
  }
GROUP BY ?item ?itemLabel                # The results are shown per film
HAVING (?count>5)                        # Only films with more than 5 nominations
ORDER BY DESC(?count)                    # In descending order

This query counts awards of any kind. How can we edit the query to show the films with most Academy award nominations?

We could specify that the award should be an instance of an Academy award:

However, some films could be nominated twice for the same award. For example, the film “All About Eve” (Q200299) had two nominations for Best Actress award:

If our query only relies on the “nominated for” property and its value then the two nominations would be identical statements and therefore counted only once.

If you have already learned how to query statements with qualifiers then you know that in the Wikidata data model, for every direct property linking an item and a value, there is also a simple property (p) that connects the item to a statement node. For each award nomination there is a different statement node. In order to retrieve the correct number of Academy award nominations per film the query needs to count for each film how many “nominated for” statement nodes there are for which the the value (i.e., the award) is an Academy award:

Now the query counts the award statements of awards that are an instance of an Academy award. Note that the nominees themselves are qualifiers to each award statement, but are not relevant to the count of the query.

LIMIT

LIMIT

The LIMIT modifier can be used after the WHERE clause to return a specific number of results.

For example, the following query shows the 10 highest-grossing films that are part of a series.

Note that the GROUP BY modifier only works with an aggregate function (such as COUNT). The modifiers ORDER BY and LIMIT do not require an aggregate function.

HAVING

HAVING

HAVING is a modifier that filters groups that do not meet a specified condition. It is always used in combination with GROUP BY.

For example, we can edit the query which shows the number of award nominations per film, so it shows only films that have had more than 5 nominations.

Note that the HAVING modifier must come directly after GROUP BY.

ORDER BY

ORDER BY

ORDER BY is a modifier that sorts the results according to a certain variable or expression. The order specified can be either ascending (ASC) or descending (DESC).

Take for example the next query which shows the number of award nominations per film, in descending order:

Esercizio: GRUPPO PER

| Exercise: Write a query that selects films that were nominated for an award, and the number of nominations per film.

Hint: Find films that have a P1411 (nominated for) property.

Tip: Make sure that your query doesn’t only retrieve films, but also items that are subclasses of films. Use DISTINCT to remove duplicates from the results

show solution

Note that the DISTINCT modifier is applied to the award, not to the item. If an item has more than one statement with P31 (instance of), and it has more than one path to the film class (e.g., an item is both a film, and a 3D film, which is a subclass of film), DISTINCT will ensure the award nominations are counted only once.

If you want to see which film has had the most award nominations, scroll to the results after running the query, and click on the “count” column at the top of the table, which will order the results according to this column. In the next section you will learn how to order the results in the query itself.

GROUP BY

GROUP BY

Ora che hai imparato a usare una funzione aggregata come COUNT, è ora di combinarla con una funzione SPARQL chiamata GROUP BY.
GROUP BY aggregates data in your dataset, making it easy to run functions like COUNT on groups of data for analysis .

Take for example the query retrieving the number of tennis players on Wikidata. In the following query we add a variable – ?gender – and ask WDQS to show the results grouped by this variable.

Note that the variable used in the GROUP BY modifier must be listed in the SELECT clause.

You may notice that if you sum the count of items of all groups it is lower than the total number counted in the original query (without the gender grouping). This is the case because there are in fact a few tennis players for which no gender information is given. (See OPTIONAL clause)

Skip to content