[12] | 1 | <?php
|
---|
| 2 | require_once RDFAPI_INCLUDE_DIR . 'dataset/Dataset.php';
|
---|
| 3 | require_once RDFAPI_INCLUDE_DIR . 'dataset/NamedGraphMem.php';
|
---|
| 4 | require_once RDFAPI_INCLUDE_DIR . 'model/MemModel.php';
|
---|
| 5 | // ----------------------------------------------------------------------------------
|
---|
| 6 | // Class: DatasetMem
|
---|
| 7 | // ----------------------------------------------------------------------------------
|
---|
| 8 |
|
---|
| 9 | /**
|
---|
| 10 | * In-memory implementation of a RDF dataset.
|
---|
| 11 | * A RDF dataset set is a collection of named RDF graphs.
|
---|
| 12 | *
|
---|
| 13 | * @version $Id$
|
---|
| 14 | * @author Daniel Westphal (http://www.d-westphal.de)
|
---|
| 15 | * @author Chris Bizer <chris@bizer.de>
|
---|
| 16 | *
|
---|
| 17 | * @package dataset
|
---|
| 18 | * @access public
|
---|
| 19 | **/
|
---|
| 20 |
|
---|
| 21 | class DatasetMem extends Dataset
|
---|
| 22 | {
|
---|
| 23 |
|
---|
| 24 | /**
|
---|
| 25 | * Reference to a Memmodel that holds the default graph.
|
---|
| 26 | *
|
---|
| 27 | * @var resource Memmodel
|
---|
| 28 | * @access private
|
---|
| 29 | */
|
---|
| 30 | var $defaultGraph;
|
---|
| 31 |
|
---|
| 32 |
|
---|
| 33 | /**
|
---|
| 34 | * Name of the DatasetMem.
|
---|
| 35 | *
|
---|
| 36 | * @var string
|
---|
| 37 | * @access private
|
---|
| 38 | */
|
---|
| 39 | var $setName;
|
---|
| 40 |
|
---|
| 41 | /**
|
---|
| 42 | * List of all NamedGraphs.
|
---|
| 43 | *
|
---|
| 44 | * @var array
|
---|
| 45 | * @access private
|
---|
| 46 | */
|
---|
| 47 | var $graphs=array();
|
---|
| 48 |
|
---|
| 49 | /**
|
---|
| 50 | * Constructor.
|
---|
| 51 | * You can supply a Dataset name.
|
---|
| 52 | *
|
---|
| 53 | * @param string
|
---|
| 54 | * @access public
|
---|
| 55 | */
|
---|
| 56 | function DatasetMem($datasetName = null)
|
---|
| 57 | {
|
---|
| 58 | $this->setDatasetName($datasetName);
|
---|
| 59 | $this->defaultGraph=new MemModel();
|
---|
| 60 | }
|
---|
| 61 |
|
---|
| 62 | // === Graph level methods ========================
|
---|
| 63 |
|
---|
| 64 | /**
|
---|
| 65 | * Sets the Datasets name.
|
---|
| 66 | *
|
---|
| 67 | * @param string
|
---|
| 68 | * @access public
|
---|
| 69 | */
|
---|
| 70 | function setDatasetName($datasetName)
|
---|
| 71 | {
|
---|
| 72 | $this->setName=$datasetName;
|
---|
| 73 | }
|
---|
| 74 |
|
---|
| 75 | /**
|
---|
| 76 | * Returns the Datasets name.
|
---|
| 77 | *
|
---|
| 78 | * @return string
|
---|
| 79 | * @access public
|
---|
| 80 | */
|
---|
| 81 | function getDatasetName()
|
---|
| 82 | {
|
---|
| 83 | return $this->setName;
|
---|
| 84 | }
|
---|
| 85 |
|
---|
| 86 | /**
|
---|
| 87 | * Adds a NamedGraph to the set. Will replace a NamedGraph with the same name that is already in the set.
|
---|
| 88 | *
|
---|
| 89 | * @param NamedGraphMem
|
---|
| 90 | */
|
---|
| 91 | function addNamedGraph(&$graph)
|
---|
| 92 | {
|
---|
| 93 | $graphNameURI=$graph->getGraphName();
|
---|
| 94 | $this->graphs[$graphNameURI]=&$graph;
|
---|
| 95 | }
|
---|
| 96 |
|
---|
| 97 | /**
|
---|
| 98 | * Overwrites the existting default graph.
|
---|
| 99 | *
|
---|
| 100 | * @param MemModel
|
---|
| 101 | */
|
---|
| 102 | function setDefaultGraph(&$graph)
|
---|
| 103 | {
|
---|
| 104 | $this->defaultGraph=&$graph;
|
---|
| 105 | }
|
---|
| 106 |
|
---|
| 107 | /**
|
---|
| 108 | * Returns a reference to the defaultGraph
|
---|
| 109 | * @return Model
|
---|
| 110 | */
|
---|
| 111 | function &getDefaultGraph()
|
---|
| 112 | {
|
---|
| 113 | return $this->defaultGraph;
|
---|
| 114 | }
|
---|
| 115 |
|
---|
| 116 | /**
|
---|
| 117 | * Returns true, if an defaultGraph exists. False otherwise .
|
---|
| 118 | *
|
---|
| 119 | * @return boolean
|
---|
| 120 | */
|
---|
| 121 | function hasDefaultGraph()
|
---|
| 122 | {
|
---|
| 123 | return $this->defaultGraph != null;
|
---|
| 124 | }
|
---|
| 125 |
|
---|
| 126 | /**
|
---|
| 127 | * Removes a NamedGraph from the set. Nothing happens
|
---|
| 128 | * if no graph with that name is contained in the set.
|
---|
| 129 | *
|
---|
| 130 | * @param string
|
---|
| 131 | */
|
---|
| 132 | function removeNamedGraph($graphName)
|
---|
| 133 | {
|
---|
| 134 | unset($this->graphs[$graphName]);
|
---|
| 135 | }
|
---|
| 136 |
|
---|
| 137 | /**
|
---|
| 138 | * Tells wether the Dataset contains a NamedGraph.
|
---|
| 139 | *
|
---|
| 140 | * @param string
|
---|
| 141 | * @return boolean
|
---|
| 142 | */
|
---|
| 143 | function containsNamedGraph($graphName)
|
---|
| 144 | {
|
---|
| 145 | return isset($this->graphs[$graphName]) === true;
|
---|
| 146 | }
|
---|
| 147 |
|
---|
| 148 | /**
|
---|
| 149 | * Returns the NamedGraph with a specific name from the Dataset.
|
---|
| 150 | * Changes to the graph will be reflected in the set.
|
---|
| 151 | *
|
---|
| 152 | * @param string
|
---|
| 153 | * @return NamedGraphMem or NULL
|
---|
| 154 | */
|
---|
| 155 | function &getNamedGraph($graphName)
|
---|
| 156 | {
|
---|
| 157 | if (!isset($this->graphs[$graphName])) return NULL;
|
---|
| 158 | return $this->graphs[$graphName];
|
---|
| 159 | }
|
---|
| 160 |
|
---|
| 161 | /**
|
---|
| 162 | * Returns the names of the namedGraphs in this set as strings in an array.
|
---|
| 163 | *
|
---|
| 164 | * @return Array
|
---|
| 165 | */
|
---|
| 166 | function listGraphNames()
|
---|
| 167 | {
|
---|
| 168 | return array_keys($this->graphs);
|
---|
| 169 | }
|
---|
| 170 |
|
---|
| 171 | /**
|
---|
| 172 | * Creates a new NamedGraph and adds it to the set. An existing
|
---|
| 173 | * graph with the same name will be replaced.The name of the NamedGraph to be created ; must be an URI
|
---|
| 174 | *
|
---|
| 175 | * @param string
|
---|
| 176 | * @param string
|
---|
| 177 | * @return NamedGraphMem
|
---|
| 178 | */
|
---|
| 179 | function &createGraph($graphName,$baseURI = null)
|
---|
| 180 | {
|
---|
| 181 | $this->graphs[$graphName]=new NamedGraphMem($graphName,$baseURI);
|
---|
| 182 | return $this->getNamedGraph($graphName);
|
---|
| 183 | }
|
---|
| 184 |
|
---|
| 185 | /**
|
---|
| 186 | * Deletes all NamedGraphs from the set.
|
---|
| 187 | */
|
---|
| 188 | function clear()
|
---|
| 189 | {
|
---|
| 190 | $this->graphs = array();
|
---|
| 191 | }
|
---|
| 192 |
|
---|
| 193 | /**
|
---|
| 194 | * Returns the number of NamedGraphs in the set. Empty graphs
|
---|
| 195 | * are counted.
|
---|
| 196 | *
|
---|
| 197 | * @return int
|
---|
| 198 | */
|
---|
| 199 | function countGraphs()
|
---|
| 200 | {
|
---|
| 201 | return count($this->graphs);
|
---|
| 202 | }
|
---|
| 203 |
|
---|
| 204 | /**
|
---|
| 205 | * Returns the NamedGraph with a specific offset in the dataset.
|
---|
| 206 | * Changes to the graph will be reflected in the set.
|
---|
| 207 | *
|
---|
| 208 | * @param int
|
---|
| 209 | * @return NamedGraphMem or null
|
---|
| 210 | * @access private
|
---|
| 211 | */
|
---|
| 212 | function &getGraphWithOffset($offset)
|
---|
| 213 | {
|
---|
| 214 | $i=0;
|
---|
| 215 | foreach ($this->graphs as $graph)
|
---|
| 216 | {
|
---|
| 217 | if (($i++)==$offset)
|
---|
| 218 | return $graph;
|
---|
| 219 | }
|
---|
| 220 | $n = null;
|
---|
| 221 | return $n;
|
---|
| 222 | }
|
---|
| 223 |
|
---|
| 224 | /**
|
---|
| 225 | * Returns an iterator over all {@link NamedGraph}s in the set.
|
---|
| 226 | *
|
---|
| 227 | * @return IteratorAllGraphsMem
|
---|
| 228 | */
|
---|
| 229 | function &listNamedGraphs()
|
---|
| 230 | {
|
---|
| 231 | require_once RDFAPI_INCLUDE_DIR . 'dataset/IteratorAllGraphsMem.php';
|
---|
| 232 | $m = new IteratorAllGraphsMem($this);
|
---|
| 233 | return $m;
|
---|
| 234 | }
|
---|
| 235 |
|
---|
| 236 | /**
|
---|
| 237 | * Tells wether the set contains any NamedGraphs.
|
---|
| 238 | *
|
---|
| 239 | * @return boolean
|
---|
| 240 | */
|
---|
| 241 | function isEmpty()
|
---|
| 242 | {
|
---|
| 243 | return $this->countGraphs() == 0;
|
---|
| 244 | }
|
---|
| 245 |
|
---|
| 246 | /**
|
---|
| 247 | * Adds all named graphs of the other dataset to this dataset.
|
---|
| 248 | *
|
---|
| 249 | * @param Dataset
|
---|
| 250 | */
|
---|
| 251 | function addAll($otherDataset)
|
---|
| 252 | {
|
---|
| 253 | for($iterator = $otherDataset->listNamedGraphs(); $iterator->valid(); $iterator->next())
|
---|
| 254 | {
|
---|
| 255 | $current=$iterator->current();
|
---|
| 256 | $this->graphs[$current->getGraphName()]=$current;
|
---|
| 257 | }
|
---|
| 258 |
|
---|
| 259 | if ($otherDataset->hasDefaultGraph())
|
---|
| 260 | {
|
---|
| 261 | $this->defaultGraph = $this->defaultGraph->unite($otherDataset->getDefaultGraph());
|
---|
| 262 | }
|
---|
| 263 | }
|
---|
| 264 |
|
---|
| 265 | // === Quad level methods ========================
|
---|
| 266 |
|
---|
| 267 | /**
|
---|
| 268 | * Adds a quad to the Dataset. The argument must not contain any
|
---|
| 269 | * wildcards. If the quad is already present, nothing happens. A new
|
---|
| 270 | * named graph will automatically be created if necessary.
|
---|
| 271 | *
|
---|
| 272 | * @param Quad
|
---|
| 273 | */
|
---|
| 274 | function addQuad(&$quad)
|
---|
| 275 | {
|
---|
| 276 | $graphName=$quad->getGraphName();
|
---|
| 277 | if ($this->containsNamedGraph($graphName->getLabel())===false)
|
---|
| 278 | $this->createGraph($graphName->getLabel());
|
---|
| 279 |
|
---|
| 280 | $this->graphs[$graphName->getLabel()]->add($quad->getStatement());
|
---|
| 281 | }
|
---|
| 282 |
|
---|
| 283 |
|
---|
| 284 | /**
|
---|
| 285 | * Tells wether the Dataset contains a quad or
|
---|
| 286 | * quads matching a pattern.
|
---|
| 287 | *
|
---|
| 288 | * @param Resource $graphName
|
---|
| 289 | * @param Resource $subject
|
---|
| 290 | * @param Resource $predicate
|
---|
| 291 | * @param Resource $object
|
---|
| 292 | * @return boolean
|
---|
| 293 | */
|
---|
| 294 | function containsQuad($graphName,$subject,$predicate,$object)
|
---|
| 295 | {
|
---|
| 296 | if($graphName!=null)
|
---|
| 297 | {
|
---|
| 298 | if ($this->containsNamedGraph($graphName->getLabel())!==true)
|
---|
| 299 | return false;
|
---|
| 300 |
|
---|
| 301 | return ($this->graphs[$graphName->getLabel()]->findFirstMatchingStatement($subject,$predicate,$object)!=null);
|
---|
| 302 | }
|
---|
| 303 |
|
---|
| 304 | foreach ($this->graphs as $graph)
|
---|
| 305 | {
|
---|
| 306 | if ($graph->findFirstMatchingStatement($subject,$predicate,$object)!=null)
|
---|
| 307 | return true;
|
---|
| 308 | };
|
---|
| 309 |
|
---|
| 310 | return false;
|
---|
| 311 | }
|
---|
| 312 |
|
---|
| 313 | /**
|
---|
| 314 | * Deletes a Quad from the RDF dataset.
|
---|
| 315 | *
|
---|
| 316 | * @param Quad
|
---|
| 317 | */
|
---|
| 318 | function removeQuad($quad)
|
---|
| 319 | {
|
---|
| 320 | $graphName=$quad->getGraphName();
|
---|
| 321 |
|
---|
| 322 | if($graphName!=null)
|
---|
| 323 | {
|
---|
| 324 | if ($this->containsNamedGraph($graphName->getLabel())!==true)
|
---|
| 325 | return;
|
---|
| 326 |
|
---|
| 327 | return ($this->graphs[$graphName->getLabel()]->remove($quad->getStatement())!=null);
|
---|
| 328 |
|
---|
| 329 | }
|
---|
| 330 | foreach ($this->graphs as $graph)
|
---|
| 331 | {
|
---|
| 332 | $graph->remove($quad->getStatement());
|
---|
| 333 | };
|
---|
| 334 | }
|
---|
| 335 |
|
---|
| 336 | /**
|
---|
| 337 | * Counts the Quads in the RDF dataset. Identical Triples in
|
---|
| 338 | * different NamedGraphs are counted individually.
|
---|
| 339 | *
|
---|
| 340 | * @return int
|
---|
| 341 | */
|
---|
| 342 | function countQuads()
|
---|
| 343 | {
|
---|
| 344 | $count=0;
|
---|
| 345 | foreach ($this->graphs as $graph)
|
---|
| 346 | {
|
---|
| 347 | $count+=$graph->size();
|
---|
| 348 | }
|
---|
| 349 | return $count;
|
---|
| 350 | }
|
---|
| 351 |
|
---|
| 352 | /**
|
---|
| 353 | * Finds Statements that match a quad pattern. The argument may contain
|
---|
| 354 | * wildcards.
|
---|
| 355 | *
|
---|
| 356 | * @param Resource or Null
|
---|
| 357 | * @param Resourceor Null
|
---|
| 358 | * @param Resource or Null
|
---|
| 359 | * @param Resource or Null
|
---|
| 360 | * @return Iterator
|
---|
| 361 | */
|
---|
| 362 | function &findInNamedGraphs($graph,$subject,$predicate,$object,$returnAsTriples = false)
|
---|
| 363 | {
|
---|
| 364 |
|
---|
| 365 | if ($graph!=null)
|
---|
| 366 | {
|
---|
| 367 | $findGraph=&$this->getNamedGraph($graph->getLabel());
|
---|
| 368 | if($findGraph==null)
|
---|
| 369 | $findGraph=new MemModel();
|
---|
| 370 |
|
---|
| 371 | return $findGraph->iterFind($subject,$predicate,$object);
|
---|
| 372 | }
|
---|
| 373 |
|
---|
| 374 |
|
---|
| 375 | require_once RDFAPI_INCLUDE_DIR . 'dataset/IteratorFindQuadsMem.php';
|
---|
| 376 | $m = new IteratorFindQuadsMem($subject,$predicate,$object,$this->listNamedGraphs(),$returnAsTriples);
|
---|
| 377 | return $m;
|
---|
| 378 | }
|
---|
| 379 |
|
---|
| 380 | /**
|
---|
| 381 | * Finds Statements that match a pattern in the default Graph. The argument may contain
|
---|
| 382 | * wildcards.
|
---|
| 383 | *
|
---|
| 384 | * @param Resource or Null
|
---|
| 385 | * @param Resource or Null
|
---|
| 386 | * @param Resource or Null
|
---|
| 387 | * @return Iterator
|
---|
| 388 | */
|
---|
| 389 | function &findInDefaultGraph($subject,$predicate,$object)
|
---|
| 390 | {
|
---|
| 391 | return $this->defaultGraph->iterFind($subject,$predicate,$object);
|
---|
| 392 | }
|
---|
| 393 | }
|
---|
| 394 | ?> |
---|