Skip to content

gabrielchristo/sparql-to-rest

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SPARQL to REST

Introdução

Este projeto visa desenvolver uma prova de conceito (PoC) para exposição dos dados (triplas RDF) de um endpoint SPARQL por meio de um endpoint RESTful através do projeto RAMOSE.

O projeto RAMOSE permite o desenvolvimento ágil de APIs RESTful na linguagem Python através do framework Flask. Através de routing podemos mapear requisições HTTP para execução de uma query SPARQL pré-definida.

O mapeamento de URLs para as queries é realizado através de um arquivo de configuração em formato de texto. Alguns exemplos estão disponíveis neste repositório da organização OpenCitations.

Além de proporcionar o acesso massivo à triplestores sem a curva de aprendizado da web semântica, é possível definir múltiplas APIs a partir de múltiplos endpoints SPARQL, permitindo integração entre diversos sistemas. O artigo base do projeto está disponível no Semantic Web Journal.

Para ilustrar a conversão, foi utilizado o seguinte endpoint SPARQL:

Instalação

O primeiro passo é clonar o repositório:

git clone --recurse-submodules https://github.com/gabrielchristo/sparql-to-rest.git

Backend RAMOSE

Para executar o backend RAMOSE leia os detalhes de execução aqui. Com o backend iniciado deve ser possível acessar a API por:

http://localhost:5050/api/

e observar a seguinte tela:

GUI

Para executar a interface gráfica leia os detalhes de execução aqui. Com o backend e a GUI iniciados deve ser possível acessar a mesma por:

http://localhost:4200

e observar a seguinte tela:

Com isso já é possível navegar pelas premiações de acordo com categoria e ano:

Consultas

Para realizar as consultas na Wikidata foi necessário ter conhecimento de algumas propriedades e entidades relacionadas com o domínio do trabalho. Neste caso foi escolhido o Prêmio Nobel como tópico para realização da prova de conceito.

Propriedade Descrição
P18 image
P31 instance of
P50 author
P166 award received
P279 subclass of
P585 point in time
P1411 nominated for
P1706 together with
P2121 prize money
P6208 award rationale
Entidade Descrição
Q7191 nobel prize
Q38104 physics
Q35637 peace
Q37922 literature
Q44585 chemistry
Q80061 medicine
Q47170 economic sciences

Com o vocabulário RDF em mãos, foram definidas duas queries para o RAMOSE:

Query para obter premiados por categoria

SELECT DISTINCT ?PersonLabel ?NPLabel (YEAR(?When) as ?Year) ?Picture ?Money ?Motivation
WHERE {
  VALUES ?Category { [[categoryParameter]] }

  ?Person p:P166 ?NobelPrize .
  ?NobelPrize ps:P166/wdt:P279* ?Category ;
              ps:P166/rdfs:label ?NPLabel filter (lang(?NPLabel) = "en") .
  OPTIONAL { ?NobelPrize pq:P585 ?When . }
  OPTIONAL { ?Person wdt:P18 ?Picture . }
  OPTIONAL { ?NobelPrize pq:P2121 ?MoneyValue . }
  BIND(CONCAT(STR(?MoneyValue), " Swedish krona") as ?Money)
  OPTIONAL { ?NobelPrize pq:P6208 ?Motivation filter (lang(?Motivation) = "en") . }
  SERVICE wikibase:label {
    bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en" .
  }
} ORDER BY ?Year

Query para obter premiados por categoria e ano

SELECT DISTINCT ?PersonLabel ?NPLabel ?Year ?Picture ?Money ?Motivation
WHERE {
  VALUES ?Year { [[yearParameter]] }
  VALUES ?Category { [[categoryParameter]] }
  
  ?Person p:P166 ?NobelPrize .
  ?NobelPrize ps:P166/wdt:P279* ?Category ;
              ps:P166/rdfs:label ?NPLabel ;
              pq:P585 ?When ;
              filter (lang(?NPLabel) = "en" && YEAR(?When) = ?Year) .
  OPTIONAL { ?Person wdt:P18 ?Picture . }
  OPTIONAL { ?NobelPrize pq:P2121 ?MoneyValue . }
  BIND(CONCAT(STR(?MoneyValue), " Swedish krona") as ?Money)
  OPTIONAL { ?NobelPrize pq:P6208 ?Motivation filter (lang(?Motivation) = "en") . }
  SERVICE wikibase:label {
    bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en" .
  }
} ORDER BY ?Motivation

Comparativo com JSON-LD

Enquanto o JSON-LD (JavaScript Object Notation for Linked Data) busca manter a semântica de triplas (Linked Data) e um objeto context para facilitar uma posterior conversão em modelos RDF, o projeto RAMOSE optou por retornar os dados em JSON com formatação livre.

É possível retornar somente as propriedades desejadas de uma query, a partir de modificações no atributo field_type do arquivo de configuração. Também é possível aplicar filtros de pré-processamento e pós-processamento no retorno da query SPARQL. Essa liberdade para modelagem da API pode ser benéfica para fins de manutenção e criação de uma especificação OpenAPI.