Points of Interest (POI) are indispensable to any modern application, service, and product even remotely related to our physical surroundings. From navigation applications, to social networks, to tourism, and logistics, we use POIs to search, communicate, decide, and plan our actions.

The purpose of this work is to lay out a technical roadmap towards a comprehensive and vendor-agnostic OWL ontology for POI data, which enables modeling and representation of multifaceted and enriched POI profiles. This ontology accommodates and extends existing POI formats, providing a uniform and semantically-rich model for assembling and managing POI data from heterogeneous sources.

Furthermore, we have developed the open-source software TripleGeo, which can effectively transform POI data from diverse sources (geographical files, databases, and even semi-structured formats) to their RDF representations and vice versa. This software integrates reusable specifiations for ontology mappings, and also supports user-defined classification schemes for assigning categories to POIs. Through these transformations, it is possible to import POI data from various existing systems and products, transfer and address the data integration challenges in the Linked Data domain, and export back the results.

This work has been performed by the Information Systems Management Institute at "Athena" Research Center. It has been supported by the European Commission under the EU/H2020 project SLIPO "Scalable Linking and Integration of Big POI Data" (H2020-ICT-2016-1-731581).

SPARQL Endpoint

We have applied this framework against a sample dataset with 1,000,000 POI features extracted from OpenStreetMap across Europe, available under the Open Database License (ODbL). As a result, we have set up a SPARQL endpoint for searching and querying according to our ontology against the POI information contained in this sample RDF graph.

You may access this SPARQL endpoint for querying against sample POI data from OpenStreetMap. This SPARQL endpoint runs on top of OpenLink Virtuoso open source version 07.10.3207.

IMPORTANT! You must specify http://slipo.eu/graph/osm/pois as the Default Data Set Name (Graph IRI) in order to submit SPARQL queries against this RDF graph.

Next, we provide some example SPARQL queries against this RDF graph. Note that spatial operations must be expressed according to Virtuoso geospatial specifications, which are not fully aligned with the GeoSPARQL standard.

Q1: Count POIs per category:

	
PREFIX slipo: <http://slipo.eu/def#> 
SELECT ?category (COUNT(DISTINCT ?uri) AS ?count)
WHERE {  
        ?uri slipo:category ?fCategory .
	?fCategory slipo:value ?category .
    }
GROUP BY ?category
ORDER BY ?category
			

Q2: Find all POIs containing the word "Eiffel" in their names:

			
PREFIX slipo: <http://slipo.eu/def#> 
PREFIX geo: <http://www.opengis.net/ont/geosparql#>
SELECT ?name ?category ?fWKT
WHERE { 
        ?uri slipo:name ?fName . 
        ?fName slipo:nameValue ?name . 
        ?name bif:contains "Eiffel" . 
        ?uri slipo:category ?fCategory .
	?fCategory slipo:value ?category .
        ?uri geo:hasGeometry ?fGeometry .
        ?fGeometry geo:asWKT ?fWKT .
    }		
			

Q3: Retrieve a sample of 50 POIs with their contact information (phone, fax, email, homepage, opening hours):

			
PREFIX slipo: <http://slipo.eu/def#>
SELECT ?poiId ?name ?phone_number ?fax_number ?email_addr ?homepage ?opening_hours
WHERE { 
	?uri slipo:source ?poiSourceInfo .
	?poiSourceInfo slipo:poiRef ?poiId .	
	?uri slipo:name ?fName . 
	?fName slipo:nameValue ?name .
	OPTIONAL { ?uri slipo:homepage ?homepage . }
	?uri slipo:phone ?phone .
	?phone slipo:contactValue ?phone_number .
	?uri slipo:fax ?fax .
	?fax slipo:contactValue ?fax_number .
	?uri slipo:email ?email .
	?email slipo:contactValue ?email_addr .
	OPTIONAL { ?uri slipo:openingHours ?open_hours_slot .
		   ?open_hours_slot slipo:concat ?opening_hours . }		
      }
LIMIT 50		
			

Q4: Find all POIs of category "PUB" within a given area in London (specified as a rectangular BOX with lon/lat coordinates):

	
PREFIX slipo: <http://slipo.eu/def#> 
PREFIX geo: <http://www.opengis.net/ont/geosparql#>
SELECT ?name ?fWKT
WHERE { 
	?uri slipo:name ?fName . 
        ?fName slipo:nameValue ?name . 
        ?uri slipo:category ?fCategory .
	?fCategory slipo:value "PUB" .
	?uri geo:hasGeometry ?fGeometry .
        ?fGeometry geo:asWKT ?fWKT .
        FILTER (bif:st_within ( ?fWKT, bif:st_geomfromtext("BOX (-1.332893 51.739361, -1.176338 51.785259)")))
    }
			

Q5: Find all POIs of category "RESTAURANT" within distance of 2 kilometers from a given location (lon=23.735933, lat=37.975598):

	
PREFIX slipo: <http://slipo.eu/def#> 
PREFIX geo: <http://www.opengis.net/ont/geosparql#>
SELECT ?name ?phone_number ?fWKT ?distance_km
WHERE { 
	?uri slipo:name ?fName . 
        ?fName slipo:nameValue ?name . 
        ?uri slipo:category ?fCategory .
	?fCategory slipo:value "RESTAURANT" .
        OPTIONAL { ?uri slipo:phone ?phone .
		   ?phone slipo:contactValue ?phone_number .  }
	?uri geo:hasGeometry ?fGeometry .
        ?fGeometry geo:asWKT ?fWKT .
        BIND (bif:st_distance(bif:st_point(23.735933, 37.975598), ?fWKT ) AS ?distance_km) .
        FILTER (?distance_km < 2)
    }
ORDER BY ?distance_km