/** * 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); } }
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; }
/** * * Enter description here ... * * @param $uri string to convert to nice uri * @param $titleHelper TitleHelper instance to use to get titles for URIs */ private function generateUriFromSparql($uri, $titleHelper) { $schema = $this->loadNamingSchema($uri); $properties = array(); foreach ($schema as $element) { if (is_string($this->_config->property->{$element})) { $properties[$this->_config->property->{$element}] = array('element' => $element, 'rank' => '1'); } elseif (is_array($this->_config->property->{$element}->toArray())) { $countDeep = 0; foreach ($this->_config->property->{$element}->toArray() as $elementDeep) { $properties[(string) $elementDeep] = array('element' => $element, 'rank' => $countDeep++); } } } $query = new Erfurt_Sparql_Query2(); $sRef = new Erfurt_Sparql_Query2_IriRef($uri); $pVar = new Erfurt_Sparql_Query2_Var('p'); $oVar = new Erfurt_Sparql_Query2_Var('o'); $query->addProjectionVar($pVar); $query->addProjectionVar($oVar); $query->addTriple($sRef, $pVar, $oVar); $query->addFrom((string) $this->_model); $query->setLimit(100); $query->setDistinct(true); $container = new Erfurt_Sparql_Query2_ConditionalOrExpression(); foreach ($properties as $filterProp => $element) { $sameTerm = new Erfurt_Sparql_Query2_sameTerm($pVar, new Erfurt_Sparql_Query2_IriRef($filterProp)); //$filter = new Erfurt_Sparql_Query2_Filter($sameTerm); $container->addElement($sameTerm); } $query->addFilter($container); $result = $this->_owApp->erfurt->getStore()->sparqlQuery($query, array('withImports' => true)); $replacements = array(); foreach ($result as $row) { if (array_key_exists($row['p'], $properties)) { $titleHelper->addResource($row['p']); if (Erfurt_Uri::check($row['o'])) { $titleHelper->addResource($row['o']); } if (array_key_exists($properties[$row['p']]['element'], $replacements)) { $newRank = (int) $properties[$row['p']]['rank']; $minRank = $replacements[$properties[$row['p']]['element']]['rank']; if ($newRank < $minRank) { $replacements[$properties[$row['p']]['element']] = array('rank' => $newRank, 'value' => $row['o'], 'key' => $row['p']); } } else { $replacements[$properties[$row['p']]['element']] = array('rank' => $properties[$row['p']]['rank'], 'value' => $row['o'], 'key' => $row['p']); } } } $localName = ''; foreach ($schema as $element) { if (array_key_exists($element, $replacements)) { if (Erfurt_Uri::check($replacements[$element]['value'])) { $val = $titleHelper->getTitle($replacements[$element]['value']); } else { $val = $replacements[$element]['value']; } $val = $this->convertChars($val); $key = $this->convertChars($titleHelper->getTitle($replacements[$element]['key'])); $localName .= $key . '/' . $val . '/'; } } // no meaningful localname created falback to old uri (TODO or md5 a new one?) if ($localName === '') { return $uri; //$localName = 'resource/' . md5($uri . time()); } $base = ''; if ($this->_model !== null && $this->_model->getBaseIri() !== '') { $base = $this->_model->getBaseIri(); if ($base[strlen($base) - 1] !== '#' && $base[strlen($base) - 1] !== '/') { $base .= '/'; } } else { $count = 0; foreach (explode('/', $uri) as $element) { if ($count > 2) { break; } else { $count++; $base .= $element . '/'; } } } return $base . $localName; }
/** * 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; }
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); }