/** * 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; }
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; }
/** * 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; }
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('|', 'Ι', $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]); } }
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); }
/** * 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 }
/** * 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); }