/** * tests if equals() works according to the RDF specifications * */ function testEquals() { $_SESSION['test'] = 'Litras Equals test'; $literal1 = new Literal('test'); $literal2 = new Literal('test'); $this->assertTrue($literal1->equals($literal2)); $literal2->setLanguage('DE'); $this->assertFalse($literal1->equals($literal2)); $literal1->setLanguage('FR'); $this->assertFalse($literal1->equals($literal2)); $literal1->setLanguage('DE'); $this->assertTrue($literal1->equals($literal2)); $literal1->setDatatype("http://www.w3.org/TR/xmlschema-2/integer"); $this->assertFalse($literal1->equals($literal2)); $literal2->setDatatype("http://www.w3.org/TR/xmlschema-2/integer1"); $this->assertFalse($literal1->equals($literal2)); $literal2->setDatatype("http://www.w3.org/TR/xmlschema-2/integer"); $this->assertTrue($literal1->equals($literal2)); }
function generateResultStatementsFromVarResult(&$result, $parsedq, &$outm, $closure, &$model) { foreach ($parsedq['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 ($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']); } } $stmt = new Statement($subj, $pred, $obj); // bNode closure if (is_a($stmt->object(), 'BlankNode') && $closure == True) { getBNodeClosure($stmt->object(), $model, $outm); } if (is_a($stmt->subject(), 'BlankNode') && $closure == True) { getBNodeClosure($stmt->subject(), $model, $outm); } // Add statement to model $outm->add($stmt); } }
/** * Filter tuples containing variables matching all patterns from the WHERE clause * of an RDQL query. As a result of a database query using ADOdb these tuples * are returned as an ADORecordSet object, which is then passed to this function. * * @param object ADORecordSet &$recordSet * @return array [][?VARNAME]['value'] = string * ['nType'] = string * ['l_lang'] = string * ['l_dtype'] = string * @access private */ function filterQueryResult(&$recordSet) { $queryResult = array(); if (isset($this->parsedQuery['filters'])) { while (!$recordSet->EOF) { foreach ($this->parsedQuery['filters'] as $filter) { $evalFilterStr = $filter['evalFilterStr']; // evaluate regex equality expressions of each filter foreach ($filter['regexEqExprs'] as $i => $expr) { preg_match($expr['regex'], $recordSet->fields[$this->rsIndexes[$expr['var']]['value']], $match); $op = substr($expr['operator'], 0, 1); if ($op != '!' && !isset($match[0]) || $op == '!' && isset($match[0])) { $evalFilterStr = str_replace("##RegEx_{$i}##", 'FALSE', $evalFilterStr); } else { $evalFilterStr = str_replace("##RegEx_{$i}##", 'TRUE', $evalFilterStr); } } // evaluate string equality expressions foreach ($filter['strEqExprs'] as $i => $expr) { $exprBoolVal = 'FALSE'; switch ($expr['value_type']) { case 'variable': if ($recordSet->fields[$this->rsIndexes[$expr['var']]['value']] == $recordSet->fields[$this->rsIndexes[$expr['value']]['value']] && $expr['operator'] == 'eq' || $recordSet->fields[$this->rsIndexes[$expr['var']]['value']] != $recordSet->fields[$this->rsIndexes[$expr['value']]['value']] && $expr['operator'] == 'ne') { $exprBoolVal = 'TRUE'; } break; case 'URI': if (isset($this->rsIndexes[$expr['var']]['nType']) && $recordSet->fields[$this->rsIndexes[$expr['var']]['nType']] == 'l') { if ($expr['operator'] == 'ne') { $exprBoolVal = 'TRUE'; } break; } if ($recordSet->fields[$this->rsIndexes[$expr['var']]['value']] == $expr['value'] && $expr['operator'] == 'eq' || $recordSet->fields[$this->rsIndexes[$expr['var']]['value']] != $expr['value'] && $expr['operator'] == 'ne') { $exprBoolVal = 'TRUE'; } break; case 'Literal': if (!isset($this->rsIndexes[$expr['var']]['nType']) || $recordSet->fields[$this->rsIndexes[$expr['var']]['nType']] != 'l') { if ($expr['operator'] == 'ne') { $exprBoolVal = 'TRUE'; } break; } $filterLiteral = new Literal($expr['value'], $expr['value_lang']); $filterLiteral->setDatatype($expr['value_dtype']); $resultLiteral = new Literal($recordSet->fields[$this->rsIndexes[$expr['var']]['value']]); $resultLiteral->setDatatype($recordSet->fields[$this->rsIndexes[$expr['var']]['l_dtype']]); $resultLiteral->setLanguage($recordSet->fields[$this->rsIndexes[$expr['var']]['l_lang']]); $equal = $resultLiteral->equals($filterLiteral); if ($equal && $expr['operator'] == 'eq' || !$equal && $expr['operator'] == 'ne') { $exprBoolVal = 'TRUE'; } else { $exprBoolVal = 'FALSE'; } } $evalFilterStr = str_replace("##strEqExpr_{$i}##", $exprBoolVal, $evalFilterStr); } // evaluate numerical expressions foreach ($filter['numExprVars'] as $varName) { $varValue = "'" . $recordSet->fields[$this->rsIndexes[$varName]['value']] . "'"; $evalFilterStr = str_replace($varName, $varValue, $evalFilterStr); } eval("\$filterBoolVal = {$evalFilterStr}; \$eval_filter_ok = TRUE;"); if (!isset($eval_filter_ok)) { trigger_error(RDQL_AND_ERR . "'" . htmlspecialchars($filter['string']) . "'", E_USER_ERROR); } if (!$filterBoolVal) { $recordSet->MoveNext(); continue 2; } } $queryResult[] = $this->_convertRsRowToQueryResultRow($recordSet->fields); $recordSet->MoveNext(); } } else { while (!$recordSet->EOF) { $queryResult[] = $this->_convertRsRowToQueryResultRow($recordSet->fields); $recordSet->MoveNext(); } } return $queryResult; }
/** * Adds a new statement to the model * This method is called by generateModel(). * * @access private * @param string &$user_data * @param string $subject_type * @param string $subject * @param string $predicate * @param string $ordinal * @param string $object_type * @param string $object * @param string $xml_lang ) * @return object MemModel */ function add_statement_to_model(&$user_data, $subject_type, $subject, $predicate, $ordinal, $object_type, $object, $xml_lang, $datatype) { // ParseUnicode if (UNIC_RDF) { $subject = $this->str2unicode_nfc($subject); $predicate = $this->str2unicode_nfc($predicate); $object = $this->str2unicode_nfc($object); } //create subject if ($subject_type == RDF_SUBJECT_TYPE_BNODE) { $objsub = new BlankNode($subject); } else { $objsub = new Resource($subject); } // create predicate $objpred = new Resource($predicate); // create object if ($object_type == RDF_OBJECT_TYPE_RESOURCE || $object_type == RDF_OBJECT_TYPE_BNODE) { if ($object_type == RDF_OBJECT_TYPE_BNODE) { $objobj = new BlankNode($object); } else { $objobj = new Resource($object); } } else { $objobj = new Literal($object); if ($datatype != '') { $objobj->setDatatype($datatype); } elseif ($xml_lang != '') { $objobj->setLanguage($xml_lang); } } // create statement $statement = new Statement($objsub, $objpred, $objobj); // add statement to model if (CREATE_MODEL_WITHOUT_DUPLICATES == TRUE) { $this->model->addWithoutDuplicates($statement); } else { $this->model->add($statement); } }
/** * Search in $memModel for triples matching one pattern from the WHERE clause. * 'ANY' input for $subjLabel..$objLabel, $obj_is will match anything. * NULL input for $objDtype will only match obj->dtype = NULL * NULL input for $objLanguage will match obj->lang = NULL or anything if a * literal is datatyped (except for XMLLiterals and plain literals) * This method also checks internal bindings if provided. * * @param object MemModel $memModel * @param string $subjLabel * @param string $predLabel * @param string $objLabel * @param string $obj_is * @param string $objLanguage * @param string $objDtype * @param array $intBindings [] = string * @return object MemModel * @access private */ function findTriplesMatchingPattern(&$memModel, $subjLabel, $predLabel, $obj_is, $objLabel, $objLang, $objDtype, &$intBindings) { $res = new MemModel(); if ($memModel->isEmpty()) { return $res; } if ($subjLabel == 'ANY') { $subj = NULL; } else { $subj = new Resource($subjLabel); } if ($predLabel == 'ANY') { $pred = NULL; } else { $pred = new Resource($predLabel); } if ($objLabel == 'ANY') { $obj = NULL; } else { if ($obj_is == 'Literal') { $obj = new Literal($objLabel); $obj->setDatatype($objDtype); $obj->setLanguage($objLang); } else { $obj = new Resource($objLabel); } } $res = $memModel->find($subj, $pred, $obj); if ($intBindings) { foreach ($res->triples as $triple) { if (!$this->_checkIntBindings($triple, $intBindings)) { $res->remove($triple); } } } 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; }
function _generateModelLiteral() { $model = new MemModel(); $model->setBaseURI('http://www.example.org'); $sub = new Resource('http://www.example.org/subject1'); $pred = new Resource('http://www.example.org/predicate1'); $obj = new Literal('http://www.example.org/object1'); $obj->setDatatype('test'); $obj->setLanguage('DE'); $model->add(new Statement($sub, $pred, $obj)); return $model; }
function tagClosed($parser, $name) { if ($this->mode == 1) { $lit = new Literal($this->current_literal); if ($this->lang) { $lit->setLanguage($this->lang); } if ($this->dtype) { $lit->setDatatype($this->dtype); } $this->arrOutput[$this->counter][$this->varname] = $lit; $this->mode = -1; } }
/** * return a mathing resource tyoe * * @param string * @param object simpleXMLNode $value * @access private */ function _element2Resource($tag, $value) { switch ($tag) { case 'uri': return new Resource((string) $value); break; case 'id': return new BlankNode((string) $value); break; case 'typedLiteral': $literal = new Literal((string) $value); $literal->setDatatype((string) $value['datatype']); return $literal; break; case 'plainLiteral': $literal = new Literal((string) $value); if (isset($value['xml:lang'])) { $literal->setLanguage((string) $value['xml:lang']); } return $literal; break; } }
function tagData($parser, $tagData) { switch ($this->mode) { case 0: $this->arrOutput[$this->counter][$this->varname] = new Resource($tagData); $this->mode = -1; break; case 1: $lit = new Literal($tagData); if ($this->lang) { $lit->setLanguage($this->lang); } if ($this->dtype) { $lit->setDatatype($this->dtype); } $this->arrOutput[$this->counter][$this->varname] = $lit; $this->mode = -1; break; case 2: if ($tagData == "/") { $bn = "bNode" . $this->bncounter; $this->bncounter++; } else { $bn = $tagData; } $this->arrOutput[$this->counter][$this->varname] = new BlankNode($bn); $this->mode = -1; break; case 3: $this->arrOutput = $tagData; $this->mode = -1; break; } }