Example #1
0
/**
 * The RDQL query operation operation executes a RDQL query against a model.
 *
 * @version  $Id: rdql.php,v 1.8 2006/05/15 05:24:37 tgauss Exp $
 * @author Phil Dawes <*****@*****.**>
 *
 * @package netapi
 * @todo nothing
 * @access	public
 */
function rdql($model, $serializer)
{
    if (isset($_REQUEST['closure'])) {
        if (strtoupper($_REQUEST['closure']) == "TRUE") {
            $closure = True;
        } else {
            $closure = False;
        }
    } else {
        $closure = False;
    }
    $query = $_REQUEST["query"];
    // php appears to escape quotes, so unescape them
    $query = str_replace('\\"', '"', $query);
    $query = str_replace("\\'", "'", $query);
    // decode %xx
    $query = rawurldecode($query);
    /// debug
    //var_dump($query);
    $r = new RdqlParser();
    $parsedq = $r->parseQuery($query);
    addMissingSelectVarsToQuery($parsedq);
    if (is_a($model, 'MemModel')) {
        $eng = new RdqlMemEngine();
    } else {
        $eng = new RdqlDbEngine();
    }
    $rdqlres = $eng->queryModel($model, $parsedq, TRUE);
    $rdqlIter = new RdqlResultIterator($rdqlres);
    $outm = new MemModel();
    while ($rdqlIter->hasNext()) {
        $result = $rdqlIter->next();
        generateResultStatementsFromVarResult($result, $parsedq, $outm, $closure, $model);
    }
    echo $serializer->Serialize($outm);
    $outm->close();
}
Example #2
0
 /**
  * Perform an RDQL query on this DbModel.
  * 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)
 {
     require_once RDFAPI_INCLUDE_DIR . PACKAGE_RDQL;
     $parser = new RdqlParser();
     $parsedQuery =& $parser->parseQuery($queryString);
     // this method can only query this DbModel
     // if another model was specified in the from clause throw an error
     if (isset($parsedQuery['sources'][0])) {
         if ($parsedQuery['sources'][0] != $this->modelURI) {
             $errmsg = RDFAPI_ERROR . '(class: DbModel; method: rdqlQuery):';
             $errmsg .= ' this method can only query this DbModel';
             trigger_error($errmsg, E_USER_ERROR);
         }
     }
     $engine = new RdqlDbEngine();
     $res =& $engine->queryModel($this, $parsedQuery, $returnNodes);
     return $res;
 }
Example #3
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;
 }
Example #4
0
              </TR>
            </TBODY>
          </TABLE>
      <P><INPUT name=submit type=submit value="submit me!">
      </P></FORM><BR>
<?php 
} else {
    // Process the query if submitted
    define("RDFAPI_INCLUDE_DIR", "./../api/");
    include RDFAPI_INCLUDE_DIR . "RdfAPI.php";
    include RDFAPI_INCLUDE_DIR . "rdql/RDQL.php";
    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>";