fetchData(); $this->importData($data); } /** * Fetch data from Wikidata or cache. */ protected function fetchData(): array { $endpoint = 'https://query.wikidata.org/sparql'; $query = " SELECT ?property ?propertyType ?propertyLabel ?propertyDescription ?propertyAltLabel WHERE { ?property wikibase:propertyType ?propertyType . SERVICE wikibase:label { bd:serviceParam wikibase:language \"fr\". } } ORDER BY ASC(xsd:integer(STRAFTER(STR(?property), 'P')))"; $response = Http::throw()->timeout(60)->withHeaders(['Accept' => 'application/sparql-results+json']) ->get($endpoint, ['query' => $query]); return $response->json(); } /** * Import data into the database. */ protected function importData(array $data): void { $total = count($data['results']['bindings']); $this->info("Starting import of $total Wikidata properties."); $bar = $this->output->createProgressBar($total); $bar->start(); DB::transaction(function () use ($data, &$bar) { $batchSize = 200; foreach (array_chunk($data['results']['bindings'], $batchSize) as $batch) { $this->insertBatch($batch, $bar); } }); $bar->finish(); $this->newLine(2); $this->info('Properties imported successfully.'); } /** * Insert a batch of properties into the database. * * @param \Symfony\Component\Console\Helper\ProgressBar $bar */ protected function insertBatch(array $batch, $bar): void { $upsertData = []; foreach ($batch as $result) { $propertyId = str_replace('http://www.wikidata.org/entity/', '', $result['property']['value']); $upsertData[] = [ 'property_id' => $propertyId, 'property_type' => $result['propertyType']['value'] ?? null, 'label' => $result['propertyLabel']['value'] ?? null, 'description' => $result['propertyDescription']['value'] ?? null, 'alt_label' => $result['propertyAltLabel']['value'] ?? null, ]; $bar->advance(); } WikidataProperty::upsert($upsertData, 'property_id', ['property_type', 'label', 'description', 'alt_label']); } }