public function testGetSparql() { $q1 = new Erfurt_Sparql_Query2(Erfurt_Sparql_Query2::typeAsk); $this->assertEquals("ASK \nWHERE { \n} \n", $q1->getSparql()); $q2 = new Erfurt_Sparql_Query2(Erfurt_Sparql_Query2::typeDescribe); $this->assertEquals("DESCRIBE * \nWHERE { \n} \n", $q2->getSparql()); $q3 = new Erfurt_Sparql_Query2(Erfurt_Sparql_Query2::typeSelect); $this->assertEquals("SELECT * \nWHERE { \n} \n", $q3->getSparql()); $q4 = new Erfurt_Sparql_Query2(Erfurt_Sparql_Query2::typeConstruct); $constrPure = "CONSTRUCT \n{ \n} \nWHERE { \n} \n"; $this->assertEquals($constrPure, $q4->getSparql()); $q4->setBase(new Erfurt_Sparql_Query2_IriRef('http://base.com')); $this->assertEquals("BASE <http://base.com> \nCONSTRUCT \n{ \n} \nWHERE { \n} \n", $q4->getSparql()); $q4->removeBase(); $this->assertEquals($constrPure, $q4->getSparql()); $q3->setDistinct(); $this->assertEquals("SELECT DISTINCT * \nWHERE { \n} \n", $q3->getSparql()); $q3->setReduced(); $this->assertEquals("SELECT REDUCED * \nWHERE { \n} \n", $q3->getSparql()); }
/** * 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; }
/** * Opens a resource context in data markup. * * Options (all are optional): * - resource - resource URI (by default, the current resource in template) * - type - resource type (by default, rdf:type value for the specified resource) * - rel - relation to the resource, string or array of strings * - rev - reverse relation (from the resource), string or array of strings * - itemref - microdata's itemref as an array of IDs * - tag - HTML tag to create context with * - id - HTML id attribute * - class - HTML class attribute * - markup - markup format ("RDFa", "microdata", false) * * The following options may be specified in template options: * rel, rev, itemref, tag, id, class */ public function openContext($options = array()) { $model = OntoWiki::getInstance()->selectedModel; $tmplOpt = $this->view->templateOptions(); $markup = $tmplOpt->getValue('http://ns.ontowiki.net/SysOnt/Site/dataMarkupFormat', 'RDFa'); $markup = isset($options['markup']) ? $options['markup'] : $markup; $resource = isset($options['resource']) ? $options['resource'] : $this->view->resourceUri; $html = array(); $attr = ''; $iprefix = ''; $type = null; $rel = array(); $rev = array(); $itemref = null; // can generate new namespaces which weren't included in html element //$resource = $this->view->curie($resource); if (isset($options['type'])) { $type = $options['type']; } else { $query = new Erfurt_Sparql_Query2(); $query->addProjectionVar($type = new Erfurt_Sparql_Query2_Var('type')); $query->addTriple(new Erfurt_Sparql_Query2_IriRef($resource), new Erfurt_Sparql_Query2_IriRef(EF_RDF_TYPE), $type); if ($types = $model->sparqlQuery($query)) { $type = $types[0]['type']; } } if (isset($options['rel'])) { $rel = $options['rel']; } elseif (isset($this->view->rel)) { $rel = $this->view->rel; } if (!is_array($rel)) { $rel = array($rel); } if (isset($options['rev'])) { $rev = $options['rev']; } elseif (isset($this->view->rev)) { $rev = $this->view->rev; } if (!is_array($rev)) { $rev = array($rev); } if (isset($options['itemref'])) { $itemref = $options['itemref']; } elseif (isset($this->view->itemref)) { $itemref = $this->view->itemref; } foreach (array('id', 'class') as $name) { if (isset($options[$name])) { $html[$name] = $options[$name]; } elseif (isset($this->view->{$name})) { $html[$name] = $this->view->{$name}; } } switch ($markup) { case 'RDFa': $attr .= ' resource="' . $resource . '"'; if ($type !== null) { $attr .= ' typeof="' . $type . '"'; } if ($rel) { $attr .= ' rel="' . implode(' ', $rel) . '"'; } if ($rev) { $attr .= ' rev="' . implode(' ', $rev) . '"'; } break; case 'microdata': /* some parsers (Google) don't merge properties from multiple elements for the same resource */ if (isset(static::$_itemref[$resource])) { $flag = true; if (!isset($html['id'])) { //throw new OntoWiki_Exception('Attempting to create additional element for the same resource without itemref link (no itemref).'); $flag = false; } elseif (!in_array($html['id'], static::$_itemref[$resource])) { //throw new OntoWiki_Exception('Attempting to create additional element for the same resource without itemref link (ID not listed in itemref).'); $flag = false; } if ($flag) { break; } } $attr .= ' itemscope="itemscope"'; /* "The itemid attribute must not be specified on elements that do not have both an itemscope attribute and an itemtype attribute specified" */ if ($type !== null) { $attr .= sprintf(' itemid="%s" itemtype="%s"', $resource, $type); } if ($rel) { $attr .= sprintf(' itemprop="%s"', implode(' ', $rel)); } //if ($rev) $iprefix = sprintf('<link itemprop="%s" href="#TODO"/>%s', implode(' ', $rev), $iprefix); if ($itemref) { $attr .= sprintf(' itemref="%s"', implode(' ', $itemref)); /* remember which elements are linked using itemref so context markup can be disabled for them later */ static::$_itemref[$resource] = $itemref; } else { static::$_itemref[$resource] = array(); } break; } foreach ($html as $name => $value) { $attr .= ' ' . $name . '="' . $value . '"'; } if (!isset($options['tag'])) { if (!isset($this->view->tag)) { $this->view->tag = 'span'; } $tag = $this->view->tag; } else { $tag = $options['tag']; } // stack information for closecontext if (!isset($this->view->dataMarkupContextStack)) { $this->view->dataMarkupContextStack = array(); } array_push($this->view->dataMarkupContextStack, array('tag' => $tag)); return "<{$tag}{$attr}>{$iprefix}"; }
/** * Handles search requests */ public function searchAction() { $title = $this->_owApp->translate->_('Resource Search'); $this->view->placeholder('main.window.title')->set($title); OntoWiki::getInstance()->getNavigation()->disableNavigation(); $store = $this->_erfurt->getStore(); if (isset($this->_owApp->selectedModel) && null !== $this->_owApp->selectedModel) { $modelUri = $this->_owApp->selectedModel->getModelIri(); } else { $modelUri = null; } if ($this->_request->getParam('searchtext-input') !== null) { $searchText = trim($this->getParam('searchtext-input')); } $error = false; $errorMsg = ''; // check if search is already errorenous if (!$error) { // try sparql query pre search check (with limit to 1) $elements = $store->getSearchPattern($searchText, $modelUri); $query = new Erfurt_Sparql_Query2(); $query->addElements($elements); $query->setLimit(1); $query->addFrom($modelUri); try { $store->sparqlQuery($query); } catch (Exception $e) { // build error message $this->_owApp->appendMessage(new OntoWiki_Message($this->_owApp->translate->_('search failed'), OntoWiki_Message::ERROR)); $error = true; $errorMsg .= 'Message details: '; $errorMsg .= str_replace('LIMIT 1', '', $e->getMessage()); } } // if error occured set output for error page if ($error) { $this->view->errorMsg = $errorMsg; } else { // set redirect to effective search controller $url = new OntoWiki_Url(array('controller' => 'list'), array()); $url->setParam('s', $searchText); $url->setParam('init', '1'); $this->_redirect($url); } }
/** * 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; }
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; }
/** * RouteShutdown is the earliest event in the dispatch cycle, where a * fully routed request object is available */ public function routeShutdown(Zend_Controller_Request_Abstract $request) { if (isset($request->noListRedirect)) { return; } $ontoWiki = OntoWiki::getInstance(); // TODO: Refactor! The list helper is from an extension! Do not access extensions // from core code! if (!Zend_Controller_Action_HelperBroker::hasHelper('List')) { return; } $listHelper = Zend_Controller_Action_HelperBroker::getStaticHelper('List'); // only once and only when possible if (!$this->_isSetup && $ontoWiki->selectedModel != null && (isset($request->init) || isset($request->instancesconfig) || isset($request->s) || isset($request->class) || isset($request->p) || isset($request->limit))) { $frontController = Zend_Controller_Front::getInstance(); $store = $ontoWiki->erfurt->getStore(); $resource = $ontoWiki->selectedResource; $session = $ontoWiki->session; // when switching to another class: // reset session vars (regarding the list) if (isset($request->init)) { //echo 'kill list session'; // reset the instances object unset($session->instances); //reset config from tag explorer unset($session->cloudproperties); } //react on m parameter to set the selected model if (isset($request->m)) { try { $model = $store->getModel($request->getParam('m', null, false)); $ontoWiki->selectedModel = $model; } catch (Erfurt_Store_Exception $e) { $model = null; $ontoWiki->selectedModel = null; } } $list = $listHelper->getLastList(); if (!isset($request->list) && $list == null || isset($request->init)) { // instantiate model, that selects all resources $list = new OntoWiki_Model_Instances($store, $ontoWiki->selectedModel, array()); } else { // use the object from the session if (isset($request->list) && $request->list != $listHelper->getLastListName()) { if ($listHelper->listExists($request->list)) { $list = $listHelper->getList($request->list); $ontoWiki->appendMessage(new OntoWiki_Message('reuse list')); } else { throw new OntoWiki_Exception('your trying to configure a list, but there is no list name specified'); } } $list->setStore($store); // store is not serialized in session! reset it } //local function :) function _json_decode($string) { /* PHP 5.3 DEPRECATED ; REMOVE IN PHP 6.0 */ if (get_magic_quotes_gpc()) { // add slashes for unicode chars in json $string = str_replace('\\u', '\\\\u', $string); //$string = str_replace('\\u000a','', $string); $string = stripslashes($string); } /* ---- */ return json_decode($string, true); } //a shortcut for search param if (isset($request->s)) { if (isset($request->instancesconfig)) { $config = _json_decode($request->instancesconfig); if (null === $config) { throw new OntoWiki_Exception('Invalid parameter instancesconfig (json_decode failed): ' . $this->_request->setup); } } else { $config = array(); } if (!isset($config['filter'])) { $config['filter'] = array(); } $config['filter'][] = array('action' => 'add', 'mode' => 'search', 'searchText' => $request->s); $request->setParam('instancesconfig', json_encode($config)); } //a shortcut for class param if (isset($request->class)) { if (isset($request->instancesconfig)) { $config = _json_decode($request->instancesconfig); if (null === $config) { throw new OntoWiki_Exception('Invalid parameter instancesconfig (json_decode failed): ' . $this->_request->setup); } } else { $config = array(); } if (!isset($config['filter'])) { $config['filter'] = array(); } $config['filter'][] = array('action' => 'add', 'mode' => 'rdfsclass', 'rdfsclass' => $request->class); $request->setParam('instancesconfig', json_encode($config)); } //check for change-requests if (isset($request->instancesconfig)) { $config = _json_decode($request->instancesconfig); if (null === $config) { throw new OntoWiki_Exception('Invalid parameter instancesconfig (json_decode failed)'); } // TODO is this a bug? why access sort->asc when it is null? if (isset($config['sort'])) { if ($config['sort'] == null) { $list->orderByUri($config['sort']['asc']); } else { $list->setOrderProperty($config['sort']['uri'], $config['sort']['asc']); } } if (isset($config['shownProperties'])) { foreach ($config['shownProperties'] as $prop) { if ($prop['action'] == 'add') { $list->addShownProperty($prop['uri'], $prop['label'], $prop['inverse']); } else { $list->removeShownProperty($prop['uri'], $prop['inverse']); } } } if (isset($config['filter'])) { foreach ($config['filter'] as $filter) { // set default value for action and mode if they're not assigned if (!isset($filter['action'])) { $filter['action'] = 'add'; } if (!isset($filter['mode'])) { $filter['mode'] = 'box'; } if ($filter['action'] == 'add') { if ($filter['mode'] == 'box') { $list->addFilter($filter['property'], isset($filter['isInverse']) ? $filter['isInverse'] : false, isset($filter['propertyLabel']) ? $filter['propertyLabel'] : 'defaultLabel', $filter['filter'], isset($filter['value1']) ? $filter['value1'] : null, isset($filter['value2']) ? $filter['value2'] : null, isset($filter['valuetype']) ? $filter['valuetype'] : 'literal', isset($filter['literaltype']) ? $filter['literaltype'] : null, isset($filter['hidden']) ? $filter['hidden'] : false, isset($filter['id']) ? $filter['id'] : null, isset($filter['negate']) ? $filter['negate'] : false); } else { if ($filter['mode'] == 'search') { $list->addSearchFilter($filter['searchText'], isset($filter['id']) ? $filter['id'] : null); } else { if ($filter['mode'] == 'rdfsclass') { $list->addTypeFilter($filter['rdfsclass'], isset($filter['id']) ? $filter['id'] : null); } else { if ($filter['mode'] == 'cnav') { $list->addTripleFilter(NavigationHelper::getInstancesTriples($filter['uri'], $filter['cnav']), isset($filter['id']) ? $filter['id'] : null); } else { if ($filter['mode'] == 'query') { try { //echo $filter->query." "; $query = Erfurt_Sparql_Query2::initFromString($filter['query']); // TODO what the hell is this?! if (!$query instanceof Exception) { $list->addTripleFilter($query->getWhere()->getElements(), isset($filter['id']) ? $filter['id'] : null); } //echo $query->getSparql(); } catch (Erfurt_Sparql_ParserException $e) { $ontoWiki->appendMessage('the query could not be parsed'); } } } } } } } else { $list->removeFilter($filter['id']); } } } if (isset($config['order'])) { foreach ($config['order'] as $prop) { if ($prop['action'] == 'set') { if ($prop['mode'] == 'var') { $list->setOrderVar($prop['var']); } else { $list->setOrderUri($prop['uri']); } } } } } if (isset($request->limit)) { // how many results per page $list->setLimit($request->limit); } else { $list->setLimit(10); } if (isset($request->p)) { // p is the page number $list->setOffset($request->p * $list->getLimit() - $list->getLimit()); } else { $list->setOffset(0); } //save to session $name = isset($request->list) ? $request->list : 'instances'; $listHelper->updateList($name, $list, true); // avoid setting up twice $this->_isSetup = true; // redirect normal requests if config-params are given to a param-free uri // (so a browser reload by user does nothing unwanted) if (!$request->isXmlHttpRequest()) { //strip of url parameters that modify the list $url = new OntoWiki_Url(array(), null, array('init', 'instancesconfig', 's', 'p', 'limit', 'class', 'list')); //redirect $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector'); $redirector->gotoUrl($url); } } }
public function __construct() { $this->id = Erfurt_Sparql_Query2::getNextID(); }
/** * 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; }
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; }
public function __wakeup() { self::$idCounter = $this->idCounterSerialized; //restore the static var }
/** * 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; }
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); }
/** * 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); }
public function querylist($query, $template, $templateOptions = array(), $options = array()) { $owapp = OntoWiki::getInstance(); $store = $owapp->erfurt->getStore(); $model = $owapp->selectedModel; $prefix = isset($options['prefix']) ? $options['prefix'] : ''; $suffix = isset($options['suffix']) ? $options['suffix'] : ''; $delimiter = isset($options['delimiter']) ? $options['delimiter'] : ''; $property = isset($options['property']) ? $options['property'] : ''; if ($this->_titleHelper == null) { $this->_titleHelper = new OntoWiki_Model_TitleHelper($model); } if ($property !== '') { // construct query to retrieve specified property of the current resource $query = new Erfurt_Sparql_Query2(); $resourceUriVar = new Erfurt_Sparql_Query2_Var('resourceUri'); $query->addProjectionVar($resourceUriVar); $query->addTriple(new Erfurt_Sparql_Query2_IriRef($this->view->resourceUri), new Erfurt_Sparql_Query2_IriRef($property), $resourceUriVar); } try { $result = $model->sparqlQuery($query); } catch (Exception $e) { // executions failed (return nothing) return $e->getMessage(); } // pre-fill the title helper foreach ($result as $row) { foreach ($row as $value) { if (Erfurt_Uri::check($value)) { $this->_titleHelper->addResource($value); } } } /* * If the ordering doesn't work using the 'ORDER BY' clause you should add ASC() around the * variable which should by sorted. E.g. "… } ORDER BY ASC(?start) ASC(?end)" */ if (!stristr($query, 'ORDER BY')) { // sort results by resource title usort($result, array('Site_View_Helper_Querylist', '_cmpTitles')); } $return = ''; $count = count($result); $current = 0; $odd = true; foreach ($result as $row) { // shift status vars $current++; $odd = !$odd; // prepare a first / last hint for the template $listhint = $current == 1 ? 'first' : null; $listhint = $current == $count ? 'last' : $listhint; $row['listhint'] = $listhint; // prepare other template vars $row['oddclass'] = $odd ? 'odd' : 'even'; $row['rowcount'] = $count; $row['current'] = $current; if (!Erfurt_Uri::check($row['resourceUri'])) { $row['title'] = $row['resourceUri']; } else { $row['title'] = $this->_titleHelper->getTitle($row['resourceUri']); } $row = array_merge($row, $templateOptions); // render the template $return .= $prefix . $this->view->partial($template, $row) . $suffix; if ($current < $count) { $return .= $delimiter; } } return $return; }