public function serializeGraphToString($graphUri, $pretty = false, $useAc = true) { $triples = array(); $store = Erfurt_App::getInstance()->getStore(); require_once 'Erfurt/Sparql/SimpleQuery.php'; $sparql = new Erfurt_Sparql_SimpleQuery(); $sparql->setProloguePart('SELECT ?s ?p ?o'); $sparql->addFrom($graphUri); $sparql->setWherePart('WHERE { ?s ?p ?o }'); $sparql->setOrderClause('?s ?p ?o'); $sparql->setLimit(1000); $offset = 0; while (true) { $sparql->setOffset($offset); $result = $store->sparqlQuery($sparql, array('result_format' => 'extended', 'use_owl_imports' => false, 'use_additional_imports' => false, 'use_ac' => $useAc)); $counter = 0; foreach ($result['results']['bindings'] as $stm) { $s = $stm['s']['value']; $p = $stm['p']['value']; $o = $stm['o']; if (!isset($triples["{$s}"])) { $triples["{$s}"] = array(); } if (!isset($triples["{$s}"]["{$p}"])) { $triples["{$s}"]["{$p}"] = array(); } if ($o['type'] === 'typed-literal') { $triples["{$s}"]["{$p}"][] = array('type' => 'literal', 'value' => $o['value'], 'datatype' => $o['datatype']); } else { if ($o['type'] === 'typed-literal') { $oArray = array('type' => 'literal', 'value' => $o['value']); if (isset($o['xml:lang'])) { $oArray['lang'] = $o['xml:lang']; } $triples["{$s}"]["{$p}"][] = $oArray; } else { $triples["{$s}"]["{$p}"][] = array('type' => $o['type'], 'value' => $o['value']); } } $counter++; } if ($counter < 1000) { break; } $offset += 1000; } return json_encode($triples); }
protected function _serializeResource($resource, $useAc = true, $level = 0) { require_once 'Erfurt/Sparql/SimpleQuery.php'; $query = new Erfurt_Sparql_SimpleQuery(); $query->setProloguePart('SELECT ?s ?p ?o'); $query->addFrom($this->_graphUri); $query->setWherePart('WHERE { ?s ?p ?o . FILTER (sameTerm(?s, <' . $resource . '>))}'); $query->setOrderClause('?s ?p ?o'); $query->setLimit(1000); $offset = 0; $bnObjects = array(); while (true) { $query->setOffset($offset); $result = $this->_store->sparqlQuery($query, array('result_format' => 'extended', 'use_owl_imports' => false, 'use_additional_imports' => false, 'use_ac' => $useAc)); foreach ($result['results']['bindings'] as $row) { $s = $row['s']['value']; $p = $row['p']['value']; $o = $row['o']['value']; $sType = $row['s']['type']; $oType = $row['o']['type']; $lang = isset($row['o']['xml:lang']) ? $row['o']['xml:lang'] : null; $dType = isset($row['o']['datatype']) ? $row['o']['datatype'] : null; if ($oType === 'bnode') { $bnObjects[] = substr($o, 2); } $this->_handleStatement($s, $p, $o, $sType, $oType, $lang, $dType); } if (count($result['results']['bindings']) < 1000) { break; } $offset += 1000; } $this->_forceWrite(); // SCBD -> Write Bnodes, too if ($level <= 10) { foreach ($bnObjects as $bn) { $this->_serializeResource($bn, $useAc, $level + 1); } } // We only return SCBD of the TOP resource... if ($level > 0) { return; } // SCBD: Do the same for all Resources, that have the resource as object $query = new Erfurt_Sparql_SimpleQuery(); $query->setProloguePart('SELECT ?s ?p ?o'); $query->addFrom($this->_graphUri); $query->setWherePart('WHERE { ?s ?p ?o . ?s ?p2 ?o2 . FILTER (sameTerm(?o2, <' . $resource . '>)) }'); $query->setOrderClause('?s ?p ?o'); $query->setLimit(1000); $offset = 0; $bnObjects = array(); while (true) { $query->setOffset($offset); $result = $this->_store->sparqlQuery($query, array('result_format' => 'extended', 'use_owl_imports' => false, 'use_additional_imports' => false, 'use_ac' => $useAc)); foreach ($result['results']['bindings'] as $row) { $s = $row['s']['value']; $p = $row['p']['value']; $o = $row['o']['value']; $sType = $row['s']['type']; $oType = $row['o']['type']; $lang = isset($row['o']['xml:lang']) ? $row['o']['xml:lang'] : null; $dType = isset($row['o']['datatype']) ? $row['o']['datatype'] : null; if ($oType === 'bnode') { $bnObjects[] = substr($o, 2); } $this->_handleStatement($s, $p, $o, $sType, $oType, $lang, $dType); } if (count($result['results']['bindings']) < 1000) { break; } $offset += 1000; } $this->_forceWrite(); // SCBD -> Write Bnodes, too if ($level <= 10) { foreach ($bnObjects as $bn) { $this->_serializeResource($bn, $useAc, $level + 1); } } }