2015-12-24 5 views
0

Я не понимаю, почему Virtuoso SPARQL возвращает разные значения float (в частности, долготу и широту) с одного и того же ресурса.Virtuoso возвращает разные значения float с одного и того же ресурса

Это мой запрос (link)

PREFIX dcterms: <http://purl.org/dc/terms/> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> 

SELECT ?resource ?lon ?lat WHERE { 
    ?subcat skos:broader* dbc:Airports_in_Libya. 
    ?resource dcterms:subject ?subcat. 
    ?resource geo:lat ?lat. 
    ?resource geo:long ?lon. 
} 
GROUP BY ?resource 

который возвращает список аэропортов с их географическими координатами. Однако несколько аэропортов перечислены несколько раз. Причина (вероятно) в том, что lon и lat иногда возвращаются с немного отличающимися значениями от той же страницы DBpedia.

Например,

http://dbpedia.org/resource/RAF_Gambut 23.9094 31.9095 
http://dbpedia.org/resource/RAF_Gambut 23.9095 31.9095 
http://dbpedia.org/resource/RAF_Gambut 21.8272 21.7061 

Я не понимаю, почему так как на самом деле только page сообщает только одна пара координат ...

geo:lat 31.951111 (xsd:float) 
geo:long 24.503889 (xsd:float) 

который не появляется нигде в мой результат , Это как-то связано с округлением поплавка?

ответ

0

Простой трюк показывает вам, что цифры на странице, которые вы видите, обманывают.

PREFIX dcterms: <http://purl.org/dc/terms/> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> 

SELECT ?resource (str(?lon) as ?long) (str(?lat) as ?latt) 
WHERE { 
    ?subcat skos:broader* dbc:Airports_in_Libya. 
    ?resource dcterms:subject ?subcat. 
    ?resource geo:lat ?lat. 
    ?resource geo:long ?lon. 
} 
GROUP BY ?resource 

enter image description here

Часто, когда вы видите что-то, что выглядит точно так же, но это не так, он нуждается в дальнейшем изучении. При попытке фильтрации первой линии для http://dbpedia.org/resource/RAF_Gambut ресурса, вы можете видеть, что вы получите только один результат:

PREFIX dcterms: <http://purl.org/dc/terms/> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> 

SELECT distinct ?subcat ?resource ?lon ?lat 
WHERE { 
    #?subcat skos:broader* dbc:Airports_in_Libya. 
    ?resource dcterms:subject ?subcat. 
    ?resource geo:lat ?lat. 
    ?resource geo:long ?lon. 
filter(?resource=<http://dbpedia.org/resource/RAF_Gambut>) 
} 
GROUP BY ?resource 

enter image description here

Как вы видите, вы до сих пор есть только один ?lon и ?lat. Если вы внимательно присмотритесь, нет подката, который соответствует тому, что вы извлекаете, и вы задаете SKOS словарный запас, чтобы дать вам broader вариантов. На этом этапе, если вы копаете глубже, вы можете видеть, что некоторые из чисел находятся в научной нотации.

enter image description here

Путь, чтобы устранить и согласовать выход заключается в устранении научной нотации.

PREFIX dcterms: <http://purl.org/dc/terms/> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> 

SELECT distinct ?resource ?lonf ?latf 

WHERE { 
    ?subcat skos:broader* dbc:Airports_in_Libya. 
    ?resource dcterms:subject ?subcat. 
    ?resource geo:lat ?lat. 
    ?resource geo:long ?lon. 

bind(xsd:float(?lat) as ?latf) 
bind(xsd:float(?lon) as ?lonf) 

} 
GROUP BY ?resource 

Есть еще несколько ресурсов с более чем одной долготы и широты (например, http://dbpedia.org/page/Gamal_Abdul_El_Nasser_Air_Base), но они имеют более чем один на странице DBpedia, а также.

+0

Где находится информация, если она не указана в http://dbpedia.org/resource/RAF_Gambut? – CptNemo

+0

Я отредактировал свой ответ. Отвечает ли он на ваш вопрос? – Artemis