User:Pyb en résidence/Brouillon
MEMENTO SPARQL n°1. Interface
[edit]Objectifs de ce mémento :
- Présenter la structure des données Wikidata
- Présenter l'interface de WDQS
Présenter les données de Wikidata et l'interface de WDQS
MEMENTO SPARQL n°2. Niveau débutant
[edit]- Objectifs de ce mémento
- Identifier les lieux d'entraide
- Rappeler le principe des requêtes SPARQL
- Savoir faire les requêtes basiques
- Savoir faire des requêtes un peu plus avancées traitant de nombres, coordonnées et dates
What is SPARQL ?
[edit]SPARQL (SPARQL Protocol and RDF Query Language) est un langage de requêtes standardisé proposé et publié par le W3C. Le point de terminaison (Endpoint) SPARQL est accessible publiquement, via le client web ou via API :
Wikidata :
- GUI https://query.wikidata.org
- API https://query.wikidata.org/bigdata/namespace/wdq/sparql?query={SPARQL} ou https://query.wikidata.org/sparql?query=SPARQL ?
Wikimedia Commons :
Getting help
[edit]- https://www.wikidata.org/wiki/Wikidata:SPARQL_query_service/Wikidata_Query_Help/fr
- https://commons.wikimedia.org/wiki/Commons:SPARQL_query_service/fr
Anatomie d'une requête SPARQL
[edit]#title: …
#defaultView: …
PREFIX …
SELECT …
WHERE {… }
GROUP BY …
HAVING …
ORDER BY …
LIMIT …
OFFSET …
VALUES …
Commande | Description | Emplacement | Exemple |
---|---|---|---|
#title | Prologue | #title:Titre du tableau | |
#defaultView | select a default view for results : Graph, Dimensions, Timeline, Tree, TreeMap, BubbleChart, ScatterChart, BarChart, AreaChart, LineChart, Map, ImageGrid. | #defaultView:Map | |
PREFIX | déclaration des préfixes. Most prefixes that are used in common queries are supported by the engine without the need to explicitly specify them. | ||
SELECT
SELECT DISTINCT |
type de requête SPARQL le plus courant permettant de définir les colonnes du tableau de données attendu en retour (DISTINCT permet d'enlever les lignes en double) | Projection | |
WHERE | Spécifier les critères de recherche énumérés sous forme de séries de motifs de triplets | Pattern | WHERE {wd:P31 wdt:Q5} |
SERVICE | https://www.mediawiki.org/wiki/Wikidata_Query_Service/User_Manual#Label_service | SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],fr,en". | |
GROUP BY | ordonner les résultats de la requête suivant un ou plusieurs des éléments à afficher. Optionnel : triage ascendant ou descendant | Modificateur | |
HAVING | ordonner les résultats de la requête suivant un ou plusieurs des éléments à afficher. Optionnel : triage ascendant ou descendant | HAVING (date>2)
| |
ORDER BY | ordonner les résultats de la requête suivant un ou plusieurs des éléments à afficher. Optionnel : triage ascendant ou descendant | ORDER BY DESC(?PIB) | |
LIMIT | limiter le nombre d'éléments à afficher | LIMIT 100 | |
OFFSET | décaler les éléments à afficher du nombre indiqué | OFFSET 10 | |
VALUES |
gras = obligatoire
Motifs de triplets avancés
[edit]SELECT ?enfant
WHERE {
# individus ayant pour père Bach
?enfant wdt:P22 wd:Q1339.}
SELECT ?enfant
WHERE {
# individus ayant pour père Bach et mère Maria Barbara Bach
?enfant wdt:P22 wd:Q1339.
?enfant wdt:P25 wd:Q57487.}
SELECT ?enfant ?enfantLabel
WHERE {
# version abrégée
?enfant wdt:P22 wd:Q1339;
wdt:P25 wd:Q57487.}
SELECT ?petitEnfant ?petitEnfantLabel
WHERE {
wd:Q1339 wdt:P40 [ wdt:P40 ?petitEnfant ].}
SELECT ?enfant ?enfantLabel ?enfantDescription ?enfantAltLabel
WHERE {
# version très abrégée des enfants du couple qui sont compositeurs
?enfant wdt:P22 wd:Q1339;
wdt:P25 wd:Q57487;
wdt:P106 wd:Q36834,
wd:Q486748.
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],fr,en".
}}
SELECT
: liste de variables dont on souhaite connaître les valeurs.WHERE
: des restrictions sur ces variableswd
: préfixes des élémentswdt
: préfixes des propriétésQ1339
: identifiant Wikidata de BachP22
: propriété pour désigner le père?xxLabel
: récupérer le libellé (requiert SERVICE wikibase:label)?xxDescription
: récupérer la description (requiert SERVICE wikibase:label)?xxAltLabel
: récupérer les alias (requiert SERVICE wikibase:label)SERVICE wikibase:label
: spécificité de Wikidata pour obtenir les libellés, descriptions et alias par exemple prioritairement en français, ensuite en anglais, et finalement dans la langue dans laquelle les données ont été renseignées
langage naturel | exemple | SPARQL | exemple |
---|---|---|---|
phrase | Juliette aime Roméo. | point | Juliette aime Roméo. |
conjonction (clause) | Roméo aime Juliette et tue Roméo. | point-virgule | Roméo aime Juliette ; tue Roméo. |
conjonction (noms) | Roméo tue Tybalt et Roméo. | virgule | Roméo tue Tybalt, Roméo. |
clause relative (proposition subordonnée) | Juliette aime quelqu'un qui tue Tybalt. | crochets | Juliette aime [ tue Tybalt]. |
Symboles
[edit].
: terminates a triple
;
: ties several properties to a subject
/
: joins two properties
*
: recursively extends last property
#
: commentaire de code
Types de données
[edit]- élément Wikidata :
wd:Q42
pour Douglas Adams (Q42) - booléen :
2 < 3
,"a" = "b"
qui renvoientTrue
ouFalse
- chaîne de caractères :
"Douglas Adams"
- texte monolingue :
"Douglas Adams"@fr
- nombres :
1.23
- dates :
"2012-10-29T00:00:00Z"^^xsd:dateTime
(sensible à la casse)
Nombres
[edit]Dates
[edit]Coordonnées géographiques
[edit]Opérateurs
[edit]Opérateurs mathématiques disponibles :
Commande | Description | Emplacement | Exemple |
---|---|---|---|
+ , - , * , /
|
pour additionner, soustraire, multiplier ou diviser des nombres | ||
< , > , = , != , <= , >=
|
pour les comparer. | "abc" < "abd" est vrai (comparaison lexicographique)
|
Les conditions booléennes de type ET peuvent être combinées avec &&
(le ET logique: a && b
est vrai si a
et b
sont vrais) et celles de type OU avec ||
(le OU logique: a || b
est vrai si soit l'un soit l'autre soit les deux a
et b
sont vrais).
Fonctions d'agrégation
[edit]Commande | Description | Emplacement | Exemple |
---|---|---|---|
COUNT
|
|||
SUM
|
|||
AVG
|
|||
MIN
|
|||
MAX
|
|||
SAMPLE
|
|||
GROUP_CONCAT
|
Filtres
[edit]Commande | Description | Emplacement | Exemple |
---|---|---|---|
FILTER
|
filtrer les données selon des critères prédéfinis | FILTER (?age> 40)FILTER(LANG(?humainLabel) = "[AUTO_LANGUAGE]"). #autre méthode que de faire appel au service de libellés
FILTER(STRSTARTS(?humainLabel, "Mr. ")).
FILTER(!REGEX(STR(?bblid), "[\\.q]")) #filtrer avec une expression régulière
FILTER ( ?item not in ( wd:Q4115189,wd:Q13406268,wd:Q15397819 ) ) #exclure des éléments spécifiques
FILTER ( NOT EXISTS { ?item wdt:P21 [] } ) # filtrer pour n'obtenir que des propriétés non renseignées
|
Combinaison de graphes
[edit]Commandes | Description | Exemple | |
---|---|---|---|
A.B | Réunir les solutions de A et de B en combinant les valeurs de variables communes. | être humains avec une date de naissance | ?human wd:P31 wdt:Q5
?human wd:P569 ?Naissance |
A OPTIONAL {B} | Valeurs optionnelles : réunir les résultats de A et B par leur valeurs en commun. Garder toutes les solutions de A qu'il y ait une solution dans B ou non. | être humains avec ou sans date de naissance | ?human wd:P31 wdt:Q5
OPTIONAL {?human wd:P569 ?Naissance} |
{A} UNION {B} | Union : réunir toutes les solutions de A et celles de B. | ||
A MINUS {B} | Différence : trouver les solutions de A et celles B et ne garder que les solutions de A qui ne sont pas compatibles avec celles de B | être humains sans date de naissance | ?human wd:P31 wdt:Q5
MINUS {?human wd:P569 ?Naissance} |
Commande | Description | Emplacement | Exemple |
---|---|---|---|
OPTIONAL | permet d’utiliser l’information requise si elle est présente et de ne pas
éliminer les solutions où elle est absente |
DansWHERE {…}
|
OPTIONAL (?DateNaissance) |
MINUS |
Exemple pas à pas
[edit]s'inspirer de https://s3.amazonaws.com/assets.datacamp.com/email/other/SQL+for+Data+Science.pdf
Requêtes de base
[edit]Obtenir la liste de tous les chats célèbres qui sont sur Wikidata
SELECT *
WHERE {?item wdt:P31 wd:Q146.}
Compter le nombre de chats célèbres
SELECT (COUNT(*) AS ?count)
WHERE {?item wdt:P31 wd:Q146.}
Afficher les libellés en français ou en anglais
SELECT ?item ?itemLabel
WHERE
{
?item wdt:P31 wd:Q146.
SERVICE wikibase:label { bd:serviceParam wikibase:language "fr,en". }
}
Liste de tous les chats avec la date de décès éventuelle
SELECT ?item ?itemLabel ?décès
WHERE
{
?item wdt:P31 wd:Q146.
OPTIONAL {?item wdt:P570 ?décès.}
SERVICE wikibase:label { bd:serviceParam wikibase:language "fr,en". }
}
Grouping, filtering and sorting
[edit]Afficher les 10 premiers résultats
SELECT ?item ?itemLabel
WHERE
{
?item wdt:P31 wd:Q146.
SERVICE wikibase:label { bd:serviceParam wikibase:language "fr,en". }
}
LIMIT 10
Lister les noms des chats par ordre anti-alphabétique
SELECT ?item ?itemLabel
WHERE
{
?item wdt:P31 wd:Q146.
SERVICE wikibase:label { bd:serviceParam wikibase:language "fr,en". }
}
ORDER BY DESC(?itemLabel)
Afficher le domaine d'activité des chats
SELECT ?item ?itemLabel ?occupationLabel
WHERE
{
?item wdt:P31 wd:Q146.
?item wdt:P106 ?occupation.
SERVICE wikibase:label { bd:serviceParam wikibase:language "fr,en". }
}
ORDER BY ?occupation
Lister les chats nés avant l'an 2000
SELECT ?item ?itemLabel
WHERE
{
?item wdt:P31 wd:Q146.
?item wdt:P569 ?naissance.
FILTER(?naissance < "2000-01-01T00:00:00Z"^^xsd:dateTime)
SERVICE wikibase:label { bd:serviceParam wikibase:language "fr,en". }
}
Lister des pays où sont nés 5 chats ou plus
SELECT ?paysLabel (COUNT(?item) as ?total)
WHERE
{
?item wdt:P31 wd:Q146.
?item wdt:P19 ?naissance.
?naissance wdt:P17 ?pays.
SERVICE wikibase:label { bd:serviceParam wikibase:language "fr,en". }
}
GROUP BY ?paysLabel
HAVING (?total >=5)
Affichage des résultats
[edit]Afficher les portraits des chats
#title:Chats, avec des images
#defaultView:ImageGrid
SELECT ?item ?itemLabel ?pic WHERE {
?item wdt:P31 wd:Q146;
wdt:P18 ?pic.
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
}
Afficher la carte des lieux de naissance des chats
#defaultView:Map
SELECT ?item ?itemLabel ?coordonnées
WHERE {
?item wdt:P31 wd:Q146.
?item wdt:P19 ?naissance.
?naissance wdt:P625 ?coordonnées.
SERVICE wikibase:label { bd:serviceParam wikibase:language "fr" }
}
MEMENTO SPARQL n°3. Niveau avancé
[edit]Classes instances et chemins de propriétés
[edit]deux propriétés pour « est » : instance of (P31) et subclass of (P279).
?oeuvre wdt:P31 wd:Q838948. # instance d'une œuvre d'art
?oeuvre wdt:P31/wdt:P279* wd:Q838948. # instance de n'importe quelle sous-classe d'une œuvre d'art
wd:Q1339 wdt:P40+ ?descendant #tous les descendants de Bach, sans Bach
wd:Q1339 wdt:P40* ?descendant #tous les descendants de Bach, avec Bach
?descendant (wdt:P22|wdt:P25)+ wd:Q1339.
Qualificateurs, références, rangs
[edit]wd:Q12418 p:P186 ?statement1. # Mona Lisa: material used: ?statement1
?statement1 ps:P186 wd:Q296955. # value: oil paint
wd:Q12418 p:P186 ?statement2. # Mona Lisa: material used: ?statement2
?statement2 ps:P186 wd:Q291034. # value: poplar wood
?statement2 pq:P518 wd:Q861259. # qualifier: applies to part: painting surface
wd:Q12418 p:P186 ?statement3. # Mona Lisa: material used: ?statement3
?statement3 ps:P186 wd:Q287. # value: wood
?statement3 pq:P518 wd:Q1737943. # qualifier: applies to part: stretcher bar
?statement3 pq:P580 1951. # qualifier: start time: 1951 (pseudo-syntax)
- préfixe
p:
ne pointe pas sur l'objet, mais sur le "nœud de déclaration" - préfixe
ps:
pointe sur l'objet de la déclaration - préfixe
pq:
pointe sur les qualificatifs, prov:wasDerivedFrom
pointe sur les nœuds de référence
Références
Rang
Interwikis et badges
BIND, BOUND, IF, COALESCE
[edit]BIND(FLOOR((?Mort - ?ne)/365.2425) AS ?age).
https://www.youtube.com/watch?v=4MjAbt9C61Y&list=PLaa8QYrMzXNnzY-4YVM5507iZuESWVcnU&index=4
Fonctions
[edit]chaînes de caractères | UCASE() | convert to upper-case | |
LCASE() | convert to lower-case | ||
STRLEN() | length of a string | ||
SUBSTR() | substring of first arg, second arg: start position; third arg: character lenght | ||
STRSTARTS() | string in first arg starts with string in second arg | ||
STRENDS() | string in first arg ends with string in second arg | ||
CONTAINS() | string in second arg is within first arg | CONTAINS("SPARQL", "QL") is True
| |
CONCAT, ENCODE_FOR_URI, REPLACE, REGEX, STRBEFORE
|
|||
Opérateurs logiques | sameTerm, !sameTerm | more efficient and =
|
|
= , != , > , >= , < , <=
|
|||
AND: && OR: ||
|
|||
IN and NOT IN
|
?foo IN ("bar", "anotherbar")
| ||
isIRI | |||
isBlank | only bank nodes FILTER (isBlank(?term)) filter out FILTER (!isBlank(?term))
|
||
isLiteral | |||
Fonctions | lang | returns the language tag | FILTER(lang(?label) = 'es')
|
datatype | returns the datatype of a literal | BIND( datatype(?shoeSize) AS ?datatype)
| |
Fonctions d'agrégation | COUNT | ||
SUM | |||
AVG | |||
MIN, MAX | |||
SAMPLE | |||
GROUP_CONTACT | |||
Mathématiques | ABS, ROUND, CEIL, FLOOR, RAND, COUNT, MIN, MAX, AVG, SUM<
|
#Nombre d'êtres humains dans Wikidata
SELECT (COUNT(*) AS ?count)
WHERE {?item wdt:P31 wd:Q5 .}
# ???
?occ
(count(?p) as ?count)
(round(avg(?birthYear)) as ?avgBirthYear)
(avg(?deathYear - ?birthYear) as ?avgAge)
| |
Arithmétique | +, -, *, /
|
||
Conversion | xsd:integer, xsd:string STR, LANG, DATATYPE, URI, STRDT, STRLANG
|
||
Comparaison | =, !=, <, <=, >, >=
|
||
Conditionnel | IF, COALESCE
|
||
Test | isURI, isBlank, isLiteral, bound, sameTerm, langMatches, regex
|
||
Date | NOW, YEAR, MONTH, DAY, HOURS, MINUTES, SECONDS, TIMEZONE
|
||
Constructeurs | URI, BNODE, STRDT, STRLANG
|
Wikidata:SPARQL query service/Wikidata Query Help/SPARQL Editor/en
SELECT ?person ?personLabel (group_concat(?citizenshipLabel;separator="/") as ?citizenships)
SELECT … (YEAR(?date) as ?year)
# événements à une date précise
?item wdt:P585 "+1789-07-14T00:00:00Z"^^xsd:dateTime.
# événements entre deux dates
FILTER (YEAR(?time) > 1450 && YEAR(?time) < 1454 )
FILTER ((?time > "1452-01-01"^^xsd:dateTime) && (?time < "1452-12-31"^^xsd:dateTime)).
#Personnes nées en 1700 avec précision du jour ou du mois
VALUES ?precision { 10 11 }#10 = month precision, 11 = day precision
?item p:P569/psv:P569 [wikibase:timePrecision ?precision; wikibase:timeValue ?time].
FILTER ( YEAR(?time) = 1700 ).
# ???
SELECT DISTINCT (year(?birthdate) as ?birthyear)
# ???
(CONCAT(SAMPLE(?sKey),": ",STR(YEAR(SAMPLE(?s)))) AS ?start)
# ???
?p wdt:P31 wd:Q5 .
?p wdt:P106 ?occ .
?p p:P569/psv:P569 [
wikibase:timePrecision "9"^^xsd:integer ; # precision of at least year
wikibase:timeValue ?birth ];
# ???
BIND(CONCAT(STR(YEAR(?date)),"-",STR(MONTH(?date))) as ?yearmonth).
# ???
?person wdt:P31 wd:Q5;
p:P570/psv:P570 [
wikibase:timePrecision ?precision ;
wikibase:timeValue ?date ;
] .
BIND(CONCAT(STR(YEAR(?date)),"-",STR(MONTH(?date))) as ?yearmonth).
FILTER( ?date >= "2000-01-01T00:00:00"^^xsd:dateTime )
FILTER( ?precision >= "10"^^xsd:integer ) # precision of at least month
Fonctions avancées
[edit]- Requêtes imbriquées : utiliser les résultats d’une requête pour formuler une autre requête ({ SELECT ... WHERE { ... } LIMIT 10 })
- Requêtes fédérées
- Lexèmes
- Service MWAPI
- Insérer une image manquante :
optional { ?item wdt:P18 ?img_ .}
bind (if(bound(?img_),
?img_,
<http://commons.wikimedia.org/wiki/Special:FilePath/File:Profile_avatar_placeholder_large.png>) as ?image)
Outils
[edit]- Arbre des classes obtenu à l’aide de la propriété P31 “nature de l’élément” pour la classe Q571 “livre” avec Wikidata Graph Builder
https://angryloki.github.io/wikidata-graph-builder/?property=P279&item=Q571&lang=fr&iterations=2
- Autres endpoint SPARQL
A TRIER
[edit]OPTIONAL exemple : OPTIONAL { ?livre wdt:P1476 ?titre. }
- Use
INCLUDE
to avoid time outs. You can extract parts of your query in a subquery and include them with the INCLUDE statement.
VALUES ?foo
- coordonnées : Functions geof:globe, geof:latitude & geof:longitude return parts of a coordinate - globe URI, latitude and longitude accordingly.