예제 #1
0
 /**
  * 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;
 }
예제 #2
0
 /**
  * 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;
 }
예제 #3
0
 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();
     }
 }