2014-06-06 18 views
5

Belirli bir IATA koduyla havalimanları hakkında bilgi almak için DBpedia kullanıyorum. Kullandığım sorgu aşağıdaki gibidir. Aldığım sonuçlar bir havalimanı için iki sıra içerir; birinde şehir yer, diğeri ise ülke. Konumun türünü nasıl alabilirim (bir şehir veya ülke olsun)? Bu kullanıyorum sorgusu: şeyler yüklemi rdf:type için değerlerin çok var çünkü GeneldeDBpedia kaynaklarının Şehirler mi yoksa Ülkeler mi olduğunu belirleme

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

cevap

4

, kaynaklar, çok türlerinden sahip olabilir. Bu durumda, varsa, ilişkili şehir veya ülke türünü almak istediğiniz gibi geliyor. http://dbpedia.org/resource/Somalia kaynağına bakarsanız, bunun dbpedia-owl:Country türüne sahip olduğunu görebilirsiniz. http://dbpedia.org/resource/Mogadishu için, Şehir tipi yok, ancak yerleşim var ve bu, şehirleri tanımlamak için en uygun olanı olabilir.

values kodunu, bir değişken için izin verilen değerler kümesini belirtmek üzere kullanabilirsiniz ve varsa, bazı eşleşmeleri almak için optional'u kullanabilirsiniz. Ör Ayrıca

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

Ben dil etiketlerini kontrol etmek langMatches kullandım unutmayın; Bunu yapmanın doğru yolu budur. Normal ifade, bir dizede bir dizenin oluşup oluşmadığını kontrol etmekten başka bir şey yapmadığından, onu contains olarak değiştirdim.

Değeri için, bu values'u optional deseninin içinde kullanıp kullanmadığımı bilmiyorum, ancak daha çok beğenmekteyim ve bunun gelecekte yararlı olabileceğini umuyorum. 'u'un optional dışına koymak için aynı etkiye sahip değildir, çünkü bunu yaparsanız, ?locationType her zaman bir değer alır, yalnızca optional bölümü eşleşmeyebilir. Yani, values'u optional'un dışına çıkarırsanız, dört sonuç satırı alırsınız: 2 konum × 2 locationTypes = 4 kombinasyon.