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.

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:




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