Como Visualizar Linked Data com R

Minha dissertação de mestrado possui três pilares principais, são eles: Linked data, Software Engineering e Social Network Analysis. Para o o resultado, eu precisarei fazer análises em redes formadas por dados de engenharia de software que estão no formato linekd data (web semântica) e para isso, escolhi utilizar o Gephi, e também a linguagem R.

Nesse post vou mostrar como fazer uma query SPARQL em um endpoint e manipular esses dados (RDF) utilizando R. Para este tutorial, vamos visualizar a densidade populacional do Braisl utilizando a DBpedia como fonte (http://dbpedia.org/page/Brazil).

Para esse tutorial, você irá precisar baixar os arquivos shapefiles do mapa do Brasil, que podem ser encontrados aqui: http://gadm.org/, além dos pacotes do R: maptools, akima e SPARQL.

A query SPARQL que iremos utilizar é esta abaixo, onde colocamos o resource e a latitude e longitude para ser buscada.

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

SELECT DISTINCT ?place
?latitude
?longitude
?population
WHERE
{
?place          dbpedia-owl:country  <http://dbpedia.org/resource/Brazil> .
?place  dbpedia-owl:populationTotal  ?population                                  .
?place                      geo:lat  ?latitude                                    .
?place                     geo:long  ?longitude                                   .
} LIMIT 200"

Essa query trará os resultados esperados das cidades e sua população, limitando o resultado para 200. O seu resultado é o dataset que pode ser visto na imagem abaixo.

dataset população
Dataset da população dos munícios brasileiros retornados pela query SPARQL

Como explicado no post original, o qual eu coloquei o link no final do post, os dados são interpolados, podendo gerar assim umpouco de erro na hora de plotar. O código R completo para o exemplo pode ser visto abaixo:

#!/usr/bin/env Rscript

library("maptools")
library("akima")
library("SPARQL")

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

SELECT DISTINCT ?place
?latitude
?longitude
?population
WHERE
{
?place          dbpedia-owl:country  <http://dbpedia.org/resource/Brazil> .
?place  dbpedia-owl:populationTotal  ?population                                  .
?place                      geo:lat  ?latitude                                    .
?place                     geo:long  ?longitude                                   .
}"

plotmap<-function(map, pops, im) {
  image(im, col=terrain.colors(50))
  points(pops$results$longitude, pops$results$latitude, cex=0.25, col="#ff30000a")
  contour(im, add=TRUE, col="brown")
  lines(map, xlim=c(-8,3), ylim=c(54,56), col="black")
}

q100<-paste(query, " limit 200")

map<-readShapeLines("BRA_adm0.shp")

if(!(exists("pops"))) {
  pops<-SPARQL("http://dbpedia.org/sparql/", query=query)
}

data <- pops$results[with(pops$results, order(longitude,latitude)), ]
data <- data[with(data, order(latitude,longitude)), ]
im <- with(data, interp(longitude, latitude, population**.25, duplicate="mean"), xo=seq(-7,1.25, length=200), yo=seq(50,58,200), linear=FALSE)

plotmap(map, pops, im)

fit<-lm(population ~ latitude*longitude, data)
print(summary(fit))

subd<-data[c("latitude","longitude","population")]
print(cor(subd))

O mapa final pode ser visto abaixo:

densidade do brasil
O mapa do Brasil e sua densidade populacional.

 

Post adaptado de: http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/VOSLODStatsAnalysisR#The Script

1 Comentários

  1. Fernanda Mafiasays:

    Legal!

Deixe um comentário

Por favor, seja educado. Seu e-mail não será publicado e os campos obrigatórios estão marcados.