-------------------------------------------------------------------------- ## Project: GeoKnow, http://geoknow.eu ## Testing geospatial support in Virtuoso RDF store ver. 7.1. ## 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 of Virtuoso ColumnStore edition 7.1 in a Linux ubuntu 8 64-bit machine **********************************STORAGE********************************* ## Create graph from ISQL interface: SPARQL CREATE GRAPH ; => RUNNING! ==> Done. -- 27 msec. ## SIMPLE METHOD for bulk loading of RDF triples: ## Use interactive SQL to import geometric points in RDF/XML format ## IMPORTANT: Use RDF/XML in order to keep Greek characters in string literals (other encodings like N-TRIPLES do NOT preserve encoding!) DB.DBA.RDF_LOAD_RDFXML (file_to_string_output('/home/virtuoso/scripts/data/tmp/inspire/metadata/Metadata_kallikratis.rdf'), '', 'urn:x-geoknow-eu:sparql:virtuoso:metadata:inspire'); => RUNNING! ==> Done. -- 19 msec. 66 triples DB.DBA.RDF_LOAD_RDFXML (file_to_string_output('/home/virtuoso/scripts/data/tmp/inspire/metadata/Metadata_natura.rdf'), '', 'urn:x-geoknow-eu:sparql:virtuoso:metadata:inspire'); => RUNNING! ==> Done. -- 11 msec. 63 triples DB.DBA.RDF_LOAD_RDFXML (file_to_string_output('/home/virtuoso/scripts/data/tmp/inspire/metadata/Metadata_hydro.rdf'), '', 'urn:x-geoknow-eu:sparql:virtuoso:metadata:inspire'); => RUNNING! ==> Done. -- 15 msec. 70 triples DB.DBA.RDF_LOAD_RDFXML (file_to_string_output('/home/virtuoso/scripts/data/tmp/inspire/metadata/Metadata_transport.rdf'), '', 'urn:x-geoknow-eu:sparql:virtuoso:metadata:inspire'); => RUNNING! ==> Done. -- 10 msec. 69 triples DB.DBA.RDF_LOAD_RDFXML (file_to_string_output('/home/virtuoso/scripts/data/tmp/inspire/metadata/Metadata_oikismoi.rdf'), '', 'urn:x-geoknow-eu:sparql:virtuoso:metadata:inspire'); => RUNNING! ==> Done. -- 11 msec. 69 triples DB.DBA.RDF_LOAD_RDFXML (file_to_string_output('/home/virtuoso/scripts/data/tmp/inspire/metadata/Metadata_oikodomika.rdf'), '', 'urn:x-geoknow-eu:sparql:virtuoso:metadata:inspire'); => RUNNING! ==> Done. -- 7 msec. 69 triples DB.DBA.RDF_LOAD_RDFXML (file_to_string_output('/home/virtuoso/scripts/data/tmp/inspire/metadata/Metadata_addresses.rdf'), '', 'urn:x-geoknow-eu:sparql:virtuoso:metadata:inspire'); => RUNNING! ==> Done. -- 8 msec. 69 triples ## Get total count of triples in the graph (initially, it must be empty) SPARQL SELECT (COUNT(*) AS ?num) WHERE { GRAPH { ?s ?p ?o } } ; ==> 475 statements in the triple store (of 475 originally submitted) --> ALL inserted successfully. ********************************PREFIXES************************************** ## Must use one or more of the following namespaces for metadata and spatial queries in Virtuoso: PREFIX locn: PREFIX prov: PREFIX skos: PREFIX vcard: PREFIX xs: PREFIX dct: PREFIX dcat: PREFIX gco: PREFIX gmd: PREFIX foaf: *******************************QUERIES****************************** ## All queries about METADATA should specify the following "Default Data Set Name (Graph IRI)" in the SPARQL enpoint: urn:x-geoknow-eu:sparql:virtuoso: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 } ## 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: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(?key, "^Καλαμαριά*", "i")) } ==> RUNNING! ## M5: Identify datasets with total spatial extent (MBB) ovelapping the given area of interest (a rectangle): ------------------------------------------------------------------------------------------------------------- PREFIX dct: PREFIX locn: SELECT ?dataURI ?title ?details (bif:st_get_bounding_box(?fWKT) AS ?totalExtent) WHERE { ?dataURI dct:title ?title . ?dataURI dct:description ?details . ?dataURI dct:spatial ?extent . ?extent locn:geometry ?fWKT . FILTER (bif:st_intersects ("BOX2D(21.46 37.96,22.73 39.11)"^^virtrdf:Geometry, bif:st_get_bounding_box(?fWKT) )) } ==> RUNNING! ==> Topological predicates involving polygons are computed against their MBBs. Detailed evaluation against accurate geometries is deferred to the next release of Virtuoso. ## 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).