From 2315671dad089a468c20e197ce87741daa2be282 Mon Sep 17 00:00:00 2001 From: alangrafu <alvaro@graves.cl> Date: Sat, 17 Sep 2011 01:54:02 -0700 Subject: [PATCH] Adding feature: Each query can be executed against a different sparql endpoint Model definition: The new structure will be models\ | | \foaf:Person.model.html\ | | \localQuery1 \localQuery2 \dbpedia\ | | \queryInDBpedia1 \queryInDBpedia1 Queries under the type subdir will be executed against the default sparql endpoint Quries under a subdir named an endpoint shortcut(*) will be ran against that endpoint (*) You need to define an endpoint in settings.inc.php to query against your endpoint you need to define $conf['endpoint']['mySparqlEndpoint'] = 'http://example.org/sparql'; Sparql endpoints are already defined for dbpedia and logd Later you can create a subdirectory called 'mySparqlEndpoint' under a model. By aware that it is HIGHLY recommended to use only letters and numbers (no periods, colons, etc.) --- classes/Utils.php | 144 ++++++++++++------- common.inc.php | 3 + index.php | 24 ++-- models/local:AsDAsd.model.html/dbpedia/alla2 | 3 + 4 files changed, 103 insertions(+), 71 deletions(-) create mode 100644 models/local:AsDAsd.model.html/dbpedia/alla2 diff --git a/classes/Utils.php b/classes/Utils.php index 10fe0fdc..2c249b32 100644 --- a/classes/Utils.php +++ b/classes/Utils.php @@ -73,23 +73,29 @@ class Utils{ private static function sparqlResult2Obj($data){ $aux = $data['results']['bindings']; $obj = array(); - if(sizeof($aux)>0){ - foreach($aux as $w){ - $row = array(); - foreach($w as $k => $v){ - $row['value'][$k] = $v['value']; - if($v['type'] == 'uri'){ - $row['curie'][$k] = Utils::uri2curie($v['value']); - $row['uri'][$k] = 1; - }elseif($v['type'] == 'bnode'){ - $row['curie'][$k] = 'blankNode'; + if(!isset($aux)){ + foreach($data as $k => $v){ + $obj[$k] = Utils::sparqlResult2Obj($v); + } + }else{ + if(sizeof($aux)>0){ + foreach($aux as $w){ + $row = array(); + foreach($w as $k => $v){ + $row['value'][$k] = $v['value']; + if($v['type'] == 'uri'){ + $row['curie'][$k] = Utils::uri2curie($v['value']); + $row['uri'][$k] = 1; + }elseif($v['type'] == 'bnode'){ + $row['curie'][$k] = 'blankNode'; + } + } + if(sizeof($row) >0){ + array_push($obj, $row); + } + if(sizeof($aux) == 1){ + $obj = $row; } - } - if(sizeof($row) >0){ - array_push($obj, $row); - } - if(sizeof($aux) == 1){ - return $row; } } } @@ -112,14 +118,8 @@ class Utils{ )); $r = array(); - if(!isset($data['results'])){ - foreach($data as $k => $v){ - $r[$k] = Utils::sparqlResult2Obj($v); - } - }else{ $r = Utils::sparqlResult2Obj($data); - } - $vars = compact('base', 'r'); + $vars = compact('base', 'r'); if(is_file($view)){ Haanga::Load($view, $vars); }else{ @@ -166,32 +166,38 @@ class Utils{ private static function serializeByQueryType($data, $extension){ global $conf; - if(preg_match("/describe/i", $data['query'])){ - require('lib/arc2/ARC2.php'); - $parser = ARC2::getRDFParser(); - $parser->parse($conf['basedir'], $data['results']); - $triples = $parser->getTriples(); - $ser; - switch ($extension){ - case 'ttl': - $ser = ARC2::getTurtleSerializer(); - break; - case 'nt': - $ser = ARC2::getNTriplesSerializer(); - break; - case 'rdf': - $ser = ARC2::getRDFXMLSerializer(); - break; + if(!isset($data['results'])){ + foreach($data as $k => $v){ + $results[$k] = Utils::serializeByQueryType($v, $extension); + } + }else{ + if(preg_match("/describe/i", $data['query'])){ + require('lib/arc2/ARC2.php'); + $parser = ARC2::getRDFParser(); + $parser->parse($conf['basedir'], $data['results']); + $triples = $parser->getTriples(); + $ser; + switch ($extension){ + case 'ttl': + $ser = ARC2::getTurtleSerializer(); + break; + case 'nt': + $ser = ARC2::getNTriplesSerializer(); + break; + case 'rdf': + $ser = ARC2::getRDFXMLSerializer(); + break; + } + $doc = $ser->getSerializedTriples($triples); + echo $doc; + exit(0); } - $doc = $ser->getSerializedTriples($triples); - echo $doc; - exit(0); - } - elseif(preg_match("/select/i", $data['query'])){ - $results = $data['results']; - if(sizeof($results['results']['bindings']) == 0){ - //Avoid for now - //Utils::send404($uri); + elseif(preg_match("/select/i", $data['query'])){ + $results = $data['results']; + if(sizeof($results['results']['bindings']) == 0){ + //Avoid for now + //Utils::send404($uri); + } } } return $results; @@ -202,13 +208,8 @@ class Utils{ $extension = Utils::getExtension($contentType); header('Content-Type: '.$contentType); - if(!isset($data['results'])){ - foreach($data as $k => $v){ - $results[$k] = Utils::serializeByQueryType($v, $extension); - } - }else{ - $results = Utils::serializeByQueryType($data, $extension); - } + $results = Utils::serializeByQueryType($data, $extension); + $baseData['uri'] = $uri; $baseData['params'] = $data['params']; Utils::showView($baseData, $results, $viewFile); @@ -228,5 +229,38 @@ class Utils{ } } + public static function queryDir($modelDir, $e){ + global $conf; + global $uri; + $originalDir = getcwd(); + chdir($modelDir); + $handle = opendir('.'); + $data = array(); + while (false !== ($modelFile = readdir($handle))) { + if($modelFile != "." && $modelFile != ".."){ + if(is_dir($modelFile)){ + $data[$modelFile] = Utils::queryDir($modelFile, $e); + }else{ + $query = file_get_contents($modelFile); + $query = preg_replace("|".$conf['resource']['url_delimiter']."|", "<".$uri.">", $query); + if(isset($conf['endpoint'][$modelDir])){ + //Use or create new endpoint + + if(!isset($e[$modelDir])){ + $e[$modelDir] = new Endpoint($conf['endpoint'][$modelDir], $conf['endpoint']['config']); + } + $data[$modelFile]['results'] = $e[$modelDir]->query($query, Utils::getResultsType($query)); + }else{ + //User default endpoint + $data[$modelFile]['results'] = $e['base']->query($query, Utils::getResultsType($query)); + } + $data[$modelFile]['query'] = $query; + } + } + } + chdir($originalDir); + return $data; + } + } ?> diff --git a/common.inc.php b/common.inc.php index 70ccb877..4163520b 100644 --- a/common.inc.php +++ b/common.inc.php @@ -5,6 +5,9 @@ $conf['endpoint']['describe']['output'] = 'rdf'; $conf['endpoint']['config']['output'] = $conf['endpoint']['select']['output']; $conf['endpoint']['config']['named_graph'] = ''; $conf['endpoint']['config']['show_inline'] = 0; +//ALternative endpoints +$conf['endpoint']['dbpedia'] = 'http://dbpedia.org/sparql'; +$conf['endpoint']['logd'] = 'http://logd.tw.rpi.edu/sparql'; $conf['metadata']['db']['location'] = 'meta/db.sqlite'; diff --git a/index.php b/index.php index c3ab0908..10b82b9e 100755 --- a/index.php +++ b/index.php @@ -13,8 +13,8 @@ include_once('classes/Queries.php'); include_once('classes/Endpoint.php'); include_once('classes/MetaDb.php'); - -$endpoint = new Endpoint($conf['endpoint']['host'], $conf['endpoint']['config']); +$endpoints = array(); +$endpoints['base'] = new Endpoint($conf['endpoint']['host'], $conf['endpoint']['config']); $metaDb = new MetaDb($conf['metadata']['db']['location']); $acceptContentType = Utils::getBestContentType($_SERVER['HTTP_ACCEPT']); @@ -32,7 +32,7 @@ if($uri == $conf['basedir']){ include_once($conf['special']['class']); $context = array(); $context['contentType'] = $acceptContentType; - $context['endpoint'] = $endpoint; + $context['endpoint'] = $endpoints['base']; $sp = new SpecialFunction(); $sp->execute($uri, $context); exit(0); @@ -41,7 +41,7 @@ if($uri == $conf['basedir']){ $pair = Queries::getMetadata($uri, $acceptContentType, $metaDb); if($pair == NULL){ // Original URI is not in metadata - if(Queries::uriExist($uri, $endpoint)){ + if(Queries::uriExist($uri, $endpoints['base'])){ $page = Queries::createPage($uri, $acceptContentType, $metaDb); if($page == NULL){ Utils::send500(NULL); @@ -67,7 +67,7 @@ $extension = Utils::getExtension($format); $acceptContentType = $format; //Check if files for model and view exist -$curieType = Utils::uri2curie(Queries::getClass($uri, $endpoint)); +$curieType = Utils::uri2curie(Queries::getClass($uri, $endpoints['base'])); $viewFile = $conf['view']['directory'].$curieType.$conf['view']['extension'].".".$extension; $modelFile = $conf['model']['directory'].$curieType.$conf['model']['extension'].".".$extension; if(!file_exists($modelFile) || !file_exists($viewFile) || $curieType == null){ @@ -75,23 +75,15 @@ if(!file_exists($modelFile) || !file_exists($viewFile) || $curieType == null){ $viewFile = $conf['view']['directory'].$conf['view']['default'].$conf['view']['extension'].".".$extension; } +$data = array(); if(!is_dir($modelFile)){ $query = file_get_contents($modelFile); $query = preg_replace("|".$conf['resource']['url_delimiter']."|", "<".$uri.">", $query); - $data['results'] = $endpoint->query($query, Utils::getResultsType($query)); + $data['results'] = $endpoints['base']->query($query, Utils::getResultsType($query)); $data['query'] = $query; }else{ $modelDir = $modelFile; - $handle = opendir($modelDir); - while (false !== ($modelFile = readdir($handle))) { - if($modelFile != "." && $modelFile != ".."){ - $query = file_get_contents($modelDir."/".$modelFile); - $query = preg_replace("|".$conf['resource']['url_delimiter']."|", "<".$uri.">", $query); - $data[$modelFile]['results'] = $endpoint->query($query, Utils::getResultsType($query)); - $data[$modelFile]['query'] = $query; - } - } - closedir($handle); + $data = Utils::queryDir($modelDir, $endpoints); } Utils::processDocument($uri, $acceptContentType, $data, $viewFile); diff --git a/models/local:AsDAsd.model.html/dbpedia/alla2 b/models/local:AsDAsd.model.html/dbpedia/alla2 new file mode 100644 index 00000000..037ad686 --- /dev/null +++ b/models/local:AsDAsd.model.html/dbpedia/alla2 @@ -0,0 +1,3 @@ +SELECT ?s ?o WHERE{ +?s a ?o . +}LIMIT 10 -- GitLab