public function testUndefinedVariableDetected() { $queryBuilder = new QueryBuilder(self::$prefixes); $queryBuilder->select('?email')->where('?person', 'test:name', '?name')->also('test:age', '?age'); $this->setExpectedException('RangeException', '?email'); $queryBuilder->getSPARQL(); }
public function getPropertyEntityIdValueMatches(PropertyId $propertyId, EntityId $valueId) { $propertyText = $propertyId->getSerialization(); $valueText = $valueId->getSerialization(); $queryBuilder = new QueryBuilder($this->config->get('WikidataQueryPrefixes')); $queryBuilder->select('?id')->where("?id", "wdt:{$propertyText}", "wd:{$valueText}"); $queryExecuter = new QueryExecuter($this->config->get('WikidataQueryUrl')); $results = $queryExecuter->execute($queryBuilder->getSPARQL()); return $this->parseResults($results); }
/** * @param array $simpleQueryParts * eg. 'P1:Q2' OR 'P5:?' * * @return ItemId[] */ public function getItemIdsForSimpleQueryParts(array $simpleQueryParts) { if (empty($simpleQueryParts)) { throw new InvalidArgumentException("Can't run a SPARQL query with no simple parts"); } $queryBuilder = new QueryBuilder(array('prov' => 'http://www.w3.org/ns/prov#', 'wd' => 'http://www.wikidata.org/entity/', 'wdt' => 'http://www.wikidata.org/prop/direct/', 'p' => 'http://www.wikidata.org/prop/')); $queryBuilder->select('?item'); foreach ($simpleQueryParts as $key => $simpleQueryPart) { list($propertyIdString, $entityIdString) = explode(':', $simpleQueryPart); if ($entityIdString == '?') { $queryBuilder->where('?item', "wdt:{$propertyIdString}", '?' . str_repeat('z', $key)); } else { $queryBuilder->where('?item', "wdt:{$propertyIdString}", "wd:{$entityIdString}"); } } return $this->getItemIdsFromQuery($queryBuilder->__toString()); }
protected function execute(InputInterface $input, OutputInterface $output) { $user = $input->getOption('user'); $userDetails = $this->appConfig->offsetGet('users.' . $user); if ($userDetails === null) { throw new RuntimeException('User not found in config'); } $wiki = $input->getOption('wiki'); $wikiDetails = $this->appConfig->offsetGet('wikis.' . $wiki); if ($wikiDetails === null) { throw new RuntimeException('Wiki not found in config'); } $sparql = $input->getOption('sparql'); if ($sparql === null || empty($sparql)) { throw new RuntimeException('SPARQL endpoint must be passed'); } $this->setServices($wikiDetails['url'], $sparql); $propertyString = $input->getOption('property'); $property = new PropertyId($propertyString); if ($propertyString === null || $propertyString === '' || $property === null) { throw new RuntimeException('No property given'); } $output->writeln('Running SPARQL query to find items to check'); $queryBuilder = new QueryBuilder(array('wdt' => 'http://www.wikidata.org/prop/direct/')); $itemIds = $this->sparqlQueryRunner->getItemIdsFromQuery($queryBuilder->select('?item')->where('?item', 'wdt:' . $propertyString, '?value')->limit(10000)->__toString()); $loggedIn = $this->wikibaseApi->login(new ApiUser($userDetails['username'], $userDetails['password'])); if (!$loggedIn) { $output->writeln('Failed to log in to wikibase wiki'); return -1; } $itemLookup = $this->wikibaseFactory->newItemLookup(); $statementRemover = $this->wikibaseFactory->newStatementRemover(); foreach ($itemIds as $itemId) { $item = $itemLookup->getItemForId($itemId); foreach ($item->getStatements()->getIterator() as $statement) { if ($statement->getPropertyId()->equals($property)) { $statementRemover->remove($statement, new EditInfo('Removing Statement')); } } } return 0; }
public function testAliasesOfPropertiesWhichAreUsedMoreThanOnce() { $queryBuilder = new QueryBuilder(self::$prefixes + array('skos' => 'http://www.w3.org/2004/02/skos/core#')); $queryBuilder->select('?property', '?alias', '?occurences')->subquery($queryBuilder->newSubquery()->select('?alias', '(COUNT (?alias) AS ?occurences)')->where('?tmp', 'a', 'wikibase:Property')->also('skos:altLabel', '?alias')->filter('LANG (?alias) = "en"')->groupBy('?alias'))->where('?property', 'a', 'wikibase:Property')->also('skos:altLabel', '?alias')->filter('?occurences > 1')->orderBy('?alias'); $this->assertIsExpected('Aliases_of_properties_which_are_used_more_than_once', $queryBuilder->format()); }
public function testGetSPARQL_undefinedVariable() { $queryBuilder = new QueryBuilder(); $this->setExpectedException('RangeException', '?x'); $queryBuilder->select('?x')->getSPARQL(); }
protected function execute(InputInterface $input, OutputInterface $output) { // Get options $user = $input->getOption('user'); $userDetails = $this->appConfig->offsetGet('users.' . $user); if ($userDetails === null) { throw new RuntimeException('User not found in config'); } $items = $input->getOption('item'); if (empty($items)) { $output->writeln('Running SPARQL query to find items to check'); $queryBuilder = new QueryBuilder(array('prov' => 'http://www.w3.org/ns/prov#', 'wd' => 'http://www.wikidata.org/entity/', 'wikibase' => 'http://wikiba.se/ontology#', 'prv' => 'http://www.wikidata.org/prop/reference/value/')); $itemIds = $this->sparqlQueryRunner->getItemIdsFromQuery($queryBuilder->select('?item')->where('?ref', 'prv:P813', '?value')->also('?value', 'wikibase:timeCalendarModel', 'wd:Q1985786')->also('?st', 'prov:wasDerivedFrom', '?ref')->also('?item', '?pred', '?st')->limit(10000)->__toString()); } else { /** @var ItemId[] $itemIds */ $itemIds = array(); foreach (array_unique($items) as $itemIdString) { $itemIds[] = new ItemId($itemIdString); } } $itemIds = array_unique($itemIds); $output->writeln('Running for ' . count($itemIds) . ' items'); // Log in to Wikidata $loggedIn = $this->wikibaseApi->login(new ApiUser($userDetails['username'], $userDetails['password'])); if (!$loggedIn) { $output->writeln('Failed to log in to wikidata wiki'); return -1; } $itemLookup = $this->wikibaseFactory->newItemLookup(); foreach ($itemIds as $itemId) { $output->write($itemId->getSerialization() . ' '); $item = $itemLookup->getItemForId($itemId); foreach ($item->getStatements()->getIterator() as $statement) { foreach ($statement->getReferences() as $reference) { /** @var Reference $reference */ foreach ($reference->getSnaks()->getIterator() as $snak) { if ($snak instanceof PropertyValueSnak) { if ($snak->getPropertyId()->getSerialization() == 'P813') { /** @var TimeValue $dataValue */ $dataValue = $snak->getDataValue(); // We can assume ALL retrieval dates should be Gregorian! if ($dataValue->getCalendarModel() === TimeValue::CALENDAR_JULIAN) { $oldRefHash = $reference->getHash(); $statementGuid = $statement->getGuid(); $snakList = $reference->getSnaks(); $snakList = new SnakList($snakList->getArrayCopy()); $snakList->removeSnak($snak); $fixedTimestamp = $this->getFixedTimestamp($dataValue->getTime()); if ($fixedTimestamp) { $snakList->addSnak(new PropertyValueSnak(new PropertyId('P813'), new TimeValue($fixedTimestamp, $dataValue->getTimezone(), $dataValue->getBefore(), $dataValue->getAfter(), $dataValue->getPrecision(), TimeValue::CALENDAR_GREGORIAN))); $editSummary = 'Fix reference retrieval date'; $output->write('.'); } else { //TODO optionally remove rather than always doing so? $editSummary = 'Removing bad reference retrieval date'; $output->write('x'); } try { $this->wikibaseFactory->newReferenceSetter()->set(new Reference($snakList), $statementGuid, $oldRefHash, new EditInfo($editSummary)); } catch (UsageException $e) { $output->writeln(''); $output->write($e->getMessage()); } } } } } } } $output->writeln(''); } return 0; }