Source for file MemModel.php
Documentation is available at MemModel.php
require_once RDFAPI_INCLUDE_DIR .
'model/Model.php';
// ----------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------
* A MemModel is an RDF Model, which is stored in the main memory.
* This class provides methods for manipulating MemModels.
* @version $Id: fsource_model__modelMemModel.php.html 443 2007-06-01 16:25:38Z cax $
* @author Chris Bizer <chris@bizer.de>
* @author Gunnar AAstrand Grimnes <ggrimnes@csd.abdn.ac.uk>
* @author Radoslaw Oldakowski <radol@gmx.de>
* @author Daniel Westphal <mail@d-westphal.de>
* @author Tobias Gauß <tobias.gauss@web.de>
* Triples of the MemModel
* Array containing the search indices
* @var array['INDEX_TYPE'][]['label'][]['PosInModel']
* depending on which index is used this variable is -1,0,1,2 or 3
* 0 : default indices over subject, predicate, object separate
* 1 : index over subject+predicate+object
* 2 : index over subject+predicate
* 3 : index over subject+object
var $parsedNamespaces=
array();
* You can supply a base_uri
* Set a base URI for the MemModel.
* Affects creating of new resources and serialization syntax.
* If the URI doesn't end with # : or /, then a # is added to the URI.
if (!($c==
'#' ||
$c==
':' ||
$c==
'/' ||
$c==
"\\"))
* Number of triples in the MemModel
return count($this->triples);
* Checks if MemModel is empty
if (count($this->triples) ==
0) {
* Adds a new triple to the MemModel without checking if the statement is already in the MemModel.
* So if you want a duplicate free MemModel use the addWithoutDuplicates() function (which is slower then add())
* @param object Statement $statement
function add($statement) {
if (!is_a($statement, 'Statement')) {
$errmsg =
RDFAPI_ERROR .
'(class: MemModel; method: add): Statement expected.';
if($this->indexed != -
1){
$this->triples[] =
$statement;
$this->_indexOpr($statement,$k,4,1);
$this->_indexOpr($statement,$k,5,1);
$this->_indexOpr($statement,$k,6,1);
$this->_indexOpr($statement,$k,$this->indexed,1);
$this->triples[] =
$statement;
* Checks if a new statement is already in the MemModel and adds the statement, if it is not in the MemModel.
* addWithoutDuplicates() is significantly slower then add().
* Retruns TRUE if the statement is added.
* @param object Statement $statement
if (!is_a($statement, 'Statement')) {
$errmsg =
RDFAPI_ERROR .
'(class: MemModel; method: addWithoutDuplicates): Statement expected.';
* Removes the triple from the MemModel.
* TRUE if the triple is removed.
* @param object Statement $statement
if (!is_a($statement, 'Statement')) {
$errmsg =
RDFAPI_ERROR .
'(class: MemModel; method: remove): Statement expected.';
foreach($this->triples as $key =>
$value) {
if ($this->matchStatement($value, $statement->subject(), $statement->predicate(), $statement->object())) {
unset
($this->triples[$key]);
$del=
$this->_indexOpr($statement,$k,4,0);
$this->_indexOpr($statement,$k,5,0);
$this->_indexOpr($statement,$k,6,0);
unset
($this->triples[$del]);
$del=
$this->_indexOpr($statement,$k,$this->indexed,0);
unset
($this->triples[$del]);
* Short Dump of the MemModel.
return 'MemModel[baseURI=' .
$this->getBaseURI() .
'; size=' .
$this->size() .
']';
* Dumps of the MemModel including all triples.
foreach($this->triples as $value) {
$dump .=
$value->toString() .
chr(13);
* Writes the RDF serialization of the MemModel as HTML.
$rdf =
& $ser->serialize($this);
* Writes the RDF serialization of the MemModel as HTML table.
// Import Package Utility
* Writes the RDF serialization of the MemModel as HTML table.
$rdf =
& $ser->serialize($this);
* Saves the RDF,N3 or N-Triple serialization of the MemModel to a file.
* You can decide to which format the model should be serialized by using a
* corresponding suffix-string as $type parameter. If no $type parameter
* is placed this method will serialize the model to XML/RDF format.
* Returns FALSE if the MemModel couldn't be saved to the file.
* @param string $filename
function saveAs($filename, $type =
'rdf') {
// get suffix and create a corresponding serializer
print
('Serializer type not properly defined. Use the strings "rdf","n3" or "nt".');
return $ser->saveAs($this, $filename);
* Tests if the MemModel contains the given triple.
* TRUE if the triple belongs to the MemModel;
* @param object Statement &$statement
// no index ->linear contains
foreach($this->triples as $value) {
if ($value->equals($statement)){
$res =
$this->_containsIndex($statement,4);
return $this->_containsIndex($statement,$this->indexed);
* Determine if all of the statements in a model are also contained in this MemModel.
* True if all of the statements in $model are also contained in this MemModel and false otherwise.
* @param object Model &$model
if (is_a($model, 'MemModel')) {
foreach($model->triples as $statement)
}elseif (is_a($model, 'DbModel'))
return $model->containsAll($this);
$errmsg =
RDFAPI_ERROR .
'(class: MemModel; method: containsAll): Model expected.';
* Determine if any of the statements in a model are also contained in this MemModel.
* True if any of the statements in $model are also contained in this MemModel and false otherwise.
* @param object Model &$model
if (is_a($model, 'MemModel')) {
foreach($model->triples as $modelStatement)
}elseif (is_a($model, 'DbModel'))
return $model->containsAny($this);
$errmsg =
RDFAPI_ERROR .
'(class: MemModel; method: containsAll): Model expected.';
* Builds a search index for the statements in the MemModel.
* The index is used by the find(),contains(),add() and remove() functions.
* Performance example using a model with 43000 statements on a Linux machine:
* Find without index takes 1.7 seconds.
* Indexing takes 1.8 seconds.
* Find with index takes 0.001 seconds.
* So if you want to query a model more then once, build a index first.
* The defaultindex is indices over subject, predicate, object seperate.
* mode = 0 : indices over subject,predicate,object (default)
* mode = 1 : index over subject+predicate+object
* mode = 2 : index over subject+predicate
* mode = 3 : index over subject+object
foreach($this->triples as $k =>
$t) {
$this->_indexOpr($t,$k,4,1);
$this->_indexOpr($t,$k,5,1);
$this->_indexOpr($t,$k,6,1);
foreach($this->triples as $k =>
$t) {
$this->_indexOpr($t,$k,$this->indexed,1);
* Returns true if there is an index, false if not.
* -1 if there is no index, 0 if there are indices over S,P,O(separate),
* 1 if there is an index over SPO, 2 if there is an index over SP and 3 if
* there is an index over SO.
* General method to search for triples.
* NULL input for any parameter will match anything.
* Example: $result = $m->find( NULL, NULL, $node );
* Finds all triples with $node as object.
* Returns an empty MemModel if nothing is found.
* @param object Node $subject
* @param object Node $predicate
* @param object Node $object
* @return object MemModel
function find($subject,$predicate,$object) {
(!is_a($subject, 'Resource') &&
$subject !=
NULL) ||
(!is_a($predicate, 'Resource') &&
$predicate !=
NULL) ||
(!is_a($object, 'Node') &&
$object !=
NULL)
$errmsg =
RDFAPI_ERROR .
'(class: MemModel; method: find): Parameters must be subclasses of Node or NULL';
if($subject ==
NULL &&
$predicate ==
NULL &&
$object ==
NULL)
if($subject!=
NULL &&
$predicate !=
NULL &&
$object !=
NULL){
$pos=
$subject->getLabel().
$predicate->getLabel().
$object->getLabel();
return $this->_findInIndex($pos,$subject,$predicate,$object,1);
if($subject!=
NULL &&
$predicate !=
NULL){
$pos=
$subject->getLabel().
$predicate->getLabel();
return $this->_findInIndex($pos,$subject,$predicate,$object,2);
if($subject!=
NULL &&
$object !=
NULL){
$pos=
$subject->getLabel().
$object->getLabel();
return $this->_findInIndex($pos,$subject,$predicate,$object,3);
$pos=
$subject->getLabel();
return $this->_findInIndex($pos,$subject,$predicate,$object,4);
$pos=
$predicate->getLabel();
return $this->_findInIndex($pos,$subject,$predicate,$object,5);
$pos=
$object->getLabel();
return $this->_findInIndex($pos,$subject,$predicate,$object,6);
// if no index: linear search
foreach($this->triples as $value) {
if ($this->matchStatement($value, $subject, $predicate, $object))
* Method to search for triples using Perl-style regular expressions.
* NULL input for any parameter will match anything.
* Example: $result = $m->find_regex( NULL, NULL, $regex );
* Finds all triples where the label of the object node matches the regular expression.
* Returns an empty MemModel if nothing is found.
* @param string $subject_regex
* @param string $predicate_regex
* @param string $object_regex
* @return object MemModel
function findRegex($subject_regex, $predicate_regex, $object_regex) {
if($subject_regex ==
NULL &&
$predicate_regex ==
NULL &&
$object_regex ==
NULL)
foreach($this->triples as $value) {
($subject_regex ==
NULL ||
preg_match($subject_regex, $value->subj->getLabel())) &&
($predicate_regex ==
NULL ||
preg_match($predicate_regex, $value->pred->getLabel())) &&
($object_regex ==
NULL ||
preg_match($object_regex, $value->obj->getLabel()))
* Returns all tripels of a certain vocabulary.
* $vocabulary is the namespace of the vocabulary inluding a # : / char at the end.
* e.g. http://www.w3.org/2000/01/rdf-schema#
* Returns an empty MemModel if nothing is found.
* @param string $vocabulary
* @return object MemModel
if($vocabulary ==
NULL ||
$vocabulary ==
'')
foreach($this->indexArr[5] as $key =>
$value){
if(substr($key,0,$pos)==
$vocabulary){
for($i=
1;$i<=
$value[0];$i++
){
$res->add($this->triples[$value[$i]]);
// Import Package Utility
foreach($this->triples as $value) {
* Searches for triples and returns the first matching statement.
* NULL input for any parameter will match anything.
* Example: $result = $m->findFirstMatchingStatement( NULL, NULL, $node );
* Returns the first statement of the MemModel where the object equals $node.
* Returns an NULL if nothing is found.
* You can define an offset to search for. Default = 0
* @param object Node $subject
* @param object Node $predicate
* @param object Node $object
* @return object Statement
for($i=
0;$i<=
$offset;$i++
)
$res =
$this->findFirstMatchOff($subject, $predicate, $object, $currentOffset);
return $this->triples[$res];
* Searches for triples and returns the first matching statement from a given offset.
* This method is used by the util/findIterator. NULL input for any parameter will match anything.
* Example: $result = $m->findFirstMatchingStatement( NULL, NULL, $node, $off );
* Returns the position of the first statement of the MemModel where the object equals $node from the given
* Returns an -1 if nothing is found.
* @param object Node $subject
* @param object Node $predicate
* @param object Node $object
function findFirstMatchOff($subject,$predicate, $object,$off) {
(!is_a($subject, 'Resource') &&
$subject !=
NULL) ||
(!is_a($predicate, 'Resource') &&
$predicate !=
NULL) ||
(!is_a($object, 'Node') &&
$object !=
NULL)
$errmsg =
RDFAPI_ERROR .
'(class: MemModel; method: find): Parameters must be subclasses of Node or NULL';
if($subject ==
NULL &&
$predicate ==
NULL &&
$object ==
NULL)
foreach ($this->triples as $key =>
$statement)
if($subject!=
NULL &&
$predicate !=
NULL &&
$object !=
NULL){
$pos=
$subject->getLabel().
$predicate->getLabel().
$object->getLabel();
return $this->_findMatchIndex($pos,$subject,$predicate,$object,1,$off);
if($subject!=
NULL &&
$predicate !=
NULL){
$pos=
$subject->getLabel().
$predicate->getLabel();
return $this->_findMatchIndex($pos,$subject,$predicate,$object,2,$off);
if($subject!=
NULL &&
$object !=
NULL){
$pos=
$subject->getLabel().
$object->getLabel();
return $this->_findMatchIndex($pos,$subject,$predicate,$object,3,$off);
$pos=
$subject->getLabel();
return $this->_findMatchIndex($pos,$subject,$predicate,$object,4,$off);
$pos=
$predicate->getLabel();
return $this->_findMatchIndex($pos,$subject,$predicate,$object,5,$off);
$pos=
$object->getLabel();
return $this->_findMatchIndex($pos,$subject,$predicate,$object,6,$off);
// if no index: linear search
foreach($this->triples as $key =>
$value){
if ($this->matchStatement($value, $subject, $predicate, $object)){
* Searches for triples and returns the number of matches.
* NULL input for any parameter will match anything.
* Example: $result = $m->findCount( NULL, NULL, $node );
* Finds all triples with $node as object.
* @param object Node $subject
* @param object Node $predicate
* @param object Node $object
function findCount($subject, $predicate, $object) {
$res =
$this->find($subject, $predicate, $object);
* 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.
* @param string $queryString
* @param boolean $returnNodes
* @return array [][?VARNAME] = object Node (if $returnNodes = TRUE)
* OR array [][?VARNAME] = string
function rdqlQuery($queryString, $returnNodes =
TRUE) {
$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';
$res =
& $engine->queryModel($this, $parsedQuery, $returnNodes);
* Perform an RDQL query on this MemModel.
* This method returns an RdqlResultIterator 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.
* @param string $queryString
* @param boolean $returnNodes
* @return object RdqlResultIterator = with values as object Node (if $returnNodes = TRUE)
* OR object RdqlResultIterator = with values as strings if (if $returnNodes = FALSE)
* General method to replace nodes of a MemModel.
* NULL input for any parameter will match nothing.
* Example: $m->replace($node, NULL, $node, $replacement);
* Replaces all $node objects beeing subject or object in
* any triple of the MemModel with the $needle node.
* @param object Node $subject
* @param object Node $predicate
* @param object Node $object
* @param object Node $replacement
function replace($subject, $predicate, $object, $replacement) {
(!is_a($replacement, 'Node')) ||
(!is_a($subject, 'Resource') &&
$subject !=
NULL) ||
(!is_a($predicate, 'Resource') &&
$predicate !=
NULL) ||
(!is_a($object, 'Node') &&
$object !=
NULL)
$errmsg =
RDFAPI_ERROR .
'(class: MemModel; method: replace): Parameters must be subclasses of Node or NULL';
foreach($this->triples as $key =>
$value) {
if ($this->triples[$key]->subj->equals($subject)) {
$this->triples[$key]->subj =
$replacement;
if ($this->triples[$key]->pred->equals($predicate))
$this->triples[$key]->pred =
$replacement;
if ($this->triples[$key]->obj->equals($object))
$this->triples[$key]->obj =
$replacement;
$this->index($this->indexed);
* Internal method that checks, if a statement matches a S, P, O or NULL combination.
* NULL input for any parameter will match anything.
* @param object Statement $statement
* @param object Node $subject
* @param object Node $predicate
* @param object Node $object
function matchStatement($statement, $subject, $predicate, $object) {
if(($subject !=
NULL) AND !($statement->subj->equals($subject)))
if($predicate !=
NULL &&
!($statement->pred->equals($predicate)))
if($object !=
NULL &&
!($statement->obj->equals($object)))
* Checks if two models are equal.
* Two models are equal if and only if the two RDF graphs they represent are isomorphic.
* @param object model &$that
if (!is_a($that, 'Model')) {
$errmsg =
RDFAPI_ERROR .
'(class: MemModel; method: equals): Model expected.';
if ($this->size() !=
$that->size())
if (!$this->containsAll($that))
include_once(RDFAPI_INCLUDE_DIR.
"util/ModelComparator.php");
* Returns a new MemModel that is the set-union of the MemModel with another model.
* Duplicate statements are removed. If you want to allow duplicates, use addModel() which is much faster.
* The result of taking the set-union of two or more RDF graphs (i.e. sets of triples)
* is another graph, which we will call the merge of the graphs.
* Each of the original graphs is a subgraph of the merged graph. Notice that when forming
* a merged graph, two occurrences of a given uriref or literal as nodes in two different
* graphs become a single node in the union graph (since by definition they are the same
* uriref or literal) but blank nodes are not 'merged' in this way; and arcs are of course
* never merged. In particular, this means that every blank node in a merged graph can be
* identified as coming from one particular graph in the original set of graphs.
* Notice that one does not, in general, obtain the merge of a set of graphs by concatenating
* their corresponding N-triples documents and constructing the graph described by the merged
* document, since if some of the documents use the same node identifiers, the merged document
* will describe a graph in which some of the blank nodes have been 'accidentally' merged.
* To merge Ntriples documents it is necessary to check if the same nodeID is used in two or
* more documents, and to replace it with a distinct nodeID in each of them, before merging the
* documents. (Not implemented yet !!!!!!!!!!!)
* @param object Model $model
* @return object MemModel
function & unite(&$model) {
if (!is_a($model, 'Model')) {
$errmsg =
RDFAPI_ERROR .
'(class: MemModel; method: unite): Model expected.';
if (is_a($model, 'MemModel')) {
require_once RDFAPI_INCLUDE_DIR .
'util/StatementIterator.php';
while($statement=
$stateIt->next())
$res->addWithoutDuplicates($statement);
elseif (is_a($model, 'DbModel')) {
$memModel =
& $model->getMemModel();
foreach($memModel->triples as $value)
$res->addWithoutDuplicates($value);
* Returns a new MemModel that is the subtraction of another model from this MemModel.
* @param object Model $model
* @return object MemModel
if (!is_a($model, 'Model')) {
$errmsg =
RDFAPI_ERROR .
'(class: MemModel; method: subtract): Model expected.';
if (is_a($model, 'MemModel'))
require_once RDFAPI_INCLUDE_DIR .
'util/StatementIterator.php';
while($statement=
$stateIt->next())
$res->remove($statement);
elseif (is_a($model, 'DbModel'))
$memModel =
& $model->getMemModel();
foreach($memModel->triples as $value)
* Returns a new MemModel containing all the statements which are in both this MemModel and another.
* @param object Model $model
* @return object MemModel
if (!is_a($model, 'Model')) {
$errmsg =
RDFAPI_ERROR .
'(class: MemModel; method: intersect: Model expected.';
if (is_a($model, 'DbModel') ||
is_a($model, 'RDFSBModel'))
$memModel =
& $model->getMemModel();
foreach($memModel->triples as $value) {
elseif (is_a($model, 'MemModel'))
foreach($model->triples as $value) {
* Adds another model to this MemModel.
* Duplicate statements are not removed.
* If you don't want duplicates, use unite().
* If any statement of the model to be added to this model contains a blankNode
* with an identifier already existing in this model, a new blankNode is generated.
* @param object Model $model
if (!is_a($model, 'Model')) {
$errmsg =
RDFAPI_ERROR .
'(class: MemModel; method: addModel): Model expected.';
$blankNodes_tmp =
array();
if (is_a($model, 'MemModel')) {
require_once RDFAPI_INCLUDE_DIR .
'util/StatementIterator.php';
while($statement=
$stateIt->next())
$this->_addStatementFromAnotherModel($statement, $blankNodes_tmp);
elseif (is_a($model, 'DbModel')) {
$memModel =
& $model->getMemModel();
foreach($memModel->triples as $value)
$this->_addStatementFromAnotherModel($value, $blankNodes_tmp);
$this->index($this->indexed);
* Returns a new MemModel that contains the reifications of all statements of this MemModel.
* @return object MemModel
while($statement=
$stateIt->next())
$pointer =
& $statement->reify($res);
$res->addModel($pointer);
* Returns a StatementIterator for traversing the MemModel.
* @return object StatementIterator
// Import Package Utility
require_once RDFAPI_INCLUDE_DIR .
'util/StatementIterator.php';
* Returns a FindIterator for traversing the MemModel.
* @return object FindIterator
// Import Package Utility
require_once RDFAPI_INCLUDE_DIR .
'util/FindIterator.php';
* Returns a FindIterator for traversing the MemModel.
* @return object FindIterator
function & iterFind($sub=
null,$pred=
null,$obj=
null) {
// Import Package Utility
require_once RDFAPI_INCLUDE_DIR .
'util/IterFind.php';
$if =
new IterFind($this,$sub,$pred,$obj);
* Returns the models namespaces.
* @author Tobias Gau�<tobias.gauss@web.de>
if(count($this->parsedNamespaces)!=
0){
return $this->parsedNamespaces;
* Adds the namespaces to the model. This method is called by
* the parser. !!!! addParsedNamespaces() not overwrites manual
* added namespaces in the model !!!!
* @author Tobias Gau�<tobias.gauss@web.de>
$this->parsedNamespaces =
$this->parsedNamespaces +
$newNs;
* Adds a namespace and prefix to the model.
* @author Tobias Gau�<tobias.gauss@web.de>
$this->parsedNamespaces[$nmsp]=
$prefix;
* removes a single namespace from the model
* @author Tobias Gau�<tobias.gauss@web.de>
if(isset
($this->parsedNamespaces[$nmsp])){
unset
($this->parsedNamespaces[$nmsp]);
* Close the MemModel and free up resources held.
// =============================================================================
// *************************** helper functions ********************************
// =============================================================================
* Checks if $statement is in index
* @param Statement &$statement
function _containsIndex(&$statement,$ind){
$sub=
$statement->getSubject();
$sub=
$statement->getSubject();
$pred=
$statement->getPredicate();
$obj=
$statement->getObject();
$pos=
$sub->getLabel().
$pred->getLabel().
$obj->getLabel();
$sub=
$statement->getSubject();
$pred=
$statement->getPredicate();
$pos=
$sub->getLabel().
$pred->getLabel();
$sub=
$statement->getSubject();
$obj=
$statement->getObject();
$pos=
$sub->getLabel().
$obj->getLabel();
if (!isset
($this->indexArr[$ind][$pos]))
foreach ($this->indexArr[$ind][$pos] as $key =>
$value) {
$t=
$this->triples[$value];
if ($t->equals($statement))
* finds a statement in an index. $pos is the Position in the index
* and $ind the adequate searchindex
* @param Object Subject &$subject
* @param Object Predicate &$predicate
* @param Object Object &$object
function _findInIndex($pos,&$subject,&$predicate,&$object,$ind){
if (!isset
($this->indexArr[$ind][$pos]))
foreach($this->indexArr[$ind][$pos] as $key =>
$value){
$t=
$this->triples[$value];
if ($this->matchStatement($t,$subject,$predicate,$object))
* adds/removes a statement into/from an index.
* mode=0 removes the statement from the index;
* mode=1 adds the statement into the index.
* returns the statements position.
* @param Object Statement &$statement
function _indexOpr(&$statement,$k,$ind,$mode){
// determine position in adequate index
$s=
$statement->getSubject();
$p=
$statement->getPredicate();
$o=
$statement->getObject();
$pos=
$s->getLabel().
$p->getLabel().
$o->getLabel();
$s=
$statement->getSubject();
$p=
$statement->getPredicate();
$pos=
$s->getLabel().
$p->getLabel();
$s=
$statement->getSubject();
$o=
$statement->getObject();
$pos=
$s->getLabel().
$o->getLabel();
$s=
$statement->getSubject();
$p=
$statement->getPredicate();
$o=
$statement->getObject();
if(isset
($this->indexArr[$ind][$pos])){
$this->indexArr[$ind][$pos][] =
$k;
$this->indexArr[$ind][$pos][0] =
$k;
$subject=
$statement->getSubject();
$predicate=
$statement->getPredicate();
$object=
$statement->getObject();
if(!isset
($this->indexArr[$ind][$pos])){
$num=
count($this->indexArr[$ind][$pos]);
foreach($this->indexArr[$ind][$pos] as $key =>
$value){
$t=
$this->triples[$value];
if($this->matchStatement($t,$subject,$predicate,$object)){
unset
($this->indexArr[$ind][$pos]);
unset
($this->indexArr[$ind][$pos][$key]);
* finds next or previous matching statement.
* Returns Position in model or -1 if there is no match.
* @param object Predicate
function _findMatchIndex($pos,&$s,&$p,&$o,$ind,$off){
if (!isset
($this->indexArr[$ind][$pos])) {
foreach($this->indexArr[$ind][$pos] as $key =>
$value){
$t=
$this->triples[$value];
if ($this->matchStatement($t,$s,$p,$o)){
Documentation generated on Fri, 1 Jun 2007 16:49:48 +0200 by phpDocumentor 1.3.2