Skip to content
Snippets Groups Projects
Commit 2315671d authored by alangrafu's avatar alangrafu
Browse files

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.)
parent a511272b
No related branches found
No related tags found
No related merge requests found
......@@ -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;
}
}
?>
......@@ -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';
......
......@@ -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);
......
SELECT ?s ?o WHERE{
?s a ?o .
}LIMIT 10
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment