2014-06-06 29 views
5

Uso DBpedia per estrarre informazioni sugli aeroporti con un dato codice IATA. Segue la query che sto utilizzando. I risultati che sto ottenendo comprendono due file per un aeroporto; in una città è la posizione, e nell'altra, il paese è il luogo. Come posso recuperare il tipo di posizione (che si tratti di una città o di un paese)? Questa è la domanda che sto usando:Determinare se le risorse DBpedia sono Città o Paesi

PREFIX dbpprop: <http://dbpedia.org/property/> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX dbpedia-owl: <http://dbpedia.org/ontology/> 
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 

SELECT * WHERE { 
    ?subject rdf:type dbpedia-owl:Airport; 
      rdfs:label ?label; 
      dbpedia-owl:location ?location; 
      dbpedia-owl:iataLocationIdentifier ?iata; 
      geo:lat ?latitude; 
      geo:long ?longitude. 
    FILTER (lang(?label) = 'en' and regex(?iata, "MGQ")) 
} 

SPARQL results

risposta

4

In generale, le risorse possono avere un sacco di tipi, perché le cose hanno un sacco di valori per il predicato rdf:type. In questo caso, sembra che tu voglia recuperare il tipo di città o paese associato, se presente. Se si guarda la risorsa http://dbpedia.org/resource/Somalia, si può vedere che ha il tipo dbpedia-owl:Country. Per http://dbpedia.org/resource/Mogadishu, non esiste un tipo di città, ma c'è un accordo, e potrebbe essere il più appropriato per identificare le città.

È possibile utilizzare values per specificare un set di valori consentiti per una variabile e utilizzare optional per ottenere alcune corrispondenze, se presenti. Per esempio,

select * where { 
    ?subject rdf:type dbpedia-owl:Airport; 
      rdfs:label ?label; 
      dbpedia-owl:location ?location; 
      dbpedia-owl:iataLocationIdentifier ?iata; 
      geo:lat ?latitude; 
      geo:long ?longitude. 
    FILTER (langMatches(lang(?label),'en') && contains(?iata, "MGQ")) 

    optional { 
    values ?locationType { dbpedia-owl:Settlement dbpedia-owl:Country } 
    ?location a ?locationType 
    } 
} 

SPARQL results

anche notare che ho usato per controllare langMatches lingua tag; questo è il modo giusto per farlo. Poiché l'espressione regolare non ha fatto altro che controllare se una sottostringa si è verificata in una stringa, l'ho modificata in contains.

Per quello che vale, non so se ho usato questo modello values all'interno dello optional, ma mi piace, e mi aspetto che possa essere utile in futuro. Non ha lo stesso effetto di mettere valuesfuori il optional, perché se lo fai, allora il ottiene sempre un valore, è solo che la parte optional potrebbe non corrispondere. Cioè, se prendi lo values al di fuori dello optional, otterrai quattro righe di risultati: 2 posizioni × 2 LocationTypes = 4 combinazioni.