Recherche wikidata avec sparql
Choix de la requête :
Essayer un exemple : Charlesde VinciLouis XIVMarie CurieDupont
# Recherche de personnes ayant un article wikipedia en français
# Remplacer "__replace__" par la valeur souhaitée ('léonard de vinci", 'albert einstein', 'louis xiv', 'dupont', ...)
SELECT distinct ?item ?itemLabel ?articleLabel ?itemDescription
(SAMPLE(?image) as ?image) # on peut avoir +eurs images (évite les doublons dans les résultats)
WITH {
SELECT * WHERE {
BIND (LCASE("__REPLACE__") AS ?searchfor1)
BIND (REPLACE(?searchfor1, "[à âä]", "a") AS ?searchfor2)
BIND (REPLACE(?searchfor2, "[éèêë]", "e") AS ?searchfor)
}
} AS %p
WITH {
SELECT ?item
WHERE {
INCLUDE %p
BIND (CONCAT("haswbstatement:P31=Q5 ", ?searchfor) AS ?searchstr)
SERVICE wikibase:mwapi {
bd:serviceParam wikibase:endpoint "www.wikidata.org" ;
wikibase:api "Generator" ;
mwapi:generator "search" ;
mwapi:gsrsearch ?searchstr ; # Full-text search in wiki.
mwapi:gsrnamespace "0" ;
mwapi:language "fr" ;
wikibase:limit 100 ;
mwapi:gsrprop "" .
?item wikibase:apiOutputItem mwapi:title .
}
}
} AS %i
WHERE {
INCLUDE %i
INCLUDE %p
# Filtre sur le label. L'article concerné doit contenir la recherche initiale dans son titre
# Si on filtre sur le nom : 'da Vinci' uniquement pour Léonard de Vinci.
# Le label est plus souple (+eurs labels associés à un elt, ie léonard, leonard, ...) et permet de filtrer par nom + prénom
# inconvénient recherche par label : trouve Piotr Yakoubovitchp pour Charles Baudelaire
?item rdfs:label ?itemLabel .
FILTER (LANG(?itemLabel)="fr")
BIND (REPLACE(LCASE(?itemLabel), "[à âä]", "a") AS ?itemLabel1)
BIND (REPLACE(?itemLabel1, "[éèêë]", "e") AS ?itemLabel2)
# filtre les résultats obtenus :
# - si la recherche contient un espace, on vérifie que le label contient les 2 mots (permet d'inverser le nom et le prénom)
# - sinon on vérifie que le label contient la recherche glolable
BIND(STRAFTER(?searchfor, " ") as ?afterSpace)
BIND(STRBEFORE(?searchfor, " ") as ?beforeSpace)
BIND(contains(?searchfor, " ") as ?containsSpace)
FILTER(
CONTAINS(?itemLabel2, ?searchfor)
|| (
?containsSpace = true
&& CONTAINS(?itemLabel2, ?beforeSpace)
&& CONTAINS(?itemLabel2, ?afterSpace)
)
)
# article wikipédia français associé
?article schema:about ?item .
?article schema:inLanguage "fr" .
?article schema:isPartOf <https://fr.wikipedia.org/>.
OPTIONAL { ?item wdt:P18 ?image }
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],fr". }
}
GROUP BY ?item ?itemLabel ?articleLabel ?itemDescription
# Recherche de personnes ayant un article wikipedia en français
# Remplacer "__replace__" par la valeur souhaitée ('léonard de vinci", 'albert einstein', 'louis xiv', 'dupont', ...)
SELECT distinct ?item ?itemLabel ?articleLabel ?itemDescription
(SAMPLE(?image) as ?image) # on peut avoir +eurs images (évite les doublons dans les résultats)
WITH {
SELECT * WHERE {
BIND (LCASE("__REPLACE__") AS ?searchfor1)
BIND (REPLACE(?searchfor1, "[à âä]", "a") AS ?searchfor2)
BIND (REPLACE(?searchfor2, "[éèêë]", "e") AS ?searchfor)
}
} AS %p
WITH {
SELECT ?item
WHERE {
INCLUDE %p
BIND (CONCAT("haswbstatement:P31=Q5 ", ?searchfor) AS ?searchstr)
SERVICE wikibase:mwapi {
bd:serviceParam wikibase:endpoint "www.wikidata.org" ;
wikibase:api "Generator" ;
mwapi:generator "search" ;
mwapi:gsrsearch ?searchstr ; # Full-text search in wiki.
mwapi:gsrnamespace "0" ;
mwapi:language "fr" ;
wikibase:limit 100 ;
mwapi:gsrprop "" .
?item wikibase:apiOutputItem mwapi:title .
}
}
} AS %i
WHERE {
INCLUDE %i
INCLUDE %p
# Filtre sur le label. L'article concerné doit contenir la recherche initiale dans son titre
# Si on filtre sur le nom : 'da Vinci' uniquement pour Léonard de Vinci.
# Le label est plus souple (+eurs labels associés à un elt, ie léonard, leonard, ...) et permet de filtrer par nom + prénom
# inconvénient recherche par label : trouve Piotr Yakoubovitchp pour Charles Baudelaire
?item rdfs:label ?itemLabel .
FILTER (LANG(?itemLabel)="fr")
BIND (REPLACE(LCASE(?itemLabel), "[à âä]", "a") AS ?itemLabel1)
BIND (REPLACE(?itemLabel1, "[éèêë]", "e") AS ?itemLabel2)
# filtre les résultats obtenus :
# - si la recherche contient un espace, on vérifie que le label contient les 2 mots (permet d'inverser le nom et le prénom)
# - sinon on vérifie que le label contient la recherche glolable
BIND(STRAFTER(?searchfor, " ") as ?afterSpace)
BIND(STRBEFORE(?searchfor, " ") as ?beforeSpace)
BIND(contains(?searchfor, " ") as ?containsSpace)
FILTER(
CONTAINS(?itemLabel2, ?searchfor)
|| (
?containsSpace = true
&& CONTAINS(?itemLabel2, ?beforeSpace)
&& CONTAINS(?itemLabel2, ?afterSpace)
)
)
# article wikipédia français associé
?article schema:about ?item .
?article schema:inLanguage "fr" .
?article schema:isPartOf <https://fr.wikipedia.org/>.
OPTIONAL { ?item wdt:P18 ?image }
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],fr". }
}
GROUP BY ?item ?itemLabel ?articleLabel ?itemDescription
# Variation sur la requête 1 : recherche par label
# Recherche de personnes ayant un article wikipedia en français
# Remplacer "__replace__" par la valeur souhaitée ('léonard de vinci', 'albert einstein', 'louis xiv', 'dupont', ...)
SELECT distinct ?natureLabel ?item ?itemLabel ?articleLabel ?itemDescription
(SAMPLE(?image) as ?image) # on peut avoir +eurs images (évite les doublons dans les résultats)
WITH {
SELECT * WHERE {
BIND (LCASE("__REPLACE__") AS ?searchfor1)
BIND (REPLACE(?searchfor1, "[à âä]", "a") AS ?searchfor2)
BIND (REPLACE(?searchfor2, "[éèêë]", "e") AS ?searchfor)
}
} AS %p
WITH {
SELECT ?item
WHERE {
INCLUDE %p
BIND (CONCAT("inlabel:", ?searchfor) AS ?searchstr) # IN LABEL
SERVICE wikibase:mwapi {
bd:serviceParam wikibase:endpoint "www.wikidata.org" ;
wikibase:api "Generator" ;
mwapi:generator "search" ;
mwapi:gsrsearch ?searchstr ;
mwapi:gsrnamespace "0" ;
mwapi:language "fr" ;
wikibase:limit 100 ;
mwapi:gsrprop "" .
?item wikibase:apiOutputItem mwapi:title .
}
}
} AS %i
WHERE {
INCLUDE %i
INCLUDE %p
# Filtre sur le label. L'article concerné doit contenir la recherche initiale dans son titre
# Si on filtre sur le nom : 'da Vinci' uniquement pour Léonard de Vinci.
# Le label est plus souple (+eurs labels associés à un elt, ie léonard, leonard, ...) et permet de filtrer par nom + prénom
# inconvénient recherche par label : trouve Piotr Yakoubovitchp pour Charles Baudelaire
?item rdfs:label ?itemLabel .
FILTER (LANG(?itemLabel)="fr")
BIND (REPLACE(LCASE(?itemLabel), "[à âä]", "a") AS ?itemLabel1)
BIND (REPLACE(?itemLabel1, "[éèêë]", "e") AS ?itemLabel2)
# filtre les résultats obtenus :
# - si la recherche contient un espace, on vérifie que le label contient les 2 mots (permet d'inverser le nom et le prénom)
# - sinon on vérifie que le label contient la recherche glolable
BIND(STRAFTER(?searchfor, " ") as ?afterSpace)
BIND(STRBEFORE(?searchfor, " ") as ?beforeSpace)
BIND(contains(?searchfor, " ") as ?containsSpace)
FILTER(
CONTAINS(?itemLabel2, ?searchfor)
|| (
?containsSpace = true
&& CONTAINS(?itemLabel2, ?beforeSpace)
&& CONTAINS(?itemLabel2, ?afterSpace)
)
)
# article wikipédia français associé
?article schema:about ?item .
# ?article schema:inLanguage "fr" .
?article schema:isPartOf <https://fr.wikipedia.org/>.
?item wdt:P31 wd:Q5.
OPTIONAL { ?item wdt:P18 ?image }
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],fr". }
}
GROUP BY ?item ?itemLabel ?articleLabel ?itemDescription ?natureLabel
SELECT ?num ?item ?itemLabel ?itemDescription ?articleLabel
# SAMPLE et GROUP_CONCAT évitent les doublons dans les résultats (images et natures multiples pour 1 item)
(SAMPLE(?image) as ?image) # garde seulement la 1ere image
(GROUP_CONCAT(distinct ?natureLabel;separator=" | ") as ?natureLabels) # natures de chaque item séparés par des "|"
WHERE {
SERVICE wikibase:mwapi {
bd:serviceParam wikibase:endpoint "www.wikidata.org";
wikibase:api "EntitySearch";
mwapi:search "__REPLACE__";
mwapi:language "fr".
?item wikibase:apiOutputItem mwapi:item.
?num wikibase:apiOrdinal true.
}
?item (wdt:P279|wdt:P31) ?nature.
# ?item wdt:P31 wd:Q5.
?article schema:about ?item .
?article schema:isPartOf <https://fr.wikipedia.org/>.
OPTIONAL { ?item wdt:P18 ?image }
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],fr". }
SERVICE wikibase:label {
bd:serviceParam wikibase:language "[AUTO_LANGUAGE],fr".
?nature rdfs:label ?natureLabel. # label utilisé dans GROUP_CONCAT
}
}
GROUP BY ?item ?itemLabel ?itemDescription ?num ?articleLabel
ORDER BY ASC(?num)