Example #1
0
 /**
  * Return a DCAT document based on the definitions that are passed
  *
  * @param array Array with definition configurations
  *
  * @return \EasyRdf_Graph
  */
 public function getDcatDocument(array $definitions, $oldest_definition)
 {
     // Create a new EasyRDF graph
     $graph = new Graph();
     $all_settings = $this->settings->getAll();
     $uri = \Request::root();
     // Add the catalog and a title
     $graph->addResource($uri . '/api/dcat', 'a', 'dcat:Catalog');
     $graph->addLiteral($uri . '/api/dcat', 'dct:title', $all_settings['catalog_title']);
     // Fetch the catalog description, issued date and language
     $graph->addLiteral($uri . '/api/dcat', 'dct:description', $all_settings['catalog_description']);
     $graph->addLiteral($uri . '/api/dcat', 'dct:issued', $this->getIssuedDate());
     $lang = $this->languages->getByCode($all_settings['catalog_language']);
     if (!empty($lang)) {
         $graph->addResource($uri . '/api/dcat', 'dct:language', 'http://lexvo.org/id/iso639-3/' . $lang['lang_id']);
         $graph->addResource('http://lexvo.org/id/iso639-3/' . $lang['lang_id'], 'a', 'dct:LinguisticSystem');
     }
     // Fetch the homepage and rights
     $graph->addResource($uri . '/api/dcat', 'foaf:homepage', $uri);
     $graph->addResource($uri . '/api/dcat', 'dct:license', 'http://www.opendefinition.org/licenses/cc-zero');
     $graph->addResource('http://www.opendefinition.org/licenses/cc-zero', 'a', 'dct:LicenseDocument');
     // Add the publisher resource to the catalog
     $graph->addResource($uri . '/api/dcat', 'dct:publisher', $all_settings['catalog_publisher_uri']);
     $graph->addResource($all_settings['catalog_publisher_uri'], 'a', 'foaf:Agent');
     $graph->addLiteral($all_settings['catalog_publisher_uri'], 'foaf:name', $all_settings['catalog_publisher_name']);
     if (count($definitions) > 0) {
         // Add the last modified timestamp in ISO8601
         $graph->addLiteral($uri . '/api/dcat', 'dct:modified', date(\DateTime::ISO8601, strtotime($oldest_definition['updated_at'])));
         foreach ($definitions as $definition) {
             if ($definition['source_type'] != "InspireDefinition" && $definition['source_type'] != "RemoteDefinition") {
                 // Create the dataset uri
                 $dataset_uri = $uri . "/" . $definition['collection_uri'] . "/" . $definition['resource_name'];
                 $dataset_uri = str_replace(' ', '%20', $dataset_uri);
                 $source_type = $definition['type'];
                 // Add the dataset link to the catalog
                 $graph->addResource($uri . '/api/dcat', 'dcat:dataset', $dataset_uri);
                 // Add the dataset resource and its description
                 $graph->addResource($dataset_uri, 'a', 'dcat:Dataset');
                 $title = null;
                 if (!empty($definition['title'])) {
                     $title = $definition['title'];
                 } else {
                     $title = $definition['collection_uri'] . '/' . $definition['resource_name'];
                 }
                 $graph->addLiteral($dataset_uri, 'dct:title', $title);
                 // Add the description, identifier, issued date, modified date, contact point and landing page of the dataset
                 $graph->addLiteral($dataset_uri, 'dct:description', @$definition['description']);
                 $graph->addLiteral($dataset_uri, 'dct:identifier', str_replace(' ', '%20', $definition['collection_uri'] . '/' . $definition['resource_name']));
                 $graph->addLiteral($dataset_uri, 'dct:issued', date(\DateTime::ISO8601, strtotime($definition['created_at'])));
                 $graph->addLiteral($dataset_uri, 'dct:modified', date(\DateTime::ISO8601, strtotime($definition['updated_at'])));
                 $graph->addResource($dataset_uri, 'dcat:landingPage', $dataset_uri);
                 // Backwards compatibility
                 if (!empty($definition['contact_point'])) {
                     $graph->addResource($dataset_uri, 'dcat:contactPoint', $definition['contact_point']);
                 }
                 // Add the publisher resource to the dataset
                 if (!empty($definition['publisher_name']) && !empty($definition['publisher_uri'])) {
                     $graph->addResource($dataset_uri, 'dct:publisher', $definition['publisher_uri']);
                     $graph->addResource($definition['publisher_uri'], 'a', 'foaf:Agent');
                     $graph->addLiteral($definition['publisher_uri'], 'foaf:name', $definition['publisher_name']);
                 }
                 // Add the keywords to the dataset
                 if (!empty($definition['keywords'])) {
                     foreach (explode(',', $definition['keywords']) as $keyword) {
                         $keyword = trim($keyword);
                         $graph->addLiteral($dataset_uri, 'dcat:keyword', $keyword);
                     }
                 }
                 // Add the source resource if it's a URI
                 if (strpos($definition['source'], 'http://') !== false || strpos($definition['source'], 'https://')) {
                     $graph->addResource($dataset_uri, 'dct:source', str_replace(' ', '%20', $definition['source']));
                 }
                 // Optional dct terms
                 $optional = array('date', 'language', 'theme');
                 foreach ($optional as $dc_term) {
                     if (!empty($definition[$dc_term])) {
                         if ($dc_term == 'language') {
                             $lang = $this->languages->getByName($definition[$dc_term]);
                             if (!empty($lang)) {
                                 $graph->addResource($dataset_uri, 'dct:' . $dc_term, 'http://lexvo.org/id/iso639-3/' . $lang['lang_id']);
                                 $graph->addResource('http://lexvo.org/id/iso639-3/' . $lang['lang_id'], 'a', 'dct:LinguisticSystem');
                             }
                         } elseif ($dc_term == 'theme') {
                             $theme = $this->themes->getByLabel($definition[$dc_term]);
                             if (!empty($theme)) {
                                 $graph->addResource($dataset_uri, 'dcat:' . $dc_term, $theme['uri']);
                                 $graph->addLiteral($theme['uri'], 'rdfs:label', $theme['label']);
                             }
                         } else {
                             $graph->addLiteral($dataset_uri, 'dct:' . $dc_term, $definition[$dc_term]);
                         }
                     }
                 }
                 // Add the distribution of the dataset
                 if ($this->isDataGeoFormatted($definition)) {
                     $distribution_uri = $dataset_uri . '.geojson';
                 } else {
                     $distribution_uri = $dataset_uri . '.json';
                 }
                 // Check for spatial properties:
                 if (!empty($definition['spatial']['geometry']['geometry'])) {
                     $spatial = $graph->newBNode();
                     $spatial->setType('dct:Location');
                     $geometry_literal = new Literal($definition['spatial']['geometry']['geometry'], '', '<https://www.iana.org/assignments/media-types/application/vnd.geo+json>');
                     $spatial->addLiteral('locn:geometry', $geometry_literal);
                     if (!empty($definition['spatial']['label']['label'])) {
                         $spatial->addLiteral('skos:prefLabel', $definition['spatial']['label']['label']);
                     }
                     $graph->addResource($dataset_uri, 'dct:spatial', $spatial);
                 }
                 // Check for attribution properties:
                 if (!empty($definition['attributions'])) {
                     foreach ($definition['attributions'] as $attribution) {
                         $attribution_node = $graph->newBNode();
                         $attribution_node->setType('prov:Attribution');
                         $vcard = $graph->newBNode();
                         $vcard->setType('vcard:Kind');
                         $vcard->addLiteral('vcard:fn', $attribution['name']);
                         $vcard->addResource('vcard:hasEmail', 'mailto:' . $attribution['email']);
                         $attribution_node->addResource('prov:Agent', $vcard);
                         $attribution_node->addResource('dc:type', 'http://inspire.ec.europa.eu/metadata-codelist/ResponsiblePartyRole/' . $attribution['role']);
                         $graph->addResource($dataset_uri, 'prov:qualifiedAttribution', $attribution_node);
                     }
                 }
                 $graph->addResource($dataset_uri, 'dcat:distribution', $distribution_uri);
                 $graph->addResource($distribution_uri, 'a', 'dcat:Distribution');
                 $graph->addResource($distribution_uri, 'dcat:accessURL', $dataset_uri);
                 $graph->addResource($distribution_uri, 'dcat:downloadURL', $distribution_uri);
                 $graph->addLiteral($distribution_uri, 'dct:title', $title);
                 $graph->addLiteral($distribution_uri, 'dct:description', 'A json feed of ' . $dataset_uri);
                 $graph->addLiteral($distribution_uri, 'dcat:mediaType', 'application/json');
                 $graph->addLiteral($distribution_uri, 'dct:issued', date(\DateTime::ISO8601, strtotime($definition['created_at'])));
                 // Add the license to the distribution
                 if (!empty($definition['rights'])) {
                     $license = $this->licenses->getByTitle($definition['rights']);
                     if (!empty($license) && !empty($license['url'])) {
                         $graph->addResource($dataset_uri . '.json', 'dct:license', $license['url']);
                         $graph->addResource($license['url'], 'a', 'dct:LicenseDocument');
                     }
                 }
             } else {
                 $turtle_parser = new Turtle();
                 $tmp_graph = new Graph();
                 $turtle_parser->parse($graph, $definition['dcat'], 'turtle', 'http://foo.bar');
             }
         }
     }
     return $graph;
 }
Example #2
0
 public static function getBody($dataObj)
 {
     // Query parameters
     $query_string = '';
     if (!empty($_GET)) {
         $get_params = \Input::get();
         foreach ($get_params as $param => $val) {
             if (!empty($val)) {
                 $query_string .= "&{$param}={$val}";
             }
         }
         if (!empty($query_string)) {
             $query_string = trim($query_string, '&');
             $query_string = '?' . $query_string;
         }
     }
     // Links to pages
     $prev_link = '';
     $next_link = '';
     if (!empty($dataObj->paging)) {
         $input_array = array_except(\Input::get(), array('limit', 'offset'));
         $query_string = '';
         if (!empty($input_array)) {
             foreach ($get_params as $param => $val) {
                 if (!empty($val)) {
                     $query_string .= "&{$param}={$val}";
                 }
             }
             if (!empty($query_string)) {
                 $query_string = trim($query_string, '&');
                 $query_string = '?' . $query_string;
             }
         }
         if (!empty($dataObj->paging['previous'])) {
             $prev_link = '?offset=' . $dataObj->paging['previous'][0] . '&limit=' . $dataObj->paging['previous'][1] . $query_string;
         }
         if (!empty($dataObj->paging['next'])) {
             $next_link = '?offset=' . $dataObj->paging['next'][0] . '&limit=' . $dataObj->paging['next'][1] . $query_string;
         }
     }
     // Create the link to the dataset
     $dataset_link = \URL::to($dataObj->definition['collection_uri'] . "/" . $dataObj->definition['resource_name'], [], \Config::get('app.ssl_enabled'));
     // Append rest parameters
     if (!empty($dataObj->rest_parameters)) {
         $dataset_link .= '/' . implode('/', $dataObj->rest_parameters);
     }
     if (!empty($dataObj->source_definition)) {
         $type = $dataObj->source_definition['type'];
         // Check if other views need to be served
         switch ($type) {
             case 'XLS':
             case 'CSV':
                 $first_row = array_shift($dataObj->data);
                 array_unshift($dataObj->data, $first_row);
                 if (is_array($first_row) || is_object($first_row)) {
                     $view = 'dataset.tabular';
                     $data = $dataObj->data;
                 } else {
                     $view = 'dataset.code';
                     $data = self::displayTree($dataObj->data);
                 }
                 break;
             case 'KML':
             case 'SHP':
                 $view = 'dataset.map';
                 $data = $dataset_link . '.map' . $query_string;
                 break;
             case 'XML':
                 $view = 'dataset.code';
                 $data = self::displayTree($dataObj->data, 'xml');
                 break;
             case 'INSPIRE':
                 $view = 'dataset.inspire';
                 $definitions = \App::make('Tdt\\Core\\Repositories\\Interfaces\\DefinitionRepositoryInterface');
                 $properties = $definitions->getCreateParameters();
                 $data = ['properties' => $properties];
                 break;
             case 'REMOTE':
                 $view = 'dataset.remote';
                 $definitions = \App::make('Tdt\\Core\\Repositories\\Interfaces\\DefinitionRepositoryInterface');
                 $properties = $definitions->getCreateParameters();
                 $data = ['properties' => $properties];
                 break;
             default:
                 if ($dataObj->is_semantic) {
                     // This data object is always semantic
                     $view = 'dataset.turtle';
                     // Check if a configuration is given
                     $conf = array();
                     if (!empty($dataObj->semantic->conf)) {
                         $conf = $dataObj->semantic->conf;
                     }
                     $data = $dataObj->data->serialise('turtle');
                 } elseif ($type == 'SPARQL' && $dataObj->source_definition['query_type'] == 'select') {
                     $data = CSVFormatter::buildTableFromSparqlResult($dataObj->data);
                     $first_row = array_shift($data);
                     array_unshift($data, $first_row);
                     if (is_array($first_row) || is_object($first_row)) {
                         $view = 'dataset.tabular';
                         $data = $data;
                     }
                 } else {
                     $view = 'dataset.code';
                     $data = self::displayTree($dataObj->data);
                 }
                 break;
         }
     } elseif ($dataObj->is_semantic) {
         // The data object can be semantic without a specified source type
         $view = 'dataset.code';
         $data = $dataObj->data->serialise('turtle');
     } else {
         // Collection view
         $view = 'dataset.collection';
         $data = $dataObj->data;
     }
     // Gather meta-data to inject as a JSON-LD document so it can be picked up by search engines
     $definition = $dataObj->definition;
     $uri = \Request::root();
     $graph = new Graph();
     // Create the dataset uri
     $dataset_uri = $uri . "/" . $definition['collection_uri'] . "/" . $definition['resource_name'];
     $dataset_uri = str_replace(' ', '%20', $dataset_uri);
     // Add the dataset resource and its description
     $graph->addResource($dataset_uri, 'a', 'schema:Dataset');
     // Add the title to the dataset resource of the catalog
     if (!empty($definition['title'])) {
         $graph->addLiteral($dataset_uri, 'schema:headline', $definition['title']);
     }
     // Add the description, identifier, issues, modified of the dataset
     $graph->addLiteral($dataset_uri, 'schema:description', @$definition['description']);
     $graph->addLiteral($dataset_uri, 'schema:dateCreated', date(\DateTime::ISO8601, strtotime($definition['created_at'])));
     $graph->addLiteral($dataset_uri, 'schema:dateModified', date(\DateTime::ISO8601, strtotime($definition['updated_at'])));
     // Add the publisher resource to the dataset
     if (!empty($definition['publisher_name']) && !empty($definition['publisher_uri'])) {
         $graph->addResource($dataset_uri, 'schema:publisher', $definition['publisher_uri']);
     }
     // Optional dct terms
     $optional = array('date', 'language');
     $languages = \App::make('Tdt\\Core\\Repositories\\Interfaces\\LanguageRepositoryInterface');
     $licenses = \App::make('Tdt\\Core\\Repositories\\Interfaces\\LicenseRepositoryInterface');
     foreach ($optional as $dc_term) {
         if (!empty($definition[$dc_term])) {
             if ($dc_term == 'language') {
                 $lang = $languages->getByName($definition[$dc_term]);
                 if (!empty($lang)) {
                     $graph->addResource($dataset_uri, 'schema:inLanguage', 'http://lexvo.org/id/iso639-3/' . $lang['lang_id']);
                 }
             } else {
                 $graph->addLiteral($dataset_uri, 'schema:datasetTimeInterval', $definition[$dc_term]);
             }
         }
     }
     // Add the distribution of the dataset for SEO
     $format = '.json';
     if ($definition['source_type'] == 'ShpDefinition' || $dataObj->source_definition['type'] == 'KML') {
         $format = '.geojson';
     }
     $dataDownload = $graph->newBNode();
     $graph->addResource($dataset_uri, 'schema:distribution', $dataDownload);
     $graph->addResource($dataDownload, 'a', 'schema:DataDownload');
     $graph->addResource($dataDownload, 'schema:contentUrl', $dataset_uri . $format);
     // Add the license to the distribution
     if (!empty($definition['rights'])) {
         $license = $licenses->getByTitle($definition['rights']);
         if (!empty($license) && !empty($license['url'])) {
             $graph->addResource($dataset_uri, 'schema:license', $license['url']);
         }
         if (!empty($license)) {
             $dataObj->definition['rights_uri'] = $license['url'];
         }
     }
     $jsonld = $graph->serialise('jsonld');
     // Render the view
     return \View::make($view)->with('title', 'Dataset: ' . $dataObj->definition['collection_uri'] . "/" . $dataObj->definition['resource_name'] . ' | The Datatank')->with('body', $data)->with('page_title', $dataObj->definition['collection_uri'] . "/" . $dataObj->definition['resource_name'])->with('definition', $dataObj->definition)->with('paging', $dataObj->paging)->with('source_definition', $dataObj->source_definition)->with('formats', $dataObj->formats)->with('dataset_link', $dataset_link)->with('prev_link', $prev_link)->with('next_link', $next_link)->with('query_string', $query_string)->with('json_ld', $jsonld);
 }