示例#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
    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();
        }
    }
}