DBpedia importation des données - Raphix93/2HS2179_militants-pour-la-paix GitHub Wiki
Extraction de la liste "person"
[!NOTE] Effectif de la liste (08.12.2024) : 369 personnes
Lien vers les fichiers d'import csv
Lien vers la base de données
Cette requête SPARQL extrait les personnes (?o1) associées à la ressource List_of_peace_activists sur DBpedia en conservant leurs sources sous la forme d'un uri (?subject_uri). Elle récupère leur année de naissance (?birthYear), calculée à partir de leur date de naissance, ainsi que leur label en anglais (?label). Les résultats incluent uniquement les individus nés après 1800 et sont triés par année de naissance croissante.
PREFIX dbr: <http://dbpedia.org/resource/>
PREFIX dbp: <http://dbpedia.org/property/>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT DISTINCT (?o1 AS ?subject_uri) ?birthYear ?label
WHERE {
dbr:List_of_peace_activists ?p ?o1.
?o1 a dbo:Person;
dbo:birthDate ?birthDate;
rdfs:label ?langLabel.
BIND(xsd:integer(SUBSTR(STR(?birthDate), 1, 4)) AS ?birthYear)
BIND(STR(?langLabel) AS ?label)
FILTER (?birthYear >= 1800 && LANG(?langLabel) = 'en')
}
ORDER BY ?birthYear
Effacer les tables
Description
[!NOTE] Le script fourni dans les consignes ne fonctionnait pas pour moi, j'ai procédé table par table pour remettre mes tables à zero.
Ce script réinitialise la base de données en supprimant toutes les données des tables, en réinitialisant les compteurs d'auto-incrémentation, et en optimisant la base. Il désactive temporairement les clés étrangères pour éviter les conflits lors des suppressions, puis les réactive après les modifications. Enfin, la commande VACUUM exécutée ensuite libère l'espace inutilisé.
PRAGMA foreign_keys = OFF;
-- Suppression des données dans chaque table
DELETE FROM occupation;
DELETE FROM geographical_place;
DELETE FROM pursuit;
DELETE FROM birth;
DELETE FROM organization;
DELETE FROM membership;
DELETE FROM publication;
DELETE FROM document;
DELETE FROM obtainment;
DELETE FROM award;
DELETE FROM person;
-- Réinitialisation des auto-incrémentations
DELETE FROM sqlite_sequence WHERE name = 'occupation';
DELETE FROM sqlite_sequence WHERE name = 'geographical_place';
DELETE FROM sqlite_sequence WHERE name = 'pursuit';
DELETE FROM sqlite_sequence WHERE name = 'birth';
DELETE FROM sqlite_sequence WHERE name = 'organization';
DELETE FROM sqlite_sequence WHERE name = 'membership';
DELETE FROM sqlite_sequence WHERE name = 'publication';
DELETE FROM sqlite_sequence WHERE name = 'document';
DELETE FROM sqlite_sequence WHERE name = 'obtainment';
DELETE FROM sqlite_sequence WHERE name = 'award';
DELETE FROM sqlite_sequence WHERE name = 'person';
PRAGMA foreign_keys = ON;
VACUUM;
Importer les personnes
Lien vers les fichiers d'import csv
Lien vers la base de données
Chercher les doublons
Ce script vérifie l'absence de doublons dans person_uri et compte le nombre total d'enregistrements dans la table dbp_liste_personnes.
-- si le résultat est vide (pas de lignes) il n'y a pas de doublons
SELECT person_uri
FROM dbp_liste_personnes lp
GROUP BY person_uri
HAVING COUNT(*) > 1 ;
-- compter les personnes à importer
SELECT COUNT(*)
FROM dbp_liste_personnes lp;
Insérer les personnes
Ce script insère dans la table _person _les données issues de dbp_liste_personnes, avec une métadonnée indiquant leur provenance et la date d'importation.
INSERT INTO person (birth_year, dbpedia_uri, import_metadata)
SELECT birthYear, subject_uri, "Importé le 01 décembre 2024 depuis le résultat d'une requête SPARQL sur DBPedia (voir: https://github.com/Raphix93/2HS2179_militants-pour-la-paix/wiki/DBpedia-importation-des-données) "
FROM dbp_liste_personnes lp ;
Ajouter les noms
Ce script met à jour la colonne name de la table person en extrayant et en nettoyant le nom depuis label.
UPDATE person
SET label = TRIM(REPLACE(SUBSTR(dbpedia_uri,LENGTH('http://dbpedia.org/resource/')+ 1), '_', ' '));
Création des lignes dans la table référence contenant l'URI
INSERT INTO reference (fk_person , exact_reference , fk_document , fk_reference_type)
SELECT pk_person, dbpedia_uri, 1, 1
FROM person p ;
Importer les occupations
Lien vers les fichiers d'import csv
Lien vers la base de données
Liste des occupations
PREFIX dbr: <http://dbpedia.org/resource/>
PREFIX dbp: <http://dbpedia.org/property/>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>
SELECT DISTINCT (?o1 AS ?subject_uri) (dbo:occupation as ?property_uri) (?target AS ?object_uri) (?name as ?label)
#(COUNT(*) AS ?effectif)
WHERE {
SELECT DISTINCT ?o1 ?target (str(?label) as ?name)
WHERE {
dbr:List_of_peace_activists ?p ?o1.
?o1 a dbo:Person;
dbp:birthDate | dbo:birthDate ?birthDate;
dbp:occupation | dbo:occupation ?target.
?target rdfs:label ?label.
BIND(xsd:integer(SUBSTR(STR(?birthDate), 1, 4)) AS ?birthYear)
FILTER ( (?birthYear >= 1800 ) && LANG(?label) = 'en')
}
ORDER BY ?birthYear
}
Création des occupations / activités
Cette requête SQL regroupe les enregistrements de la table dbp_occupation par label (label) et URI d'objet (object_uri). Elle compte le nombre d'occurrences pour chaque combinaison (COUNT(*) AS effectif) et trie les résultats par ordre décroissant de cet effectif (ORDER BY effectif DESC). Elle permet d'identifier les occupations les plus fréquentes pour nos personnes (person).
SELECT label , object_uri , COUNT(*) AS effectif
FROM dbp_occupation do
GROUP BY label, object_uri
ORDER BY effectif DESC ;
Cette suite de requêtes ci-dessous insère dans la table occupation des données uniques sur les occupations (original_uri, label) issues de la table dbp_occupation, en regroupant les résultats par URI et nom. Ensuite, elle inspecte les données insérées dans occupation, puis analyse les relations entre les personnes (person) et leurs occupations (occupation) via la table de jointure dbp_occupation, en affichant les labels correspondants.
INSERT INTO occupation (original_uri, label)
SELECT target, name
FROM dbp_occupation do
GROUP BY target, name
ORDER BY name;
--puis on inspecte le résultat
SELECT label, original_uri
FROM occupation o ;
/*
on inspecte les données à travers la table jointure dbp_occupation
*/
SELECT p.label, o.label
FROM dbp_occupation do
JOIN person p ON p.dbpedia_uri = do.subject_uri
JOIN occupation o ON o.original_uri = do.target ;
Table pursuit
Cette requête insère dans la table pursuit les relations entre les personnes et leurs occupations en utilisant leurs clés primaires. Elle associe les identifiants des personnes (fk_person) et des occupations (fk_occupation) en effectuant des jointures entre la table de jointure dbp_occupation, la table des personnes (person), et celle des occupations (occupation).
INSERT INTO pursuit (fk_person, fk_occupation )
SELECT p.pk_person, o.pk_occupation
FROM dbp_occupation do
JOIN person p ON p.dbpedia_uri = do.subject_uri
JOIN occupation o ON o.original_uri = do.target ;