/** * 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; }
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; }
/** * 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; }