-------------------------------------------------------------------------- ## Project: GeoKnow, http://geoknow.eu ## Testing geospatial support in Parliament RDF store ver. 2.7.4. ## Using INSPIRE-compliant METADATA for Greece taken from geodata.gov.gr. ## Tests performed by Kostas Patroumpas ## Date: 8/4/2014 ## Revised: 16/5/2014 ------------------------------------------------------------------------- ## Tests against a VM installation Tests against a local installation of Parliament RDF 2.7.4 software in a Linux ubuntu 8 64-bit machine **********************************STORAGE********************************* ## Create graph from web interface: CREATE GRAPH ; => RUNNING! ==> Done. -- 27 msec. ## Using a custom Java wrapper for bulk loading of RDF triples: ## IMPORTANT: Use RDF/XML in order to keep Greek characters in string literals (other encodings like N-TRIPLES do NOT preserve encoding!) ## CAUTION: Still, Greek characters are NOT shown in graph contents, but they are shown in query results! FILE: /home/user/packages/Parliament/inspire/metadata/Metadata_kallikratis.rdf => LOADED! ==> Done. -- 280 msec. -- 66 triples FILE: /home/user/packages/Parliament/inspire/metadata/Metadata_natura.rdf => LOADED! ==> Done. -- 220 msec. -- 65 triples. FILE: /home/user/packages/Parliament/inspire/metadata/Metadata_hydro.rdf => LOADED! ==> Done. -- 226 msec. -- 70 triples. FILE: /home/user/packages/Parliament/inspire/metadata/Metadata_transport.rdf => LOADED! ==> Done. -- 238 msec. -- 69 triples. FILE: /home/user/packages/Parliament/inspire/metadata/Metadata_oikismoi.rdf => LOADED! ==> Done. -- 230 msec. -- 69 triples. FILE: /home/user/packages/Parliament/inspire/metadata/Metadata_oikodomika.rdf => LOADED! ==> Done. -- 227 msec. -- 69 triples. FILE: /home/user/packages/Parliament/inspire/metadata/Metadata_addresses.rdf => LOADED! ==> Done. -- 227 msec. -- 69 triples. ## Get total count of triples in the graph (initially, it must be empty) SELECT (COUNT(*) AS ?num) WHERE { GRAPH { ?s ?p ?o } } ==> 475 statements in the triple store (of 475 originally submitted) --> ALL inserted successfully. ## Create spatial index (R-tree) against the geometries of this metadata: INSERT {} WHERE { "true"^^ } ********************************PREFIXES************************************** ## Must use one or more of the following namespaces for metadata and spatial queries in Parliament: PREFIX locn: PREFIX prov: PREFIX skos: PREFIX vcard: PREFIX xs: PREFIX dct: PREFIX dcat: PREFIX gco: PREFIX gmd: PREFIX foaf: PREFIX geo: PREFIX sf: PREFIX geof: PREFIX uom: *******************************QUERIES****************************** ## All queries about METADATA should target the following named graph URI in the SPARQL enpoint: urn:x-geoknow-eu:sparql:parliament:metadata:inspire (i.e., 'GRAPH ' in WHERE clauses) ## M0: Count all stored triples for metadata (including blank nodes!): --------------------------------------------------------------------- SELECT (COUNT(*) AS ?num) WHERE { ?s ?p ?o } should be REWRITTEN as: SELECT (COUNT(*) AS ?num) WHERE { GRAPH { ?s ?p ?o } } ## M1: Show all keywords available in the metadata: --------------------------------------------------- PREFIX dcat: PREFIX dct: SELECT DISTINCT ?key WHERE { ?dataURI dct:description ?details . ?dataURI dcat:landingPage ?homeURL . ?dataURI dcat:keyword ?key . } ORDER BY ?key ## M1a: Variant using a CONSTRUCT clause in order to return results as triples: ------------------------------------------------------------------------------- PREFIX dcat: PREFIX dct: CONSTRUCT { ?dataURI dct:description ?details . ?dataURI dcat:landingPage ?homeURL . ?dataURI dcat:keyword ?key . } WHERE { ?dataURI dct:description ?details . ?dataURI dcat:landingPage ?homeURL . ?dataURI dcat:keyword ?key . } ## M2: Report when the latest update of each dataset did actually occur (after 2011): -------------------------------------------------------------------------------------- PREFIX dct: PREFIX xsd: SELECT ?dataURI ?title (MAX(?date) AS ?lastModified) WHERE { { ?dataURI dct:title ?title . ?dataURI dct:created ?date } UNION { ?dataURI dct:title ?title . ?dataURI dct:modified ?date } FILTER ( ?date >= "2011-01-01"^^xsd:date ) } GROUP BY ?dataURI ?title ORDER BY ASC(?lastModified) ==> RUNNING! ## M3: Display providers for each dataset: ------------------------------------------ PREFIX rdfs: PREFIX dcat: PREFIX dct: PREFIX vcard: PREFIX prov: PREFIX skos: PREFIX roles: SELECT ?dataURI ?title ?scheme ?provider ?license ?email WHERE { ?dataURI dct:title ?title . ?dataURI prov:qualifiedAttribution ?attr . ?attr dct:type roles:resourceProvider . ?attr prov:agent ?agent . ?agent vcard:organization-name ?provider . ?agent vcard:hasEmail ?email . ?dataURI dcat:distribution ?distr . ?distr dct:rights ?r . ?r rdfs:label ?license . OPTIONAL { ?dataURI dcat:theme ?theme . ?theme skos:inScheme ?s . ?s rdfs:label ?scheme . } } ==> RUNNING! (Criteria for SKOS theme are set as optional, because some detasets do not contain such references). ## M4: Find any available datasets with metadata that contain a given keyword: ------------------------------------------------------------------------------ PREFIX dcat: PREFIX dct: SELECT ?dataURI ?title ?details ?key ?subject ?homeURL WHERE { ?dataURI dct:title ?title . ?dataURI dct:subject ?subject . ?dataURI dct:description ?details . ?dataURI dcat:landingPage ?homeURL . ?dataURI dcat:keyword ?key . FILTER (REGEX(?subject, "^environment*", "i")) } ==> RUNNING, and filtering with Latin strings actually returns some results. ## M5: Identify datasets with total spatial extent (MBB) ovelapping the given area of interest (a rectangle): ------------------------------------------------------------------------------------------------------------- PREFIX dct: PREFIX locn: PREFIX geof: PREFIX sf: SELECT ?dataURI ?title ?details (geof:envelope(?fWKT) AS ?totalExtent) WHERE { ?dataURI dct:title ?title . ?dataURI dct:description ?details . ?dataURI dct:spatial ?extent . ?extent locn:geometry ?fWKT . FILTER (geof:sfIntersects ("POLYGON((21.46 37.96, 22.73 37.96, 22.73 39.11, 21.46 39.11, 21.46 37.96))"^^sf:wktLiteral, geof:envelope(?fWKT) )) } ==> RUNNING! ## M6: Get details for all available datasets: ---------------------------------------------- PREFIX dcat: PREFIX dct: PREFIX vcard: PREFIX prov: PREFIX roles: SELECT ?dataURI ?title ?provider ?details ?subject ?homeURL WHERE { ?dataURI dct:title ?title . ?dataURI dct:subject ?subject . ?dataURI dct:description ?details . ?dataURI dcat:landingPage ?homeURL . ?dataURI prov:qualifiedAttribution ?attr . ?attr dct:type roles:resourceProvider . ?attr prov:agent ?agent . ?agent vcard:organization-name ?provider . } ==> RUNNING! (This query binds together several pieces from previous ones).