Пример #1
0
 /**
  * getVars
  * get all vars used in this pattern (recursive)
  * @return array array of Erfurt_Sparql_Query2_Var
  */
 public function getVars()
 {
     $vars = parent::getVars();
     if ($this->varOrIri instanceof Erfurt_Sparql_Query2_Var) {
         $vars[] = $this->varOrIri;
     }
     return $vars;
 }
Пример #2
0
 public function groupGraphPattern()
 {
     $value = null;
     $t1 = null;
     $v = null;
     $t2 = null;
     $value = new Erfurt_Sparql_Query2_GroupGraphPattern();
     try {
         $this->match($this->input, $this->getToken('OPEN_CURLY_BRACE'), self::$FOLLOW_OPEN_CURLY_BRACE_in_groupGraphPattern691);
         // Sparql10.g:127:22: (t1= triplesBlock )?
         $alt25 = 2;
         $alt25 = $this->dfa25->predict($this->input);
         switch ($alt25) {
             case 1:
                 $this->pushFollow(self::$FOLLOW_triplesBlock_in_groupGraphPattern696);
                 $t1 = $this->triplesBlock();
                 $this->state->_fsp--;
                 $value->addElements($t1);
                 break;
         }
         // Sparql10.g:128:3: ( (v= graphPatternNotTriples | v= filter ) ( DOT )? (t2= triplesBlock )? )*
         //loop29:
         do {
             $alt29 = 2;
             $LA29_0 = $this->input->LA(1);
             if ($LA29_0 >= $this->getToken('OPTIONAL') && $LA29_0 <= $this->getToken('GRAPH') || $LA29_0 == $this->getToken('FILTER') || $LA29_0 == $this->getToken('OPEN_CURLY_BRACE')) {
                 $alt29 = 1;
             }
             switch ($alt29) {
                 case 1:
                     // Sparql10.g:128:5: (v= graphPatternNotTriples | v= filter )
                     $alt26 = 2;
                     $LA26_0 = $this->input->LA(1);
                     if ($LA26_0 >= $this->getToken('OPTIONAL') && $LA26_0 <= $this->getToken('GRAPH') || $LA26_0 == $this->getToken('OPEN_CURLY_BRACE')) {
                         $alt26 = 1;
                     } else {
                         if ($LA26_0 == $this->getToken('FILTER')) {
                             $alt26 = 2;
                         } else {
                             $nvae = new NoViableAltException("", 26, 0, $this->input);
                             throw $nvae;
                         }
                     }
                     switch ($alt26) {
                         case 1:
                             $this->pushFollow(self::$FOLLOW_graphPatternNotTriples_in_groupGraphPattern710);
                             $v = $this->graphPatternNotTriples();
                             $this->state->_fsp--;
                             break;
                         case 2:
                             $this->pushFollow(self::$FOLLOW_filter_in_groupGraphPattern716);
                             $v = $this->filter();
                             $this->state->_fsp--;
                             break;
                     }
                     $value->addElement($v);
                     // Sparql10.g:129:13: ( DOT )?
                     $alt27 = 2;
                     $alt27 = $this->dfa27->predict($this->input);
                     switch ($alt27) {
                         case 1:
                             $this->match($this->input, $this->getToken('DOT'), self::$FOLLOW_DOT_in_groupGraphPattern734);
                             break;
                     }
                     // Sparql10.g:129:18: (t2= triplesBlock )?
                     $alt28 = 2;
                     $alt28 = $this->dfa28->predict($this->input);
                     switch ($alt28) {
                         case 1:
                             $this->pushFollow(self::$FOLLOW_triplesBlock_in_groupGraphPattern740);
                             $t2 = $this->triplesBlock();
                             $this->state->_fsp--;
                             $value->addElements($t2);
                             break;
                     }
                     break;
                 default:
                     break 2;
                     //loop29;
             }
         } while (true);
         $this->match($this->input, $this->getToken('CLOSE_CURLY_BRACE'), self::$FOLLOW_CLOSE_CURLY_BRACE_in_groupGraphPattern749);
     } catch (RecognitionException $re) {
         $this->reportError($re);
         $this->recover($this->input, $re);
     } catch (Exception $e) {
         throw $e;
     }
     return $value;
 }
Пример #3
0
 /**
  * check and manipulate the declared FROMs according to the access control
  */
 protected function _prepareQuery($queryObject, &$options = array())
 {
     /*
      * clone the Query2 Object to not modify the original one
      * could be used elsewhere, could have side-effects
      */
     if ($queryObject instanceof Erfurt_Sparql_Query2) {
         //always clone
         //the query will be altered here to implement AC and owl:imports
         //dont make these changes global
         $queryObject = clone $queryObject;
         //bring triples etc. to canonical order
         // $queryObject->optimize();
     }
     $defaultOptions = array(Erfurt_Store::RESULTFORMAT => Erfurt_Store::RESULTFORMAT_PLAIN, Erfurt_Store::USE_AC => true, Erfurt_Store::USE_OWL_IMPORTS => true, Erfurt_Store::USE_ADDITIONAL_IMPORTS => true);
     if (!is_array($options)) {
         $options = array();
     }
     $options = array_merge($defaultOptions, $options);
     //typechecking
     if (is_string($queryObject)) {
         $queryObject = Erfurt_Sparql_SimpleQuery::initWithString($queryObject);
     }
     if (!($queryObject instanceof Erfurt_Sparql_Query2 || $queryObject instanceof Erfurt_Sparql_SimpleQuery)) {
         throw new Erfurt_Store_Exception('Argument 1 passed to Erfurt_Store::sparqlQuery must be instance of ' . 'Erfurt_Sparql_Query2, Erfurt_Sparql_SimpleQuery or string', 1);
     }
     /*
     if ($options[Erfurt_Store::USE_AC] == false) {
                 //we are done preparing early
                 return $queryObject;
             }
     */
     $logger = $this->_getQueryLogger();
     $noBindings = false;
     //get available models (readable)
     $available = array();
     if ($options[Erfurt_Store::USE_AC] === true) {
         $logger->debug('AC: use ac ');
         $availablepre = $this->getAvailableModels(true);
         //all readable (with ac)
         foreach ($availablepre as $key => $true) {
             $available[] = array('uri' => $key, 'named' => false);
         }
     } else {
         $logger->debug('AC: dont use ac ');
         $allpre = $this->_backendAdapter->getAvailableModels();
         //really all (without ac)
         foreach ($allpre as $key => $true) {
             $available[] = array('uri' => $key, 'named' => false);
         }
     }
     $logger->debug('AC: available models ' . $this->toStr($available));
     // examine froms (for access control and imports) in 5 steps
     // 1. extract froms for easier handling
     $froms = array();
     if ($queryObject instanceof Erfurt_Sparql_Query2) {
         foreach ($queryObject->getFroms() as $graphClause) {
             $uri = $graphClause->getGraphIri()->getIri();
             $froms[] = array('uri' => $uri, 'named' => $graphClause->isNamed());
         }
     } else {
         //SimpleQuery
         foreach ($queryObject->getFrom() as $graphClause) {
             $froms[] = array('uri' => $graphClause, 'named' => false);
         }
         foreach ($queryObject->getFromNamed() as $graphClause) {
             $froms[] = array('uri' => $graphClause, 'named' => true);
         }
     }
     $logger->debug('AC: requested FROMs' . $this->toStr($froms));
     // 2. no froms in query -> froms = availableModels
     if (empty($froms)) {
         $logger->debug('AC: no requested FROM -> take all available: ' . $this->toStr($available));
         $froms = $available;
     }
     // 3. filter froms by availability and existence - if filtering deletes all -> give empty result back
     if ($options[Erfurt_Store::USE_AC] === true) {
         $froms = $this->_maskModelList($froms, $available);
         $logger->debug('AC: after filtering (read-rights and existence): ' . $this->toStr($froms));
         if (empty($froms)) {
             $logger->debug('AC:  all disallowed - empty result');
             $noBindings = true;
         }
     }
     // 4. get import closure for every remaining from
     if ($options[Erfurt_Store::USE_OWL_IMPORTS] === true) {
         foreach ($froms as $from) {
             $importsClosure = $this->getImportsClosure($from['uri'], $options[Erfurt_Store::USE_ADDITIONAL_IMPORTS], $options[Erfurt_Store::USE_AC]);
             $logger->debug('AC:  import ' . $from['uri'] . ' -> ' . (empty($importsClosure) ? 'none' : implode(' ', $importsClosure)));
             foreach ($importsClosure as $importedGraphUri) {
                 $addCandidate = array('uri' => $importedGraphUri, 'named' => false);
                 //avoid duplicates
                 if (in_array($addCandidate, $available) && array_search($addCandidate, $froms) === false) {
                     $froms[] = $addCandidate;
                 }
             }
         }
     }
     $logger->debug('AC:  after imports: ' . $this->toStr($froms));
     // 5. put froms back
     if ($queryObject instanceof Erfurt_Sparql_Query2) {
         $queryObject->setFroms(array());
         foreach ($froms as $from) {
             $queryObject->addFrom($from['uri'], $from['named']);
         }
     } else {
         $queryObject->setFrom(array());
         $queryObject->setFromNamed(array());
         foreach ($froms as $from) {
             if (!$from['named']) {
                 $queryObject->addFrom($from['uri']);
             } else {
                 $queryObject->addFromNamed($from['uri']);
             }
         }
     }
     // if there were froms and all got deleted due to access controll - give back empty result set
     // this is achieved by replacing the where-part with an unsatisfiable one
     // i think this is efficient because otherwise we would have to deal with result formating und variables
     if ($noBindings) {
         $logger->debug('AC: force no bindings');
         if ($queryObject instanceof Erfurt_Sparql_SimpleQuery) {
             $queryObject->setWherePart('{FILTER(false)}');
         } else {
             if ($queryObject instanceof Erfurt_Sparql_Query2) {
                 $ggp = new Erfurt_Sparql_Query2_GroupGraphPattern();
                 $ggp->addFilter(false);
                 //unsatisfiable
                 $queryObject->removeAllProjectionVars();
                 $queryObject->setWhere($ggp);
             }
         }
     }
     return (string) $queryObject;
 }
Пример #4
0
 public static function getSearchTriples($setup, $forImplicit = false, $backend = 'zenddb')
 {
     $searchVar = new Erfurt_Sparql_Query2_Var('resourceUri');
     $classVar = new Erfurt_Sparql_Query2_Var('classUri');
     $subVar = new Erfurt_Sparql_Query2_Var('subResourceUri');
     $elements = array();
     // if deeper query
     if (isset($setup->state->parent)) {
         $mainUnion = new Erfurt_Sparql_Query2_GroupOrUnionGraphPattern();
         // in relations
         if (isset($setup->config->hierarchyRelations->in)) {
             // default stuff
             if (count($setup->config->hierarchyRelations->in) > 1) {
                 // parse config gile
                 foreach ($setup->config->hierarchyRelations->in as $rel) {
                     // set type
                     $ggp = new Erfurt_Sparql_Query2_GroupGraphPattern();
                     // add triplen
                     $ggp->addTriple($searchVar, new Erfurt_Sparql_Query2_IriRef($rel), new Erfurt_Sparql_Query2_IriRef($setup->state->parent));
                     // add triplet to union var
                     $mainUnion->addElement($ggp);
                 }
             } else {
                 $rel = $setup->config->hierarchyRelations->in;
                 $queryOptional = new Erfurt_Sparql_Query2_GroupGraphPattern();
                 $queryOptional->addTriple($searchVar, new Erfurt_Sparql_Query2_IriRef($rel[0]), new Erfurt_Sparql_Query2_IriRef($setup->state->parent));
                 $mainUnion->addElement($queryOptional);
             }
         }
         // out relations
         if (isset($setup->config->hierarchyRelations->out)) {
             // if there's out relations
             if (count($setup->config->hierarchyRelations->out) > 1) {
                 // parse config gile
                 foreach ($setup->config->hierarchyRelations->out as $rel) {
                     // set type
                     $ggp = new Erfurt_Sparql_Query2_GroupGraphPattern();
                     // add triplen
                     $ggp->addTriple(new Erfurt_Sparql_Query2_IriRef($setup->state->parent), new Erfurt_Sparql_Query2_IriRef($rel), $searchVar);
                     // add triplet to union var
                     $mainUnion->addElement($ggp);
                 }
             } else {
                 // get one relation
                 $rel = $setup->config->hierarchyRelations->out;
                 $queryOptional = new Erfurt_Sparql_Query2_GroupGraphPattern();
                 $queryOptional->addTriple(new Erfurt_Sparql_Query2_IriRef($setup->state->parent), new Erfurt_Sparql_Query2_IriRef($rel[0]), $searchVar);
                 $mainUnion->addElement($queryOptional);
             }
         }
         $elements[] = $mainUnion;
     } else {
         // if default request
         if (!$forImplicit) {
             // set hierarchy types
             //$u1 = new Erfurt_Sparql_Query2_GroupGraphPattern();
             // add triplen
             //                $u1->addTriple( $searchVar,
             //                    new Erfurt_Sparql_Query2_IriRef(EF_RDF_TYPE),
             //                    $classVar
             //                );
             $elements[] = new Erfurt_Sparql_Query2_Triple($searchVar, new Erfurt_Sparql_Query2_IriRef(EF_RDF_TYPE), $classVar);
             //$mainUnion = new Erfurt_Sparql_Query2_GroupGraphPattern();//OrUnion
             //$mainUnion->addElement($u1);
             // request sub elements
             // in relations
             $optional = new Erfurt_Sparql_Query2_OptionalGraphPattern();
             $unionSub = new Erfurt_Sparql_Query2_GroupOrUnionGraphPattern();
             if (isset($setup->config->hierarchyRelations->in)) {
                 if (count($setup->config->hierarchyRelations->in) > 1) {
                     // init union var
                     //$unionSub = new Erfurt_Sparql_Query2_GroupOrUnionGraphPattern();
                     // parse config gile
                     foreach ($setup->config->hierarchyRelations->in as $rel) {
                         // sub stuff
                         $ggp = new Erfurt_Sparql_Query2_GroupGraphPattern();
                         // add triplen
                         $ggp->addTriple($subVar, new Erfurt_Sparql_Query2_IriRef($rel), $searchVar);
                         // add triplet to union var
                         $unionSub->addElement($ggp);
                     }
                 } else {
                     $rel = $setup->config->hierarchyRelations->in;
                     // add optional sub relation
                     // create optional graph to load sublacsses of selected class
                     //$queryOptional = new Erfurt_Sparql_Query2_GroupGraphPattern();
                     $optional->addTriple($subVar, new Erfurt_Sparql_Query2_IriRef($rel[0]), $searchVar);
                     //$unionSub->addElement($queryOptional);
                 }
             }
             if (isset($setup->config->hierarchyRelations->out)) {
                 // init union var
                 //$unionSub = new Erfurt_Sparql_Query2_GroupOrUnionGraphPattern();
                 if (count($setup->config->hierarchyRelations->out) > 1) {
                     // parse config gile
                     foreach ($setup->config->hierarchyRelations->out as $rel) {
                         // sub stuff
                         $ggp = new Erfurt_Sparql_Query2_GroupGraphPattern();
                         // add triplen
                         $ggp->addTriple($searchVar, new Erfurt_Sparql_Query2_IriRef($rel), $subVar);
                         // add triplet to union var
                         $unionSub->addElement($ggp);
                     }
                 } else {
                     $rel = $setup->config->hierarchyRelations->out;
                     // add optional sub relation
                     // create optional graph to load sublacsses of selected class
                     //$queryOptional = new Erfurt_Sparql_Query2_GroupGraphPattern();
                     $optional->addTriple($searchVar, new Erfurt_Sparql_Query2_IriRef($rel[0]), $subVar);
                     //$unionSub->addElement($queryOptional);
                 }
             }
             //$mainUnion->addElement($unionSub);
             if ($unionSub->size() > 0) {
                 $optional->addElement($unionSub);
             }
             $elements[] = $optional;
             // create filter for types
             $filterType = array();
             $filterUris = array();
             foreach ($setup->config->hierarchyTypes as $type) {
                 $uriElem = new Erfurt_Sparql_Query2_IriRef($type);
                 $filterUris[] = $uriElem;
                 $filterType[] = new Erfurt_Sparql_Query2_sameTerm($classVar, $uriElem);
             }
             $owApp = OntoWiki::getInstance();
             $store = $owApp->erfurt->getStore();
             if ($store->isInSyntaxSupported()) {
                 // e.g. Virtuoso
                 $elements[] = new Erfurt_Sparql_Query2_Filter(new Erfurt_Sparql_Query2_InExpression($classVar, $filterUris));
             } else {
                 // sameTerm || sameTerm ... as supported by EfZendDb adapter
                 // add filter
                 $elements[] = new Erfurt_Sparql_Query2_Filter(new Erfurt_Sparql_Query2_ConditionalOrExpression($filterType));
             }
         } else {
             // define subvar
             $subVar = new Erfurt_Sparql_Query2_Var('sub');
             // init union var
             $union = new Erfurt_Sparql_Query2_GroupOrUnionGraphPattern();
             // parse config
             if (isset($setup->config->hierarchyRelations->out)) {
                 if (is_string($setup->config->hierarchyRelations->out)) {
                     $setup->config->hierarchyRelations->out = array($setup->config->hierarchyRelations->out);
                 }
                 foreach ($setup->config->hierarchyRelations->out as $rel) {
                     // create new graph pattern
                     $ggp = new Erfurt_Sparql_Query2_GroupGraphPattern();
                     // add triplen
                     $ggp->addTriple($searchVar, new Erfurt_Sparql_Query2_IriRef($rel), $subVar);
                     // add triplet to union var
                     $union->addElement($ggp);
                 }
             }
             // parse config
             if (isset($setup->config->hierarchyRelations->in)) {
                 if (is_string($setup->config->hierarchyRelations->in)) {
                     $setup->config->hierarchyRelations->in = array($setup->config->hierarchyRelations->in);
                 }
                 foreach ($setup->config->hierarchyRelations->in as $rel) {
                     // create new graph pattern
                     $ggp = new Erfurt_Sparql_Query2_GroupGraphPattern();
                     // add triplen
                     $ggp->addTriple($subVar, new Erfurt_Sparql_Query2_IriRef($rel), $searchVar);
                     // add triplet to union var
                     $union->addElement($ggp);
                 }
             }
             // parse config
             if (isset($setup->config->instanceRelation->out)) {
                 if (is_string($setup->config->instanceRelation->out)) {
                     $setup->config->instanceRelation->out = array($setup->config->instanceRelation->out);
                 }
                 foreach ($setup->config->instanceRelation->out as $rel) {
                     // create new graph pattern
                     $ggp = new Erfurt_Sparql_Query2_GroupGraphPattern();
                     // add triplen
                     $ggp->addTriple($subVar, new Erfurt_Sparql_Query2_IriRef($rel), $searchVar);
                     // add triplet to union var
                     $union->addElement($ggp);
                 }
             }
             // parse config
             if (isset($setup->config->instanceRelation->in)) {
                 if (is_string($setup->config->instanceRelation->in)) {
                     $setup->config->instanceRelation->in = array($setup->config->instanceRelation->in);
                 }
                 foreach ($setup->config->instanceRelation->in as $rel) {
                     // create new graph pattern
                     $ggp = new Erfurt_Sparql_Query2_GroupGraphPattern();
                     // add triplen
                     $ggp->addTriple($searchVar, new Erfurt_Sparql_Query2_IriRef($rel), $subVar);
                     // add triplet to union var
                     $union->addElement($ggp);
                 }
             }
             $elements[] = $union;
         }
     }
     if (isset($setup->config->rootElement)) {
         $union = new Erfurt_Sparql_Query2_GroupOrUnionGraphPattern();
         if (isset($setup->config->hierarchyRelations->in)) {
             foreach ($setup->config->hierarchyRelations->in as $rel) {
                 // create new graph pattern
                 $ggp = new Erfurt_Sparql_Query2_GroupGraphPattern();
                 // add triplen
                 $ggp->addTriple($searchVar, new Erfurt_Sparql_Query2_IriRef($rel), new Erfurt_Sparql_Query2_IriRef($setup->config->rootElement));
                 // add triplet to union var
                 $union->addElement($ggp);
             }
             $superUsed = true;
         }
         if (isset($setup->config->hierarchyRelations->out)) {
             foreach ($setup->config->hierarchyRelations->out as $rel) {
                 // create new graph pattern
                 $ggp = new Erfurt_Sparql_Query2_GroupGraphPattern();
                 // add triplen
                 $ggp->addTriple(new Erfurt_Sparql_Query2_IriRef($setup->config->rootElement), new Erfurt_Sparql_Query2_IriRef($rel), $searchVar);
                 // add triplet to union var
                 $union->addElement($ggp);
             }
             $superUsed = true;
         }
         if ($superUsed) {
             $elements[] = $union;
         }
     }
     $elements[] = new Erfurt_Sparql_Query2_Filter(new Erfurt_Sparql_Query2_UnaryExpressionNot(new Erfurt_Sparql_Query2_isBlank(new Erfurt_Sparql_Query2_Var('resourceUri'))));
     // namespaces to be ignored, rdfs/owl-defined objects
     if (!isset($setup->state->showHidden)) {
         if (isset($setup->config->hiddenRelation)) {
             // optional var
             $queryOptional = new Erfurt_Sparql_Query2_OptionalGraphPattern();
             // parse config
             if (is_string($setup->config->hiddenRelation)) {
                 $setup->config->hiddenRelation = array($setup->config->hiddenRelation);
             }
             foreach ($setup->config->hiddenRelation as $ignore) {
                 $queryOptional->addTriple(new Erfurt_Sparql_Query2_Var('resourceUri'), new Erfurt_Sparql_Query2_IriRef($ignore), new Erfurt_Sparql_Query2_Var('reg'));
                 $regUsed = true;
             }
             if ($regUsed) {
                 $elements[] = $queryOptional;
                 $elements[] = new Erfurt_Sparql_Query2_Filter(new Erfurt_Sparql_Query2_UnaryExpressionNot(new Erfurt_Sparql_Query2_bound(new Erfurt_Sparql_Query2_Var('reg'))));
             }
         }
         if (isset($setup->config->hiddenNS)) {
             // parse config
             foreach ($setup->config->hiddenNS as $ignore) {
                 $elements[] = new Erfurt_Sparql_Query2_Filter(new Erfurt_Sparql_Query2_UnaryExpressionNot(new Erfurt_Sparql_Query2_Regex(new Erfurt_Sparql_Query2_Str(new Erfurt_Sparql_Query2_Var('resourceUri')), new Erfurt_Sparql_Query2_RDFLiteral('^' . $ignore))));
             }
         }
     }
     // dont't show rdfs/owl entities and subtypes in the first level
     if (!isset($setup->state->parent) && !isset($setup->config->rootElement)) {
         OntoWiki::getInstance()->logger->info("BACKEND: " . $backend);
         // optional var
         if ($backend == "zenddb") {
             $queryUnion = new Erfurt_Sparql_Query2_OptionalGraphPattern();
         } else {
             $queryUnion = new Erfurt_Sparql_Query2_GroupOrUnionGraphPattern();
         }
         if (isset($setup->config->hierarchyRelations->in)) {
             if (count($setup->config->hierarchyRelations->in) > 1) {
                 foreach ($setup->config->hierarchyRelations->in as $rel) {
                     $ggp = new Erfurt_Sparql_Query2_GroupGraphPattern();
                     $ggp->addTriple($searchVar, new Erfurt_Sparql_Query2_IriRef($rel), new Erfurt_Sparql_Query2_Var('super'));
                     $queryUnion->addElement($ggp);
                 }
             } else {
                 $rel = $setup->config->hierarchyRelations->in;
                 // add optional sub relation
                 if ($backend == "zenddb") {
                     $queryUnion->addTriple($searchVar, new Erfurt_Sparql_Query2_IriRef($rel[0]), new Erfurt_Sparql_Query2_Var('super'));
                 } else {
                     $ggp = new Erfurt_Sparql_Query2_GroupGraphPattern();
                     $ggp->addTriple($searchVar, new Erfurt_Sparql_Query2_IriRef($rel[0]), new Erfurt_Sparql_Query2_Var('super'));
                     $queryUnion->addElement($ggp);
                 }
             }
             //$mainUnion->addElement($u1);
             $superUsed = true;
         }
         if (isset($setup->config->hierarchyRelations->out)) {
             if (count($setup->config->hierarchyRelations->out) > 1) {
                 foreach ($setup->config->hierarchyRelations->out as $rel) {
                     $ggp = new Erfurt_Sparql_Query2_GroupGraphPattern();
                     $ggp->addTriple(new Erfurt_Sparql_Query2_Var('super'), new Erfurt_Sparql_Query2_IriRef($rel), $searchVar);
                     $queryUnion->addElement($ggp);
                 }
             } else {
                 $rel = $setup->config->hierarchyRelations->out;
                 // add optional sub relation
                 if ($backend == "zenddb") {
                     $queryUnion->addTriple(new Erfurt_Sparql_Query2_Var('super'), new Erfurt_Sparql_Query2_IriRef($rel[0]), $searchVar);
                 } else {
                     $ggp = new Erfurt_Sparql_Query2_GroupGraphPattern();
                     $ggp->addTriple(new Erfurt_Sparql_Query2_Var('super'), new Erfurt_Sparql_Query2_IriRef($rel[0]), $searchVar);
                     $queryUnion->addElement($ggp);
                 }
             }
             //$mainUnion->addElement($u1);
             $superUsed = true;
         }
         if ($superUsed) {
             if ($backend == "zenddb") {
                 $elements[] = $queryUnion;
             } else {
                 $queryOptional = new Erfurt_Sparql_Query2_OptionalGraphPattern();
                 $queryOptional->addElement($queryUnion);
                 $elements[] = $queryOptional;
             }
             $filter[] = new Erfurt_Sparql_Query2_Regex(new Erfurt_Sparql_Query2_Str(new Erfurt_Sparql_Query2_Var('super')), new Erfurt_Sparql_Query2_RDFLiteral('^' . EF_OWL_NS));
             $filter[] = new Erfurt_Sparql_Query2_UnaryExpressionNot(new Erfurt_Sparql_Query2_bound(new Erfurt_Sparql_Query2_Var('super')));
             $elements[] = new Erfurt_Sparql_Query2_Filter(new Erfurt_Sparql_Query2_ConditionalOrExpression($filter));
         }
     }
     if (isset($setup->state->sorting)) {
         $sortRel = new Erfurt_Sparql_Query2_IriRef($setup->state->sorting);
         $sortVar = new Erfurt_Sparql_Query2_Var('sortRes');
         $queryOptional = new Erfurt_Sparql_Query2_OptionalGraphPattern();
         $queryOptional->addTriple(new Erfurt_Sparql_Query2_Var('resourceUri'), $sortRel, $sortVar);
         $elements[] = $queryOptional;
     }
     return $elements;
 }
 protected function _buildSubCheckQuery($uri, $setup)
 {
     $subVar = new Erfurt_Sparql_Query2_Var('subResourceUri');
     $searchVar = new Erfurt_Sparql_Query2_Var('resourceUri');
     //$classVar = new Erfurt_Sparql_Query2_Var('classUri');
     $query = new Erfurt_Sparql_Query2();
     $query->addProjectionVar($subVar);
     $query->setDistinct();
     $this->_owApp->logger->info("data: " . print_r($query, true));
     $elements = array();
     $in = array();
     $out = array();
     if (isset($setup->config->hierarchyRelations->in)) {
         if (count($setup->config->hierarchyRelations->in) > 1) {
             // init union var
             $unionSub = new Erfurt_Sparql_Query2_GroupOrUnionGraphPattern();
             // parse config gile
             foreach ($setup->config->hierarchyRelations->in as $rel) {
                 // sub stuff
                 $groupPattern = new Erfurt_Sparql_Query2_GroupGraphPattern();
                 // add triplen
                 $groupPattern->addTriple($subVar, new Erfurt_Sparql_Query2_IriRef($rel), $searchVar);
                 // add triplet to union var
                 $unionSub->addElement($groupPattern);
             }
             $in[] = $unionSub;
         } else {
             $rel = $setup->config->hierarchyRelations->in;
             // add optional sub relation
             // create optional graph to load sublacsses of selected class
             $queryOptional = new Erfurt_Sparql_Query2_GroupGraphPattern();
             $queryOptional->addTriple($subVar, new Erfurt_Sparql_Query2_IriRef($rel[0]), $searchVar);
             $in[] = $queryOptional;
         }
     }
     if (isset($setup->config->hierarchyRelations->out)) {
         if (count($setup->config->hierarchyRelations->out) > 1) {
             // init union var
             $unionSub = new Erfurt_Sparql_Query2_GroupGraphPattern();
             // parse config gile
             foreach ($setup->config->hierarchyRelations->out as $rel) {
                 // sub stuff
                 $optPattern = new Erfurt_Sparql_Query2_OptionalGraphPattern();
                 // add triple
                 $optPattern->addTriple($searchVar, new Erfurt_Sparql_Query2_IriRef($rel), $subVar);
                 // add triplet to union var
                 $unionSub->addElement($optPattern);
             }
             $out[] = $unionSub;
         } else {
             $rel = $setup->config->hierarchyRelations->out;
             // add optional sub relation
             // create optional graph to load sublacsses of selected class
             $queryOptional = new Erfurt_Sparql_Query2_GroupGraphPattern();
             $queryOptional->addTriple($searchVar, new Erfurt_Sparql_Query2_IriRef($rel[0]), $subVar);
             $out[] = $queryOptional;
         }
     }
     $inout = new Erfurt_Sparql_Query2_GroupOrUnionGraphPattern();
     $inout->addElements($in);
     $inout->addElements($out);
     $elements[] = $inout;
     /*$elements[] = new Erfurt_Sparql_Query2_Triple(
           $searchVar,
           new Erfurt_Sparql_Query2_IriRef(EF_RDF_TYPE),
           $classVar
       );*/
     // add filter
     $elements[] = new Erfurt_Sparql_Query2_Filter(new Erfurt_Sparql_Query2_sameTerm($searchVar, new Erfurt_Sparql_Query2_IriRef($uri)));
     $query->addElements($elements);
     $query->setLimit(1);
     // log results
     $this->_owApp->logger->info('NavigationController CHECK SUB: ' . PHP_EOL . $query->__toString());
     return $query;
 }
 /**
  * Searches the local database for URIs. If mode is set to properties only,
  * only defined properties and URIs that are used at least once as a
  * property are returned.
  *
  * the classes array is used for class restrictions
  *
  * @param array  $termsArray
  * @param string $modelUri
  * @param int    $mode
  * @param int    $limit
  * @param array  $classes
  *
  * @return array
  */
 private function _searchLocal(array $termsArray, $modelUri, $mode, $limit, $classes = array())
 {
     if ($mode === self::SEARCH_MODE_PROPERTIES) {
         return $this->_searchLocalPropertiesOnly($termsArray, $modelUri, $limit);
     }
     $store = Erfurt_App::getInstance()->getStore();
     // get a store specific text-search query2 object
     $searchPattern = $store->getSearchPattern(implode(" ", $termsArray), $modelUri);
     $query = new Erfurt_Sparql_Query2();
     $query->addElements($searchPattern);
     $projVar = new Erfurt_Sparql_Query2_Var('resourceUri');
     $query->addProjectionVar($projVar);
     // add class restriction patterns for each class
     foreach ($classes as $class) {
         $classPattern = new Erfurt_Sparql_Query2_GroupGraphPattern();
         $classPattern->addTriple($projVar, new Erfurt_Sparql_Query2_IriRef(EF_RDF_TYPE), new Erfurt_Sparql_Query2_IriRef($class));
         $query->addElement($classPattern);
     }
     $query->setLimit(20);
     $query->setDistinct(true);
     $queryResult = $store->sparqlQuery($query, array('result_format' => 'extended'));
     $tempResult = array();
     foreach ($queryResult['results']['bindings'] as $row) {
         $object = isset($row['o']) ? $row['o']['value'] : null;
         $weight = $this->_getWeight($termsArray, $row['resourceUri']['value'], $object);
         if (isset($tempResult[$row['resourceUri']['value']])) {
             if ($weight > $tempResult[$row['resourceUri']['value']]) {
                 $tempResult[$row['resourceUri']['value']] = $weight;
             }
         } else {
             $tempResult[$row['resourceUri']['value']] = $weight;
         }
     }
     arsort($tempResult);
     require_once 'OntoWiki/Model/TitleHelper.php';
     require_once 'OntoWiki/Utils.php';
     if (null !== $modelUri) {
         $model = $store->getModel($modelUri, false);
         $titleHelper = new OntoWiki_Model_TitleHelper($model);
     } else {
         $titleHelper = new OntoWiki_Model_TitleHelper();
     }
     $titleHelper->addResources(array_keys($tempResult));
     $translate = $this->_owApp->translate;
     // create different source description strings
     if (count($classes) > 0) {
         $sourceString = $translate->_('Local Search') . ' (' . $translate->_('recommended') . ')';
     } else {
         $sourceString = $translate->_('Local Search');
     }
     $result = array();
     foreach ($tempResult as $uri => $w) {
         $title = $titleHelper->getTitle($uri);
         if (null !== $title) {
             $result[$uri] = str_replace('|', '&Iota;', $title) . '|' . $uri . '|' . $sourceString;
         } else {
             $result[$uri] = OntoWiki_Utils::compactUri($uri) . $uri . '|' . $sourceString;
         }
     }
     return $result;
 }
 public function __construct()
 {
     parent::__construct();
 }
 /**
  * Method that counts already existing distinct datasets for given uri
  *
  * @param $uri uri string
  *
  * @return int distinct existing datasets
  */
 private function countUriPattern($uri)
 {
     $query = new Erfurt_Sparql_Query2();
     $query->setDistinct(true);
     $unions = new Erfurt_Sparql_Query2_GroupOrUnionGraphPattern();
     $subjectVar = new Erfurt_Sparql_Query2_Var('s');
     $query->addProjectionVar($subjectVar);
     // create six temporary vars (not selected in query)
     $tempVars = array();
     for ($i = 0; $i < 6; $i++) {
         $tempVars[] = new Erfurt_Sparql_Query2_Var('var' . $i);
     }
     $singlePattern = new Erfurt_Sparql_Query2_GroupGraphPattern();
     $singlePattern->addTriple($subjectVar, $tempVars[0], $tempVars[1]);
     $unions->addElement($singlePattern);
     $singlePattern = new Erfurt_Sparql_Query2_GroupGraphPattern();
     $singlePattern->addTriple($tempVars[2], $subjectVar, $tempVars[3]);
     $unions->addElement($singlePattern);
     $singlePattern = new Erfurt_Sparql_Query2_GroupGraphPattern();
     $singlePattern->addTriple($tempVars[4], $tempVars[5], $subjectVar);
     $unions->addElement($singlePattern);
     $query->getWhere()->addElement($unions);
     $filter = new Erfurt_Sparql_Query2_ConditionalOrExpression();
     $filter->addElement(new Erfurt_Sparql_Query2_Regex($subjectVar, new Erfurt_Sparql_Query2_RDFLiteral('^' . $uri), new Erfurt_Sparql_Query2_RDFLiteral('i')));
     $query->addFilter($filter);
     $result = $this->_owApp->erfurt->getStore()->countWhereMatches($this->_model->getModelIri(), $query->getWhere(), 's', true);
     return $result;
 }
 public function __construct($resourceUri)
 {
     $owApp = OntoWiki::getInstance();
     $store = $owApp->erfurt->getStore();
     $model = $owApp->selectedModel;
     $resource = new Erfurt_Sparql_Query2_IriRef($resourceUri);
     $ontology = new Erfurt_Sparql_Query2_IriRef(EF_OWL_ONTOLOGY);
     $fetchFrom = new Erfurt_Sparql_Query2_IriRef(static::SITE_FETCH_OPTIONS_FROM);
     // fetch options from this resource
     $query = new Erfurt_Sparql_Query2();
     list($key, $value, $class, $dataset) = $this->_queryAddVars($query, array('key', 'value', 'class', 'dataset'));
     $union = new Erfurt_Sparql_Query2_GroupOrUnionGraphPattern();
     // resource options
     $group = new Erfurt_Sparql_Query2_GroupGraphPattern();
     $group->addTriple($resource, $key, $value);
     $union->addElement($group);
     // class options
     $group = new Erfurt_Sparql_Query2_GroupGraphPattern();
     $group->addTriple($resource, EF_RDF_TYPE, $class);
     $group->addTriple($class, $key, $value);
     $union->addElement($group);
     // dataset options
     $group = new Erfurt_Sparql_Query2_GroupGraphPattern();
     $group->addTriple($dataset, EF_RDF_TYPE, new Erfurt_Sparql_Query2_IriRef(EF_OWL_ONTOLOGY));
     $group->addTriple($dataset, $key, $value);
     $union->addElement($group);
     $query->addElement($union);
     $query->addTriple($key, EF_RDF_TYPE, new Erfurt_Sparql_Query2_IriRef(static::SITE_TEMPLATE_OPTION));
     $results = $model->sparqlQuery($query);
     foreach ($results as $result) {
         $arrayKey = $result[$key->getName()];
         $this->_options[$arrayKey][$this->_getPriority($result)][] = $result[$value->getName()];
         $templateOption = new Erfurt_Rdf_Resource($arrayKey, $model);
         $arrayKeyLocalName = $templateOption->getLocalName();
         $this->_optionLocalNames[$arrayKeyLocalName][] = $arrayKey;
     }
     // fetch options from linked resources
     $query = new Erfurt_Sparql_Query2();
     list($other, $class, $dataset) = $this->_queryAddVars($query, array('other', 'class', 'dataset'));
     $union = new Erfurt_Sparql_Query2_GroupOrUnionGraphPattern();
     // resource links
     $group = new Erfurt_Sparql_Query2_GroupGraphPattern();
     $group->addTriple($resource, $fetchFrom, $other);
     $union->addElement($group);
     // class links
     $group = new Erfurt_Sparql_Query2_GroupGraphPattern();
     $group->addTriple($resource, EF_RDF_TYPE, $class);
     $group->addTriple($class, $fetchFrom, $other);
     $union->addElement($group);
     // dataset links
     $group = new Erfurt_Sparql_Query2_GroupGraphPattern();
     $group->addTriple($dataset, EF_RDF_TYPE, $ontology);
     $group->addTriple($dataset, $fetchFrom, $other);
     $union->addElement($group);
     $query->addElement($union);
     $results = $model->sparqlQuery($query);
     foreach ($results as $result) {
         $options = new TemplateOptionsClass($result[$other->getName()]);
         foreach ($options->_options as $arrayKey => $priorities) {
             foreach ($priorities as $priority => $values) {
                 $floor = floor($priority);
                 $this->_options[$arrayKey][(string) ($floor + 0.1 * $this->_getPriority($result) + 0.1 * ($priority - $floor))] = $values;
             }
         }
         foreach ($options->_optionLocalNames as $arrayKeyLocalName => $keys) {
             foreach ($keys as $key) {
                 if (!isset($this->_optionLocalNames[$arrayKeyLocalName]) || !in_array($key, $this->_optionLocalNames[$arrayKeyLocalName])) {
                     $this->_optionLocalNames[$arrayKeyLocalName][] = $key;
                 }
             }
         }
     }
     foreach (array_keys($this->_options) as $key) {
         ksort($this->_options[$key]);
     }
 }
Пример #10
0
 private function checkConfig($config)
 {
     $resVar = new Erfurt_Sparql_Query2_Var('resourceUri');
     $typeVar = new Erfurt_Sparql_Query2_IriRef(EF_RDF_TYPE);
     $query = new Erfurt_Sparql_Query2();
     $query->addProjectionVar($resVar)->setDistinct(true);
     $union = new Erfurt_Sparql_Query2_GroupOrUnionGraphPattern();
     if (is_string($config->hierarchyTypes)) {
         $config->hierarchyTypes = array($config->hierarchyTypes);
     }
     foreach ($config->hierarchyTypes->toArray() as $type) {
         $ggp = new Erfurt_Sparql_Query2_GroupGraphPattern();
         $ggp->addTriple($resVar, $typeVar, new Erfurt_Sparql_Query2_IriRef($type));
         $union->addElement($ggp);
     }
     $query->addElement($union);
     $query->setLimit(1);
     $allResults = $this->_owApp->selectedModel->sparqlQuery($query);
     /*$this->_owApp->logger->info(
           'Navigation Query: ' .PHP_EOL . $query->__toString()
       );
       $this->_owApp->logger->info(
           'Navigation Query Results: ' .PHP_EOL . print_r($all_results)
       );*/
     return count($allResults);
 }
Пример #11
0
 /**
  * getSparql
  * build a valid sparql representation of this obj - should be like 'OPTIONAL {...}'
  * @return string
  */
 public function getSparql()
 {
     return 'OPTIONAL ' . substr(parent::getSparql(), 0, -1);
     //substr is cosmetic for stripping off the last linebreak
 }
Пример #12
0
 /**
  * Moves resource to new URI
  * renaming all occurences of the resource.
  *
  * @param string $oldUri The URI that identifies the resource.
  * @param string $newUri The URI to move resource to.
  *
  * @return void
  */
 public function renameResource($oldUri, $newUri)
 {
     $query = new Erfurt_Sparql_Query2();
     $query->setDistinct(true);
     $vars = array();
     foreach (array('s', 'p', 'o') as $varName) {
         $vars[$varName] = new Erfurt_Sparql_Query2_Var($varName);
         $query->addProjectionVar($vars[$varName]);
     }
     $oldUriRef = new Erfurt_Sparql_Query2_IriRef($oldUri);
     $union = new Erfurt_Sparql_Query2_GroupOrUnionGraphPattern();
     foreach ($vars as $var) {
         $group = new Erfurt_Sparql_Query2_GroupGraphPattern();
         $group->addTriple($vars['s'], $vars['p'], $vars['o']);
         $group->addFilter(new Erfurt_Sparql_Query2_sameTerm($var, $oldUriRef));
         $union->addElement($group);
     }
     $query->addElement($union);
     $result = $this->sparqlQuery($query, array('result_format' => 'extended'));
     $removed = array();
     $added = array();
     foreach ($result['results']['bindings'] as $s) {
         // result format from sparqlQuery
         // isn't the same as format for delete/addMultipleStatements
         if (array_key_exists('xml:lang', $s['o'])) {
             $s['o']['lang'] = $s['o']['xml:lang'];
             unset($s['o']['xml:lang']);
         }
         $removed[$s['s']['value']][$s['p']['value']][] = $s['o'];
         foreach (array('s', 'p', 'o') as $varName) {
             if ($s[$varName]['type'] === 'uri' && $s[$varName]['value'] === $oldUri) {
                 $s[$varName]['value'] = $newUri;
             }
         }
         $added[$s['s']['value']][$s['p']['value']][] = $s['o'];
     }
     $this->deleteMultipleStatements($removed);
     $this->addMultipleStatements($added);
 }