Пример #1
0
 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();
 }
Пример #2
0
 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;
 }
Пример #5
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());
 }
Пример #6
0
 public function testFormat()
 {
     $queryBuilder = new QueryBuilder();
     $this->assertEquals("SELECT * WHERE {\n}\n", $queryBuilder->format());
 }
Пример #7
0
 /**
  * Adds the given subquery.
  *
  * @param QueryBuilder $queryBuilder
  * @return self
  * @throws InvalidArgumentException
  */
 public function subquery(QueryBuilder $queryBuilder)
 {
     $this->subqueries[] = $queryBuilder->getSPARQL(false);
     $this->usageValidator->trackDefinedVariables(implode(' ', $queryBuilder->getSelects()));
     // @todo temp hack to add AS definitions to defined variables
     $regexHelper = new RegexHelper();
     $matches = $regexHelper->getMatches('AS \\{variable}', implode(' ', $queryBuilder->getSelects()));
     $this->usageValidator->trackDefinedVariables($matches);
     return $this;
 }
 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;
 }
Пример #9
0
 public function testSubquery()
 {
     $graphBuilder = new GraphBuilder(new UsageValidator());
     $queryBuilder = new QueryBuilder();
     $queryBuilder->where('?a', '?b', '?c');
     $this->assertSame($graphBuilder, $graphBuilder->subquery($queryBuilder));
     $this->assertEquals(' { SELECT * WHERE { ?a ?b ?c . } }', $graphBuilder->getSPARQL());
 }