예제 #1
0
 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);
 }
예제 #2
0
 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);
         }
     }
 }