2016-09-22 3 views
0

Я хочу запросить все статьи с персоналом и их географическими координатами из German DBpedia. В связи с тем, что не много статей имеют отдельную колонку с lat/long в инфобоксах, но являются геотегами (см. WikiProject Geographical coordinates), я хочу получить геотаг, которые находятся в правом верхнем углу статьи в Википедии (если они есть). Любые идеи для получения этой информации (если возможно, внутри R)?Как получить географические координаты из DBpedia для геотегов статей Википедии

Пример кода в R

library(SPARQL) 

query <- "prefix dbpedia-owl: <http://dbpedia.org/ontology/> 

SELECT DISTINCT ?name 
      ?staff 
      ?lat 
      ?long 
      ?geometry 
WHERE { 
    ?place    rdfs:label ?name . 
    ?place  dbpedia-owl:staff ?staff . 
Optional { ?place  geo:lat ?lat . } 
Optional { ?place  geo:long ?long . } 
Optional { ?place  geo:geometry ?geometry . } 
} 
LIMIT 100" 

endpoint <- "http://de.dbpedia.org/sparql" 
resultList <- SPARQL(endpoint, query) 
head(resultList[[1]]) 

                      name staff  lat long geometry 
1 "Hochschule für Angewandte Psychologie der Fachhochschule Nordwestschweiz"@de 80 47.4796 8.2129  NA 
2               "Hochschule Luzern"@de 1431 47.0140 8.3060  NA 
3                  "AKAD"@de 450  NA  NA  NA 
4                  "AKAD"@de 2011  NA  NA  NA 
5                  "AKAD"@de 2750  NA  NA  NA 
6              "Dar ul-Ulum Deoband"@de 400  NA  NA  NA 

Проблема заключается в том, что большинство статей не имеет никакой информации о lat/long в Infobox, но все еще геотегами, как вы можете видеть в Википедии в правом верхнем углу, как я упоминается. Подобно «Fachschule Fulda», это 10-я строка результата запроса, но без lat/long. Когда вы перейдете на the Wikipedia article, вы увидите координаты в правом верхнем углу.

+0

Что вы подразумеваете под «stuff-entry»? –

+1

'SELECT * WHERE {STUFF_ENTRY TRIPLE PATTERN. ? geo: lat? lat. ? geo: long? long.} ' – AKSW

+0

Я думаю, что понял. Опечатки - плохая новость в Q & A. «материал-вход» должен быть «персоналом». Таким образом, геоданные нужны для каждого объекта, у которого есть «Персональный персонал». – TallTed

ответ

0

Так как я не уверен, что именно вы хотите получить из dbpedia, это довольно общий пример. В R вы можете использовать пакет SPARQL для отправки запросов SPARQL конечным точкам (здесь конечная точка dbpedia.org). Вот код для получения метки, темы, широты и долготы всех ресурсов:

library(SPARQL) 

query <- 
"PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> 

SELECT DISTINCT ?label ?subject ?lat ?long WHERE { 
    ?subject geo:lat ?lat. 
    ?subject geo:long ?long. 
    ?subject rdfs:label ?label. 
}" 

endpoint <- "http://dbpedia.org/sparql" 
resultList <- SPARQL(endpoint, query) 
head(results[[1]]) 

        label           subject  lat  long 
1    "大袋駅"@ja <http://dbpedia.org/resource/Ōbukuro_Station> 35.9244 139.7780 
2 "Stazione di Ōbukuro"@it <http://dbpedia.org/resource/Ōbukuro_Station> 35.9244 139.7780 
3    "大袋站"@zh <http://dbpedia.org/resource/Ōbukuro_Station> 35.9244 139.7780 
4  "Ōbukuro Station"@en <http://dbpedia.org/resource/Ōbukuro_Station> 35.9244 139.7780 
5 "111 Murray Street"@en <http://dbpedia.org/resource/111_Murray_Street> 40.7156 -74.0128 
6 "11th Ward, Chicago"@en <http://dbpedia.org/resource/11th_Ward,_Chicago> 41.8380 -87.6460 



dim(results[[1]]) 
[1] 10000  4 

Обратите внимание, что количество результатов ограничено 10000 для одного запроса. Так что если вы хотите получить больше, вы должны использовать LIMIT и OFFSET так:

query <- 
"PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> 

SELECT DISTINCT ?label ?subject ?lat ?long WHERE { 
    ?subject geo:lat ?lat. 
    ?subject geo:long ?long. 
    ?subject rdfs:label ?label. 
} LIMIT 10000 OFFSET 10000" 

Этот запрос будет возвращать 10001 результаты до 20000!

Для получения дополнительной информации, как SPARQL запросы работают, я могу направить вас к этому отличному учебнику: SPARQL by Example

+0

Обратите внимание, что результаты возвращаются в произвольном порядке на сервере, который может отличаться при каждом выполнении, поэтому при использовании 'LIMIT' +' OFFSET' вы должны * всегда * иметь 'ORDER BY'. – TallTed

+0

@Martin Dabbel Ju Smelter: Спасибо за полезный намек на использование 'OFFSET' для большего количества результатов! Остальная часть вашего кода также является моим текущим статусом, что не дает мне результатов, которые я ищу. – Martin

0

Следует отметить, что данные DBpedia получен из данных Википедии, но DBpedia что не всегда токов с пожарным шлангом, так что просто увидеть что-то на Википедия не означает, что это будет на DBpedia.

Начну с рассмотрения некоторых ресурсов, о которых вы заботитесь, в наборе данных DBpdia, чтобы узнать, какие у них есть атрибуты, и особенно, какие атрибуты могут быть такими, какие вы хотите.

Я думаю, что чем больше вы могли бы быть заинтересованы в чем lat и long, такие, как вы могли бы видеть через a query like this -

PREFIX dbpedia-owl: <http://dbpedia.org/ontology/> 
PREFIX   geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> 
PREFIX  georss: <http://www.georss.org/georss/> 

SELECT DISTINCT ?label ?subject ?staff 
       ?lat ?long 
       ?geometry 
       ?georss 
WHERE 
    {    ?subject dbpedia-owl:staff ?staff   ; 
          rdfs:label  ?label   . 
     OPTIONAL { ?subject geo:lat   ?lat    . } 
     OPTIONAL { ?subject geo:long   ?long   . } 
     OPTIONAL { ?subject georss:point  ?georss   . } 
     OPTIONAL { ?subject geo:geometry  ?geometry  . } 
    } 
ORDER BY 
      ASC (?lat  ) 
      ASC (?long ) 
      ASC (?geometry) 
      ASC (?georss ) 
      ASC (?label ) 
      ASC (?subject ) 
    LIMIT 1000 
    OFFSET 10000 

LIVE RESULTS

+0

Большое спасибо за подробный ответ на мой запутанный вопрос. Правильно, что есть разные атрибуты геокода, как вы упомянули. Проблема в том, что Википедия управляет координатами для статей геокодов не в самой статье, а в другой базе данных, поэтому они не появляются в исходном коде, а не в DBPedia. То же самое и с данными о населении, которые (в Германии) обычно не являются частью инфобокса, но автоматически вставляются из официальных статистических данных через идентификаторы. – Martin

+0

В этом случае я предлагаю вам поднять это желание людям, работающим над экстрактами [DBpdia extracters] (https://sourceforge.net/p/dbpedia/mailman/dbpedia-developers/) и/или [DBpedia вообще] (https://sourceforge.net/p/dbpedia/mailman/dbpedia-discussion/). – TallTed

0

я нашел неудобное решение, но подмигнул работаю:

  1. Загрузить базу данных со списком всех геокодированных статей here
  2. Импорт в базу данных PostGIS с этим query
  3. Query все записи в зоне интереса и их PAGE_ID
  4. Запрос все необходимые записи в DBpedia с их wikiPageID
  5. Link оба набора данных в R
Смежные вопросы