/** * Perform an RDQL query on this MemModel. * This method returns an associative array of variable bindings. * The values of the query variables can either be RAP's objects (instances of Node) * if $returnNodes set to TRUE, or their string serialization. * * @access public * @param string $queryString * @param boolean $returnNodes * @return array [][?VARNAME] = object Node (if $returnNodes = TRUE) * OR array [][?VARNAME] = string * */ function rdqlQuery($queryString, $returnNodes = TRUE) { // Import RDQL Package include_once RDFAPI_INCLUDE_DIR . PACKAGE_RDQL; $parser = new RdqlParser(); $parsedQuery =& $parser->parseQuery($queryString); // this method can only query this MemModel // if another model was specified in the from clause throw an error if (isset($parsedQuery['sources'][1])) { $errmsg = RDFAPI_ERROR . '(class: MemModel; method: rdqlQuery):'; $errmsg .= ' this method can only query this MemModel'; trigger_error($errmsg, E_USER_ERROR); } $engine = new RdqlMemEngine(); $res =& $engine->queryModel($this, $parsedQuery, $returnNodes); return $res; }
/** * Perform an RDQL query on this Model. Should work with all types of models. * This method returns a MemModel containing the result statements. * If $closure is set to TRUE, the result will additionally contain * statements found by the findForward-method for blank nodes. * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! * WARNING: If called with $closure = TRUE this method * can be slow with large models. * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! * * @author Anton K�tlbacher <*****@*****.**> * @author code snippets taken from the RAP Netapi by Phil Dawes and Chris Bizer * @access public * @param string $queryString * @param boolean $closure * @return object MemModel * */ function &getMemModelByRDQL($queryString, $closure = FALSE) { require_once RDFAPI_INCLUDE_DIR . PACKAGE_RDQL; $parser = new RdqlParser(); $parsedQuery =& $parser->parseQuery($queryString); // If there are variables used in the pattern but not // in the select clause, add them to the select clause foreach ($parsedQuery['patterns'] as $n => $pattern) { foreach ($pattern as $key => $val_1) { if ($val_1['value'][0] == '?') { if (!in_array($val_1['value'], $parsedQuery['selectVars'])) { array_push($parsedQuery['selectVars'], $val_1['value']); } } } } if (is_a($this, "DbModel")) { $engine = new RdqlDbEngine(); $model = $this; } elseif (is_a($this, "MemModel")) { $engine = new RdqlMemEngine(); $model = $this; } elseif (is_a($this, "ResModel")) { $engine = new RdqlMemEngine(); $model = $this->model; } $res = $engine->queryModel($model, $parsedQuery, TRUE); $rdqlIter = new RdqlResultIterator($res); $newModel = new MemModel(); // Build statements from RdqlResultIterator while ($rdqlIter->hasNext()) { $result = $rdqlIter->next(); foreach ($parsedQuery['patterns'] as $n => $pattern) { if (substr($pattern['subject']['value'], 0, 1) == '?') { $subj = $result[$pattern['subject']['value']]; } else { $subj = new Resource($pattern['subject']['value']); } if (substr($pattern['predicate']['value'], 0, 1) == '?') { $pred = $result[$pattern['predicate']['value']]; } else { $pred = new Resource($pattern['predicate']['value']); } if (substr($pattern['object']['value'], 0, 1) == '?') { $obj = $result[$pattern['object']['value']]; } else { if (isset($pattern['object']['is_literal'])) { $obj = new Literal($pattern['object']['value']); $obj->setDatatype($pattern['object']['l_dtype']); $obj->setLanguage($pattern['object']['l_lang']); } else { $obj = new Resource($pattern['object']['value']); } } $statement = new Statement($subj, $pred, $obj); $newModel->add($statement); // findForward() Statements containing an eventually given blank node // and add them to the result, if closure = true if (is_a($statement->object(), 'BlankNode') && $closure == True) { $newModel = $model->findForward($statement->object(), NULL, NULL, $newModel); } if (is_a($statement->subject(), 'BlankNode') && $closure == True) { $newModel = $model->findForward($statement->subject(), NULL, NULL, $newModel); } } } return $newModel; }
echo "<center><a href='" . $HTTP_SERVER_VARS['PHP_SELF'] . "'>\n <h2>Go back to input form.</h2></a></center>"; if (isset($_POST['query_string'])) { $queryString = stripslashes($_POST['query_string']); // Parse the query $parser = new RdqlParser(); $parsed =& $parser->parseQuery($queryString); // If more than one source file provided show an error message if (count($parsed['sources']) > 1) { echo "<center><p class='rdql_comment'>We're sorry, but this Online Demo allows you to query only one document</p></center>"; } // Create a new MemModel $model = ModelFactory::getDefaultModel(); // Load and parse document $model->load($parsed['sources'][0]); // Process the query $engine = new RdqlMemEngine(); $queryResult = $engine->queryModel($model, $parsed, TRUE); // Show the query string echo "<br><h3>Your query: </h3>"; echo "<table width='100%' bgcolor=#e7e7ef><tr><td>"; echo "<p bgcolor='34556'><code>" . nl2br(htmlspecialchars(stripslashes($_POST['query_string']))) . "</code></p>"; echo "</td></tr></table><br>"; // Show query result echo "<br><h3>Query result: </h3>"; $engine->writeQueryResultAsHtmlTable($queryResult); // Show the input model if option chosen if (isset($_POST['show_input']) && $_POST['show_input'] == "1") { echo "<br><br><h3>Source model: </h3>"; $model->writeAsHtmlTable(); } }