author | ymh <ymh.work@gmail.com> |
Tue, 15 Nov 2016 18:25:35 +0100 | |
changeset 425 | f99435a7006e |
parent 405 | f239c8c5bb94 |
child 531 | 48f5380c26d0 |
permissions | -rw-r--r-- |
386
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
1 |
<?php |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
2 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
3 |
namespace CorpusParole\Http\Controllers\Sparql; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
4 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
5 |
use Log; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
6 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
7 |
use Illuminate\Http\Request; |
387 | 8 |
use Illuminate\Pagination\LengthAwarePaginator; |
9 |
use Illuminate\Pagination\Paginator; |
|
10 |
||
386
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
11 |
use GuzzleHttp\Client; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
12 |
use EasyRdf\Sparql\Result as SparqlResult; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
13 |
use EasyRdf\Graph; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
14 |
use EasyRdf\RdfNamespace; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
15 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
16 |
use CorpusParole\Http\Controllers\Controller; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
17 |
use CorpusParole\Libraries\Utils; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
18 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
19 |
use CorpusParole\Libraries\Sparql\SparqlClient; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
20 |
use CorpusParole\Libraries\Sparql\SparqlQueryAnalyser; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
21 |
use RdfHelper; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
22 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
23 |
class SparqlClientController extends Controller |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
24 |
{ |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
25 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
26 |
const HEADERS_FORWARDED = [ "host", "user-agent", "accept", "accept-language", "accept-encoding", "connection" ]; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
27 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
28 |
const SELECT_RESULT_FORMAT = [ |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
29 |
"SPARQL/CSV" => "text/csv", |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
30 |
"SPARQL/JSON" => "application/sparql-results+json", |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
31 |
"SPARQL/XML" => "application/sparql-results+xml", |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
32 |
"SPARQL/TSV" => "text/tab-separated-values", |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
33 |
"BINARY" => "application/x-binary-rdf-results-table" |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
34 |
]; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
35 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
36 |
const GRAPH_RESULT_FORMAT = [ |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
37 |
"N-Triples" => "application/n-triples", |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
38 |
"RDF/XML" => "application/rdf+xml", |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
39 |
"Turtle" => "text/turtle", |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
40 |
"N3" => "text/n3", |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
41 |
"RDF/JSON" => "application/rdf+json", |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
42 |
"TriG" => "application/trig", |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
43 |
"N-Quads" => "application/n-quads", |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
44 |
"BinaryRDF" => "application/x-binary-rdf", |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
45 |
"TriX" => "application/trix", |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
46 |
"JSON-LD" => "application/ld+json" |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
47 |
]; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
48 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
49 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
50 |
private $sparqlClient; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
51 |
private $httpClient; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
52 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
53 |
public function __construct(SparqlClient $sparqlClient, Client $httpClient) { |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
54 |
$this->sparqlClient = $sparqlClient; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
55 |
$this->httpClient = $httpClient; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
56 |
} |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
57 |
|
387 | 58 |
public function getSparqlClient($timeout = null) { |
59 |
if(is_null($timeout)) { |
|
60 |
$timeout = config('corpusparole.sparql_client_timeout'); |
|
61 |
} |
|
405
f239c8c5bb94
migrate to rdf4j (2.1.1) from sesame (4.1.1)
ymh <ymh.work@gmail.com>
parents:
389
diff
changeset
|
62 |
$queryUrl = config('corpusparole.rdf4j_query_url'); |
387 | 63 |
if($timeout > 0) { |
64 |
$queryUrl = $queryUrl . |
|
65 |
((strlen(parse_url($queryUrl, PHP_URL_QUERY)) > 0)?"&":"?"). |
|
66 |
"timeout=$timeout"; |
|
67 |
} |
|
405
f239c8c5bb94
migrate to rdf4j (2.1.1) from sesame (4.1.1)
ymh <ymh.work@gmail.com>
parents:
389
diff
changeset
|
68 |
return new \EasyRdf\Sparql\Client($queryUrl, config('corpusparole.rdf4j_update_url')); |
387 | 69 |
} |
70 |
||
386
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
71 |
// display form |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
72 |
public function index() { |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
73 |
return view('sparql/sparqlClientForm'); |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
74 |
} |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
75 |
|
387 | 76 |
private function readDocs($docs, $fields) { |
386
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
77 |
$results = []; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
78 |
foreach($docs as $row) { |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
79 |
$results[] = array_reduce($fields, function($res, $field) use ($row) { |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
80 |
if(isset($row->$field)) { |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
81 |
$res[$field] = RdfHelper::serialiseValue($row->$field); |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
82 |
} else { |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
83 |
$res[$field] = "<span class=\"corpus-rdf-blank-value\"> </span>"; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
84 |
} |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
85 |
return $res; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
86 |
}, []); |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
87 |
} |
387 | 88 |
return $results; |
89 |
} |
|
90 |
||
91 |
private function abort($code, $message, $exception) { |
|
92 |
throw new \Symfony\Component\HttpKernel\Exception\HttpException($code, $message, $exception, []); |
|
93 |
} |
|
94 |
||
95 |
private function processQueryException($exception) { |
|
96 |
$message = $exception->getMessage(); |
|
97 |
if($exception instanceof \EasyRdf\Http\Exception) { |
|
98 |
if(preg_match("/SPARQL\squery/", $message)) { |
|
99 |
$this->abort(400, "La requête SPARQL n'est pas reconnue", $exception); |
|
100 |
} else { |
|
101 |
$this->abort(500, "Problème HTTP lors de la requête SPARQL", $exception); |
|
102 |
} |
|
103 |
} elseif($exception instanceof \EasyRdf\Exception) { |
|
104 |
if(preg_match("/timed\sout/i", $message)) { |
|
105 |
$this->abort(408, "Time-out causé par la requête SPARQL", $exception); |
|
106 |
} else { |
|
107 |
$this->abort(500, "Problème dans la requête SPARQL", $exception); |
|
108 |
} |
|
109 |
} else { |
|
110 |
$this->abort(500, "Erreur serveur lors de la requête", $exception); |
|
111 |
} |
|
112 |
} |
|
113 |
||
114 |
private function querySelect(Request $request, $query, $analyser) { |
|
115 |
||
116 |
$limit = intval($request->input('limit', config('corpusparole.sparql_client_default_limit'))); |
|
117 |
||
118 |
if($limit === 0 || !is_null($analyser->getLimit()) || !is_null($analyser->getOffset()) ) { |
|
119 |
try { |
|
120 |
$docs = $this->getSparqlClient()->query($query); |
|
121 |
} catch(\Exception $exception) { |
|
122 |
$this->processQueryException($exception); |
|
123 |
} |
|
124 |
||
125 |
$fields = $docs->getFields(); |
|
126 |
$results = $this->readDocs($docs, $fields); |
|
127 |
$count = count($results); |
|
128 |
||
129 |
} else { |
|
130 |
||
131 |
$page = Paginator::resolveCurrentPage(config('corpusparole.pagination_page_param')); |
|
132 |
assert(is_null($page) || is_numeric($page)); |
|
133 |
||
134 |
$offset = max(0,($page - 1) * $limit); |
|
135 |
||
136 |
try { |
|
137 |
$countResult = $this->getSparqlClient()->query($analyser->getCountQuery()); |
|
138 |
$docs = $this->getSparqlClient()->query($query . " LIMIT $limit OFFSET $offset"); |
|
139 |
} catch(\Exception $exception) { |
|
140 |
$this->processQueryException($exception); |
|
141 |
} |
|
142 |
||
143 |
||
144 |
$countField = $countResult->getFields()[0]; |
|
389
2204faa0b41a
Correct problem in spaqrl client in php 56 + add line numbering in result table
ymh <ymh.work@gmail.com>
parents:
387
diff
changeset
|
145 |
$countResult->rewind(); |
387 | 146 |
$count = $countResult->current()->$countField->getValue(); |
147 |
||
148 |
$fields = $docs->getFields(); |
|
149 |
||
150 |
$results = new LengthAwarePaginator($this->readDocs($docs, $fields), $count, $limit, $page, [ |
|
151 |
'path' => Paginator::resolveCurrentPath(), |
|
152 |
'pageName' => config('corpusparole.pagination_page_param'), |
|
153 |
]); |
|
154 |
} |
|
155 |
||
386
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
156 |
$namespaces = array_reduce(array_keys(RdfHelper::getPrefixes()), function($res, $p) { |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
157 |
$res[$p] = RdfNamespace::namespaces()[$p]; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
158 |
return $res; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
159 |
}, []); |
387 | 160 |
|
386
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
161 |
$data = [ |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
162 |
'query' => $query, |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
163 |
'count' => $count, |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
164 |
'fields' => $fields, |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
165 |
'fieldPrefix' => "?", |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
166 |
'results' => $results, |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
167 |
'namespaces' => $namespaces, |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
168 |
'downloadFormats' => self::SELECT_RESULT_FORMAT |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
169 |
]; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
170 |
$view = 'sparql/sparqlClientResultList'; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
171 |
return [$view, $data]; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
172 |
} |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
173 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
174 |
private function queryGraph(Request $request, $query, $analyser) { |
387 | 175 |
try { |
176 |
$docs = $this->getSparqlClient()->query($query); |
|
177 |
} catch(\Exception $exception) { |
|
178 |
$this->processQueryException($exception); |
|
179 |
} |
|
386
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
180 |
|
387 | 181 |
|
386
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
182 |
$fields = ["subject", "predicate", "object"]; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
183 |
$results = []; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
184 |
foreach ($docs->resources() as $resource ) { |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
185 |
foreach ($resource->propertyUris() as $property) { |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
186 |
$propertyResource = $docs->resource($property); |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
187 |
foreach ($resource->all($propertyResource) as $value) { |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
188 |
$results[] = [ |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
189 |
'subject' => RdfHelper::serialiseValue($resource), |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
190 |
'predicate'=> RdfHelper::serialiseValue($propertyResource), |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
191 |
'object'=> RdfHelper::serialiseValue($value) |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
192 |
]; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
193 |
} |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
194 |
} |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
195 |
} |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
196 |
$namespaces = array_reduce(array_keys(RdfHelper::getPrefixes()), function($res, $p) { |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
197 |
$res[$p] = RdfNamespace::namespaces()[$p]; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
198 |
return $res; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
199 |
}, []); |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
200 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
201 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
202 |
$data = [ |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
203 |
'query' => $query, |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
204 |
'count' => count($results), |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
205 |
'fields' => $fields, |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
206 |
'fieldPrefix' => "", |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
207 |
'results' => $results, |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
208 |
'namespaces' => $namespaces, |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
209 |
'downloadFormats' => self::GRAPH_RESULT_FORMAT |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
210 |
]; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
211 |
$view = 'sparql/sparqlClientResultList'; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
212 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
213 |
return [$view, $data]; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
214 |
} |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
215 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
216 |
private function queryAsk(Request $request, $query, $analyser) { |
387 | 217 |
try { |
218 |
$result = $this->getSparqlClient()->query($query); |
|
219 |
} catch(\Exception $exception) { |
|
220 |
$this->processQueryException($exception); |
|
221 |
} |
|
222 |
||
386
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
223 |
$data = [ |
387 | 224 |
'results' => $result, |
386
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
225 |
'namespaces' => $analyser->getPrefixes() |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
226 |
]; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
227 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
228 |
$view = 'sparql/sparqlClientResultBoolean'; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
229 |
return [$view, $data]; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
230 |
} |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
231 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
232 |
private function showHtml(Request $request) { |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
233 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
234 |
$query = $request->input('query'); |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
235 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
236 |
$analyser = new SparqlQueryAnalyser($query); |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
237 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
238 |
$queryType = $analyser->getQueryType(); |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
239 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
240 |
$namespaces = $analyser->getPrefixes(); |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
241 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
242 |
foreach($namespaces as $prefix => $nUri) { |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
243 |
RdfNamespace::set($prefix,$nUri); |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
244 |
} |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
245 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
246 |
if($queryType === SparqlQueryAnalyser::SELECT_QUERY) { |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
247 |
list($view, $data) = $this->querySelect($request, $query, $analyser); |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
248 |
} elseif($queryType === SparqlQueryAnalyser::GRAPH_QUERY) { |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
249 |
list($view, $data) = $this->queryGraph($request, $query, $analyser); |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
250 |
} elseif($queryType === SparqlQueryAnalyser::ASK_QUERY) { |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
251 |
list($view, $data) = $this->queryAsk($request, $query, $analyser); |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
252 |
} else { |
387 | 253 |
abort(400, "La requête n'est pas reconnue"); |
386
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
254 |
} |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
255 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
256 |
return view($view, $data); |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
257 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
258 |
} |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
259 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
260 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
261 |
private function proxyQuery(Request $request, $format=null) { |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
262 |
$query = $request->input('query'); |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
263 |
$headers = []; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
264 |
foreach (self::HEADERS_FORWARDED as $h) { |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
265 |
$headerValue = $request->header($h); |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
266 |
if($headerValue) { |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
267 |
$headers[$h] = $headerValue; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
268 |
} |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
269 |
} |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
270 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
271 |
if(!empty($format)){ |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
272 |
$headers['Accept'] = $format; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
273 |
} |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
274 |
|
387 | 275 |
$queryParams = $request->all(); |
276 |
$queryParams['timeout'] = config('corpusparole.sparql_client_timeout'); |
|
405
f239c8c5bb94
migrate to rdf4j (2.1.1) from sesame (4.1.1)
ymh <ymh.work@gmail.com>
parents:
389
diff
changeset
|
277 |
$queryUrl = config('corpusparole.rdf4j_query_url'); |
387 | 278 |
|
279 |
try { |
|
405
f239c8c5bb94
migrate to rdf4j (2.1.1) from sesame (4.1.1)
ymh <ymh.work@gmail.com>
parents:
389
diff
changeset
|
280 |
$rdf4jResp = $this->httpClient->post($queryUrl, ['form_params' => $queryParams, 'headers' => $headers]); |
387 | 281 |
} catch(\GuzzleHttp\Exception\ServerException $exception) { |
282 |
if($exception->getCode() == 503) { |
|
283 |
$this->abort(408, "Time-out causé par la requête SPARQL", $exception); |
|
284 |
} else { |
|
285 |
$this->abort(500, "Problème lors de la requête SPARQL", $exception); |
|
286 |
} |
|
287 |
||
288 |
} catch(\GuzzleHttp\Exception\RequestException $exception) { |
|
289 |
$message = $exception->getMessage(); |
|
290 |
if(preg_match("/MALFORMED\sQUERY/i", $message)) { |
|
291 |
$abortMessage = "Requête SPARQL mal-formée"; |
|
292 |
} else { |
|
293 |
$abortMessage = "Problème lors de la requête SPARQL"; |
|
294 |
} |
|
295 |
$this->abort($exception->getCode(), $abortMessage, $exception); |
|
296 |
} catch(\Exception $exception) { |
|
297 |
$this->abort(500, "Erreur serveur lors de la requête", $exception); |
|
298 |
} |
|
386
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
299 |
|
405
f239c8c5bb94
migrate to rdf4j (2.1.1) from sesame (4.1.1)
ymh <ymh.work@gmail.com>
parents:
389
diff
changeset
|
300 |
$resp = response((string)$rdf4jResp->getBody(), $rdf4jResp->getStatusCode()); |
f239c8c5bb94
migrate to rdf4j (2.1.1) from sesame (4.1.1)
ymh <ymh.work@gmail.com>
parents:
389
diff
changeset
|
301 |
foreach ($rdf4jResp->getHeaders() as $name => $values) { |
386
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
302 |
if($name != 'Transfer-Encoding') { |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
303 |
$resp->header($name, $values); |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
304 |
} |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
305 |
} |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
306 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
307 |
return $resp; |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
308 |
} |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
309 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
310 |
// display result |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
311 |
public function show(Request $request) { |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
312 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
313 |
$format = $request->input('format'); |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
314 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
315 |
if($format === 'text/html') { |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
316 |
return $this->showHtml($request); |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
317 |
} else { |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
318 |
return $this->proxyQuery($request, $format); |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
319 |
} |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
320 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
321 |
} |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
322 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
323 |
// do the query |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
324 |
public function query(Request $request) { |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
325 |
return $this->proxyQuery($request); |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
326 |
} |
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
327 |
|
c731ab9b934d
implement first version of sparql client interface
ymh <ymh.work@gmail.com>
parents:
diff
changeset
|
328 |
} |