示例#1
0
 /**
  * Builds the SPARQL query
  */
 private function _buildQueries()
 {
     $query = new Erfurt_Sparql_Query2();
     $uri = new Erfurt_Sparql_Query2_IriRef($this->_uri);
     $predVar = new Erfurt_Sparql_Query2_Var('predicate');
     $objVar = new Erfurt_Sparql_Query2_Var('object');
     $query->addTriple($uri, $predVar, $objVar);
     $query->addFilter(new Erfurt_Sparql_Query2_UnaryExpressionNot(new Erfurt_Sparql_Query2_isBlank($objVar)));
     if (!empty($this->_ignoredPredicates)) {
         $or = new Erfurt_Sparql_Query2_ConditionalAndExpression();
         $filter = new Erfurt_Sparql_Query2_Filter($or);
         foreach ($this->_ignoredPredicates as $ignored) {
             $or->addElement(new Erfurt_Sparql_Query2_UnaryExpressionNot(new Erfurt_Sparql_Query2_sameTerm($predVar, new Erfurt_Sparql_Query2_IriRef($ignored))));
         }
         $query->getWhere()->addElement($filter);
     }
     $query->setDistinct(true)->addProjectionVar($predVar)->addProjectionVar($objVar)->getOrder()->add($predVar);
     $queries = array();
     $closure = Erfurt_App::getInstance()->getStore()->getImportsClosure($this->_model->getModelUri(), true);
     $queryGraphs = array_merge(array($this->_graph), $closure);
     foreach ($queryGraphs as $currentGraph) {
         $query->setFroms(array($currentGraph));
         $queries[$currentGraph] = clone $query;
     }
     return $queries;
 }
示例#2
0
 public static function addFilterHelper(Erfurt_Sparql_Query2 $query, Erfurt_Sparql_Query2_Var $resVar, $predicate, $type, $value)
 {
     if (is_string($predicate)) {
         $predicate = new Erfurt_Sparql_Query2_IriRef($predicate);
     }
     if (!$predicate instanceof Erfurt_Sparql_Query2_IriRef) {
         throw new RuntimeException('Argument 3 passed to Erfurt_Sparql_Query2_Abstraction_ClassNode::addFilterHelper must be an instance of Erfurt_Sparql_Query2_IriRef instance of ' . typeHelper($predicate) . ' given');
     }
     switch ($type) {
         case 'contains':
             $propVar = new Erfurt_Sparql_Query2_Var($predicate);
             $filteringTriple = new Erfurt_Sparql_Query2_Triple($resVar, $predicate, $propVar);
             $filterExp = new Erfurt_Sparql_Query2_Filter(new Erfurt_Sparql_Query2_Regex($propVar, new Erfurt_Sparql_Query2_RDFLiteral($value)));
             $query->getWhere()->addElement($filteringTriple);
             $query->getWhere()->addElement($filterExp);
             return array($filteringTriple, $filterExp);
             break;
         case 'equals':
             $filteringTriple = new Erfurt_Sparql_Query2_Triple($resVar, $predicate, new Erfurt_Sparql_Query2_RDFLiteral($value));
             $query->getWhere()->addElement($filteringTriple);
             return $filteringTriple;
             break;
         default:
             throw new RuntimeException('Argument 4 passed to Erfurt_Sparql_Query2_Abstraction_ClassNode::addFilterHelper must be "equals" or "contains", ' . $type . ' given');
             break;
     }
     return null;
 }
 protected function _buildQuery($setup, $forImplicit = false)
 {
     if (isset($setup->config->query->deeper) && isset($setup->state->parent)) {
         //$replace = ;
         $queryString = str_replace("%resource%", $setup->state->parent, $setup->config->query->deeper);
         $query = Erfurt_Sparql_SimpleQuery::initWithString($queryString);
     } else {
         $query = new Erfurt_Sparql_Query2();
         $query->addElements(NavigationHelper::getSearchTriples($setup, $forImplicit, $this->_config->store->backend));
         //$query->setCountStar(true);
         $query->setDistinct(true);
         $query->addProjectionVar(new Erfurt_Sparql_Query2_Var('resourceUri'));
         //$query->addProjectionVar(new Erfurt_Sparql_Query2_Var('subResourceUri'));
         // set to _limit+1, so we can see if there are more than $_limit entries
         //$query->setLimit($this->_limit + 1);
     }
     // sorting
     if (isset($setup->state->sorting)) {
         $query->getOrder()->add(new Erfurt_Sparql_Query2_Var('sortRes'), "ASC");
     } elseif (isset($setup->config->ordering->relation)) {
         // set ordering
         $orderVar = new Erfurt_Sparql_Query2_Var('order');
         $query->getWhere()->addElement(new Erfurt_Sparql_Query2_OptionalGraphPattern(array(new Erfurt_Sparql_Query2_Triple(new Erfurt_Sparql_Query2_Var('resourceUri'), new Erfurt_Sparql_Query2_IriRef($setup->config->ordering->relation), $orderVar))));
         $query->getOrder()->add($orderVar, $setup->config->ordering->modifier);
     }
     // set offset
     if (isset($setup->state->offset) && $setup->state->lastEvent == 'more') {
         $query->setLimit($this->_limit + $setup->state->offset + 1);
     } else {
         $query->setLimit($this->_limit + 1);
     }
     return $query;
 }
示例#4
0
 /**
  * if the selected resources changed (due to filters or limit or offset)
  * we have to change the value query as well (because the resources are mentioned as subjects)
  *
  * @return OntoWiki_Model_Instances $this
  */
 protected function updateValueQuery()
 {
     if ($this->_valueQueryUptodate) {
         return $this;
     }
     $resources = $this->getShownResources();
     foreach ($resources as $key => $resource) {
         $resources[$key] = new Erfurt_Sparql_Query2_SameTerm($this->_resourceVar, new Erfurt_Sparql_Query2_IriRef($resource['value']));
     }
     if ($this->_valueQueryResourceFilter == null) {
         $this->_valueQueryResourceFilter = new Erfurt_Sparql_Query2_Filter(new Erfurt_Sparql_Query2_BooleanLiteral(false));
         $this->_valueQuery->addElement($this->_valueQueryResourceFilter);
     }
     $this->_valueQueryResourceFilter->setConstraint(empty($resources) ? new Erfurt_Sparql_Query2_BooleanLiteral(false) : new Erfurt_Sparql_Query2_ConditionalOrExpression($resources));
     //fix for a strange issue where a query with only optionals fails
     //(but there is a magic/unkown condition, that makes it work for some queries!?)
     //if($this->_store->getBackendName() == 'ZendDb'){
     $hasTriple = false;
     foreach ($this->_valueQuery->getWhere()->getElements() as $element) {
         if ($element instanceof Erfurt_Sparql_Query2_IF_TriplesSameSubject) {
             $hasTriple = true;
             break;
         }
     }
     if (!$hasTriple) {
         $this->_valueQuery->getWhere()->addElement(new Erfurt_Sparql_Query2_Triple($this->_resourceVar, new Erfurt_Sparql_Query2_Var('p'), new Erfurt_Sparql_Query2_Var('o')));
     }
     //}
     //remove duplicate triples...
     $this->_valueQuery->optimize();
     $this->_valueQueryUptodate = true;
     return $this;
 }
 /**
  * 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;
 }