<?php
// src/Controller/OntoController.php
namespace App\Controller;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class GraphController extends AbstractController
{
function request($url, $auth){
// is curl installed?
if (!function_exists('curl_init')){
die('CURL is not installed!');
}
// get curl handle
$ch= curl_init();
// set request url
curl_setopt($ch,
CURLOPT_URL,
$url);
// return response, don't print/echo
curl_setopt($ch,
CURLOPT_RETURNTRANSFER,
TRUE);
// 2 lignes suivantes dangereuses, voir comment gérer des certificats
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, $auth);
/*
Here you find more options for curl:
http://www.php.net/curl_setopt
*/
$response = curl_exec($ch);
if (curl_error($ch)) {
$error_msg = curl_error($ch);
}
curl_close($ch);
if ($response === FALSE) {
return "erreur ".$error_msg." dans l'appel de ".$url;
}
return $response;
}
/**
@Route("/graph/jocondevoc}")
*/
public function mccVocabulaireDAutoriteGraphBySite($entityid)
{
return self::graphDescriptionDisplay($entityid, "MCCJOCONDEVOCABULARY");
# return self::graphDescriptionDisplay($entityid, "GENERICVOID"); to be done: a generic display from auto-description of a graph (ex:VOID or DCAT)
}
/**
@Route("/graph/billetterie/site/{entityid}")
*/
public function billetterieGraphBySite($entityid)
{
return self::graphDescriptionDisplay($entityid, "GRAPHTICKETINGBYSITE");
}
/**
@Route("/billetterie/{entityid}")
*/
public function billetterieGraph($entityid)
{
return self::graphDescriptionDisplay($entityid, "GRAPHBILLETTERIE");
}
function graphStructurer($description)
{
$descstruct = array();
$descstruct["predicates"] = array();
foreach ($description["results"]["bindings"] as $item) {
$predicate = $item["p"]["value"];
if (!in_array($predicate, $descstruct["predicates"], TRUE)) {
array_push($descstruct["predicates"], $predicate);
}
}
return $descstruct;
}
/**
@Route("/livredor/{entityid}")
*/
public function livredorGraph($entityid)
{
// exemple: http://givingsense.eu/datamusee/onto/livredor/ANSW_5ad8ad19d1c52ba751ccab5c
// ici, je devrais récupérer le type de l'entité et choisir un template en fonction du type
// mais pour l'instant (16/6/2019) Tuan n'a pas mis de type sur les entités
// donc je vais ma baser sur la chaîne avant _ dans l'entityid
return self::graphDescriptionDisplay($entityid, "GRAPHLIVREDOR");
}
function getRequestUrl($endpoint, $query)
{
$format = "application/sparql-results+json";
$searchUrl = $endpoint.'?'
.'query='.urlencode($query)
.'&format='.urlencode($format);
return $searchUrl;
}
function graphDescriptionDisplay($entityid, $graphtype)
{
// exemple: http://datamusee.givingsense.eu/livredor/parismusees
$templateSelector = array(
"MCCJOCONDEVOCABULARY"=>[
"template" => 'graph/mccjocondegraph.html.twig' ,
"subdir" => "",
"typestring"=>"Graphe de données des vocabulaires de référence (listes d'autorité) du Ministère de la Culture Français",
"endpoint" => "https://kg.grains-de-culture.fr/JocondeSkosMCC/sparql",
"sparqltype"=> "http://datamusee.givingsense.eu/onto/contribution",
"structurer" => "graphStructurer" # à vérifier
],
"GRAPHLIVREDOR"=> [
"template" => 'graph/dmlivredorgraph.html.twig' ,
"subdir" => "livredor",
"typestring"=>"Graphe de données de livres d'or",
"endpoint" => "https://kg.grains-de-culture.fr/dm/sparql",
"sparqltype"=> "http://datamusee.givingsense.eu/onto/contribution",
"structurer" => "graphStructurer"
],
"GRAPHBILLETTERIE"=> [
"template" => 'graph/dmbilletteriegraph.html.twig' ,
"subdir" => "billetterie",
"typestring"=>"Graphe de données de billetterie",
"endpoint" => "https://kg.grains-de-culture.fr/dm/sparql",
"sparqltype"=> "http://schema.org/SellAction",
"structurer" => "graphStructurer"
],
"GRAPHTICKETINGBYSITE"=> [
"template" => 'graph/dmticketingbysitegraph.html.twig' ,
"subdir" => "graph/billetterie/site",
"typestring"=>"Graphe de données de billetterie",
"endpoint" => "https://kg.grains-de-culture.fr/dm/sparql",
"sparqltype"=> "http://schema.org/SellAction",
"structurer" => "graphStructurer"
]
);
$graphname = "http://datamusee.givingsense.eu/".$templateSelector[$graphtype]["subdir"]."/".$entityid;
$auth = "student:igr2018%"; //$username . ":" . $password;
$sparqlquerypredicates = "SELECT distinct ?p WHERE { graph <".$graphname."> { ?s a <".$templateSelector[$graphtype]["sparqltype"].">; ?p [] }} ";
$sparqlquerycount = "SELECT (count(distinct ?s) as ?c) WHERE { graph <".$graphname."> { ?s a <".$templateSelector[$graphtype]["sparqltype"]."> }}";
$sparqlquerysite = "SELECT distinct ?urisite ?sitename WHERE { graph <" . $graphname . "> { ?s a <" . $templateSelector[$graphtype]["sparqltype"] . ">; <http://datamusee.givingsense.eu/onto/site/hasSite> ?urisite } graph ?g { ?urisite <http://schema.org/name> ?sitename }}";
$sitename = "";
$urisite = "";
if (strcmp($graphtype,"GRAPHTICKETINGBYSITE")==0) {
$requestURL = self::getRequestUrl($templateSelector[$graphtype]["endpoint"], $sparqlquerysite);
$descsite = json_decode(self::request($requestURL, $auth), true);
foreach ($descsite["results"]["bindings"] as $item) {
$sitename = $item["sitename"]["value"];
$urisite = $item["urisite"]["value"];
}
}
$uri = "http://datamusee.givingsense.eu/".$templateSelector[$graphtype]["subdir"]."/".$entityid;
$requestURL = self::getRequestUrl($templateSelector[$graphtype]["endpoint"], $sparqlquerypredicates);
$description = json_decode(self::request($requestURL, $auth), true);
$descstruct = $this->{$templateSelector[$graphtype]["structurer"]}($description);
$requestURL = self::getRequestUrl($templateSelector[$graphtype]["endpoint"], $sparqlquerycount);
$description = json_decode(self::request($requestURL, $auth), true);
foreach ($description["results"]["bindings"] as $item) {
$descstruct["count"] = $item["c"]["value"];
}
$descstruct["triplestore"] = "https://kg.grains-de-culture.fr/";
$descstruct["endpoint"] = $templateSelector[$graphtype]["endpoint"];
$descstruct["dataset"] = "dm";
$descstruct["jsonarray"] = $description;
$descstruct["url"] = $requestURL;
$descstruct["uri"] = $uri;
$descstruct["sitename"] = $sitename;
$descstruct["urisite"] = $urisite;
$descstruct["entityid"] = $entityid;
$descstruct["entitytype"] = $templateSelector[$graphtype]["typestring"];
return $this->render($templateSelector[$graphtype]["template"], [
'descstruct' => $descstruct,
'entitytype' => $templateSelector[$graphtype]["typestring"],
]);
// 'description' => self::printArray($description),
}
}