예제 #1
0
 public function testGetBaseIriWithEmptyBaseReturnsModelIri()
 {
     $this->markTestNeedsTestConfig();
     $model1 = new Erfurt_Rdf_Model('http://example.org/');
     $model2 = new Erfurt_Rdf_Model('http://example.org/', 'http://example.org/resources/');
     $this->assertSame('http://example.org/', $model1->getBaseIri());
     $this->assertSame('http://example.org/resources/', $model2->getBaseIri());
 }
예제 #2
0
파일: Uri.php 프로젝트: FTeichmann/Erfurt
 /**
  * Transform a given string to full URI using the models namespaces if it 
  * is a qname or check the uri if it is not a qname
  *
  * @param $qname the input qname or uri candidate
  * @param $model the Erfurt model which is used to check for namespaces
  */
 public static function getFromQnameOrUri($qnameOrUri, Erfurt_Rdf_Model $model)
 {
     // test for qname
     if (preg_match(self::$_regExpQname, (string) $qnameOrUri) == 0) {
         // input is not a qname so test for Uri-ness and return uri
         if (!self::check($qnameOrUri)) {
             throw new Erfurt_Uri_Exception('The supplied string is neither a valid Qname nor Uri by syntax.');
         } else {
             // return checked Uri
             return $qnameOrUri;
         }
     } else {
         // input is qname so split it and build Uri from namespace if possible
         $parts = explode(':', $qnameOrUri);
         if (count($parts) > 1) {
             $prefix = $parts[0];
             $localName = $parts[1];
             $namespace = $model->getNamespaceByPrefix($prefix);
         } else {
             // it is a local name only
             $localName = $qnameOrUri;
             $namespace = $model->getBaseIri();
         }
         $uri = $namespace . $localName;
         if (!self::check($uri)) {
             throw new Erfurt_Uri_Exception('The given qname "' . $qnameOrUri . '" results in an invalid Uri "' . $uri . '".');
         } else {
             // return constructed and checked Uri
             return $uri;
         }
     }
 }
 /**
  *
  * Enter description here ...
  *
  * @param   $uri         string to convert to nice uri
  * @param   $titleHelper TitleHelper instance to use to get titles for URIs
  */
 private function generateUriFromSparql($uri, $titleHelper)
 {
     $schema = $this->loadNamingSchema($uri);
     $properties = array();
     foreach ($schema as $element) {
         if (is_string($this->_config->property->{$element})) {
             $properties[$this->_config->property->{$element}] = array('element' => $element, 'rank' => '1');
         } elseif (is_array($this->_config->property->{$element}->toArray())) {
             $countDeep = 0;
             foreach ($this->_config->property->{$element}->toArray() as $elementDeep) {
                 $properties[(string) $elementDeep] = array('element' => $element, 'rank' => $countDeep++);
             }
         }
     }
     $query = new Erfurt_Sparql_Query2();
     $sRef = new Erfurt_Sparql_Query2_IriRef($uri);
     $pVar = new Erfurt_Sparql_Query2_Var('p');
     $oVar = new Erfurt_Sparql_Query2_Var('o');
     $query->addProjectionVar($pVar);
     $query->addProjectionVar($oVar);
     $query->addTriple($sRef, $pVar, $oVar);
     $query->addFrom((string) $this->_model);
     $query->setLimit(100);
     $query->setDistinct(true);
     $container = new Erfurt_Sparql_Query2_ConditionalOrExpression();
     foreach ($properties as $filterProp => $element) {
         $sameTerm = new Erfurt_Sparql_Query2_sameTerm($pVar, new Erfurt_Sparql_Query2_IriRef($filterProp));
         //$filter = new Erfurt_Sparql_Query2_Filter($sameTerm);
         $container->addElement($sameTerm);
     }
     $query->addFilter($container);
     $result = $this->_owApp->erfurt->getStore()->sparqlQuery($query, array('withImports' => true));
     $replacements = array();
     foreach ($result as $row) {
         if (array_key_exists($row['p'], $properties)) {
             $titleHelper->addResource($row['p']);
             if (Erfurt_Uri::check($row['o'])) {
                 $titleHelper->addResource($row['o']);
             }
             if (array_key_exists($properties[$row['p']]['element'], $replacements)) {
                 $newRank = (int) $properties[$row['p']]['rank'];
                 $minRank = $replacements[$properties[$row['p']]['element']]['rank'];
                 if ($newRank < $minRank) {
                     $replacements[$properties[$row['p']]['element']] = array('rank' => $newRank, 'value' => $row['o'], 'key' => $row['p']);
                 }
             } else {
                 $replacements[$properties[$row['p']]['element']] = array('rank' => $properties[$row['p']]['rank'], 'value' => $row['o'], 'key' => $row['p']);
             }
         }
     }
     $localName = '';
     foreach ($schema as $element) {
         if (array_key_exists($element, $replacements)) {
             if (Erfurt_Uri::check($replacements[$element]['value'])) {
                 $val = $titleHelper->getTitle($replacements[$element]['value']);
             } else {
                 $val = $replacements[$element]['value'];
             }
             $val = $this->convertChars($val);
             $key = $this->convertChars($titleHelper->getTitle($replacements[$element]['key']));
             $localName .= $key . '/' . $val . '/';
         }
     }
     // no meaningful localname created falback to old uri (TODO or md5 a new one?)
     if ($localName === '') {
         return $uri;
         //$localName = 'resource/' . md5($uri . time());
     }
     $base = '';
     if ($this->_model !== null && $this->_model->getBaseIri() !== '') {
         $base = $this->_model->getBaseIri();
         if ($base[strlen($base) - 1] !== '#' && $base[strlen($base) - 1] !== '/') {
             $base .= '/';
         }
     } else {
         $count = 0;
         foreach (explode('/', $uri) as $element) {
             if ($count > 2) {
                 break;
             } else {
                 $count++;
                 $base .= $element . '/';
             }
         }
     }
     return $base . $localName;
 }