2014-06-06 20 views
5

Tôi sử dụng DBpedia để trích xuất thông tin về các sân bay có mã IATA đã cho. Truy vấn tôi đang sử dụng sau đây. Kết quả tôi nhận được bao gồm hai hàng cho một sân bay; trong một thành phố là địa điểm, và ở một nơi khác, đất nước là địa điểm. Làm cách nào tôi có thể truy xuất loại vị trí (cho dù đó là thành phố hay quốc gia)? Đây là câu hỏi tôi đang sử dụng:Xác định xem tài nguyên DBpedia là Thành phố hay Quốc gia

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

Trả lời

4

Nói chung, các nguồn lực có thể có rất nhiều các loại, bởi vì mọi thứ có rất nhiều giá trị cho các vị rdf:type. Trong trường hợp này, có vẻ như bạn muốn truy lục loại thành phố hoặc quốc gia liên quan, nếu có. Nếu bạn nhìn vào tài nguyên http://dbpedia.org/resource/Somalia, bạn có thể thấy rằng nó có loại dbpedia-owl:Country. Đối với http://dbpedia.org/resource/Mogadishu, không có loại Thành phố, nhưng có giải quyết và có thể phù hợp nhất để xác định các thành phố.

Bạn có thể sử dụng values để chỉ định một tập hợp các giá trị cho phép cho một biến và sử dụng optional để nhận một số kết quả phù hợp nếu có. Ví dụ:

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

Cũng lưu ý rằng tôi đã sử dụng langMatches để kiểm tra thẻ ngôn ngữ; đó là cách thích hợp để làm điều đó. Vì cụm từ thông dụng không làm gì hơn là kiểm tra xem chuỗi con có xuất hiện trong chuỗi không, tôi đã đổi nó thành contains.

Đối với những gì đáng giá, tôi không biết liệu tôi đã sử dụng mẫu này values bên trong optional trước đây, nhưng tôi thích nó hơn, và tôi hy vọng rằng nó có thể hữu ích trong tương lai. Nó không có tác dụng tương tự để đặt valuesbên ngoài các optional, bởi vì nếu bạn làm điều đó, thì ?locationType luôn nhận được một giá trị, nó chỉ là phần optional có thể không khớp. Tức là, nếu bạn lấy số values bên ngoài số optional, bạn sẽ nhận được bốn hàng kết quả: 2 vị trí × 2 locationTypes = 4 kết hợp.

Các vấn đề liên quan