Skip to content

Latest commit

 

History

History
324 lines (243 loc) · 17.3 KB

AlgunsExemplosDeUsoDeFuseki.md

File metadata and controls

324 lines (243 loc) · 17.3 KB

Alguns exemplos de uso de Fuseki

Introdução

Os tutoriais da documentação de Jena a que me refiro são compostos por programas em Java que quando executados operam sobre uma base de conhecimento.

Há algumas formas de usar Fuseki que considero úteis, mas são parte, ou são requisitos, para executar, com Fuseki, os tutoriais da documentação de Jena.

Quando a forma de uso corresponder a um tutorial, sua execução será documentada aqui.

Objetivo

Apresentar algumas formas de usar Fuseki.

Método

Para cada tutorial:

  1. Entendê-lo;
  2. Partindo de uma nova instalação de Fuseki, carregar o que for requisito, apresentando o que motiva o requisito;
  3. Apresentar o estado com requisito satisfeito;
  4. Apresentar a execução;
  5. Apresentar o resultado da execução.
  6. Apresentar as referências;
  • Os requisitos podem ser outros tutoriais;
  • Os resultados podem ser apresentados em ordem diferente da presente nos tutoriais;
  • Não há compromisso que o procedimento apresentado seja único, mais rápido, mais curto ou qualquer outra característica além de ser suficientemente próximo do tutorial citado.

Referências

Tutoriais

Resultados

Ler RDF

Este corresponde ao tutorial 5.

  1. Iniciar Fuseki;
  2. Acessar o servidor com um browser, acessando o endereço localhost:3030
  3. Criar um dataset, clicando em manage Datasets, add new Dataset;
  4. Baixar o arquivo vc-db-1.rdf das referências;
  5. Fazer upload do arquivo no Fuseki;
  6. Verificar, abrindo para edição;
  • Neste exemplo o dataset foi criado em memória. Os dados não persistem quando Fuseki for fechado.

Referências

Tutorial 5

vc-db-1.rdf

Fazer uma consulta SPARQL SELECT

  1. Ler RDF para carregar alguma informação;
  2. Na aba query digitar a consulta:
SELECT ?subject ?predicate ?object
WHERE {
  ?subject ?predicate ?object
}
LIMIT 25
  1. Clicar no triângulo no canto superior direito da caixa de texto para executar a consulta;
  2. Ver o resultado;

É possível seguir o tutorial em https://jena.apache.org/tutorials/sparql_query1.html, copiando e colando a consulta contida em q1.rq

alt text

Fazer uma consulta SPARQL UPDATE

  1. Ler RDF para carregar alguma informação;
  2. Na aba query digitar a consulta:
PREFIX dc: <http://purl.org/dc/elements/1.1/>
INSERT DATA
{ 
  <http://example/book1> dc:title "A new book" ;
                         dc:creator "A.N.Other" .
}
  1. Clicar no triângulo no canto superior direito da caixa de texto para executar a consulta;
  2. Resultou em bad request Ver o resultado;

Comentários e conclusões

UPDATE não é possível usando somente o navegador (localhost:3030). Precisa de outra ferramenta (add-on, plugin) para gerar requisições POST.

A origem da consulta usada para teste é: https://www.w3.org/TR/sparql11-update/#example_1

A especulação sobre POST funcionar vem da tela de informação do Fuseki. Acessada pela tela info, reforçada pela postagem em stack overflow

Fazer uma consulta SPARQL SELECT usando curl e POST

nota: isto é um teste para ver se a 'receita' de Hector Correa usando CURL funciona.

Escolhi curl porque o add-on que pensei em instalar requer acesso à informação de todas as páginas que eu abrir. Acho isso excessivo.

  1. Ler RDF para carregar alguma informação;
  2. Abrir um novo terminal e executar curl -X POST -d "query=select ?s where { ?s ?p ?o . }" localhost:3030/mydataset/query
  3. Ver o resultado (abaixo)
fabio@fabio-13Z940-G-BK71P1:~$ curl -X POST -d "query=select ?s where { ?s ?p ?o . }" localhost:3030/datasetone/query
Error 404: Not Found
fabio@fabio-13Z940-G-BK71P1:~$ curl -X POST -d "query=select ?s where { ?s ?p ?o . }" localhost:3030/mydataset/query
{ "head": {
    "vars": [ "s" ]
  } ,
  "results": {
    "bindings": [
      { 
        "s": { "type": "uri" , "value": "http://somewhere/MattJones" }
      } ,
      { 
        "s": { "type": "uri" , "value": "http://somewhere/MattJones" }
      } ,
      { 
        "s": { "type": "bnode" , "value": "b0" }
      } ,
      { 
        "s": { "type": "bnode" , "value": "b0" }
      } ,
      { 
        "s": { "type": "uri" , "value": "http://somewhere/SarahJones" }
      } ,
      { 
        "s": { "type": "uri" , "value": "http://somewhere/SarahJones" }
      } ,
      { 
        "s": { "type": "uri" , "value": "http://somewhere/RebeccaSmith" }
      } ,
      { 
        "s": { "type": "uri" , "value": "http://somewhere/RebeccaSmith" }
      } ,
      { 
        "s": { "type": "bnode" , "value": "b1" }
      } ,
      { 
        "s": { "type": "bnode" , "value": "b1" }
      } ,
      { 
        "s": { "type": "bnode" , "value": "b2" }
      } ,
      { 
        "s": { "type": "bnode" , "value": "b2" }
      } ,
      { 
        "s": { "type": "bnode" , "value": "b3" }
      } ,
      { 
        "s": { "type": "bnode" , "value": "b3" }
      } ,
      { 
        "s": { "type": "uri" , "value": "http://somewhere/JohnSmith" }
      } ,
      { 
        "s": { "type": "uri" , "value": "http://somewhere/JohnSmith" }
      }
    ]
  }
}
fabio@fabio-13Z940-G-BK71P1:~$ 

Referências

Hector Correa

Fazer uma consulta SPARQL UPDATE usando curl e POST

nota: composição de Fazer uma consulta SPARQL UPDATE usando curl e POST com a especulação sobre POST

  1. Ler RDF para carregar alguma informação;
  2. Abrir um novo terminal e executar curl -X POST -d "query= PREFIX dc: <http://purl.org/dc/elements/1.1/> INSERT DATA { <http://example/book1> dc:title "A new book" ; dc:creator "A.N.Other" . } " localhost:3030/mydataset/update curl -X POST -d 'update= PREFIX dc: <http://purl.org/dc/elements/1.1/> INSERT DATA { <http://example/book1> dc:title "A new book" ; dc:creator "A.N.Other" . } ' localhost:3030/mydataset/update
  3. Ver o resultado (abaixo)
fabio@fabio-13Z940-G-BK71P1:~$ curl -X POST -d "query= PREFIX dc: <http://purl.org/dc/elements/1.1/> INSERT DATA { <http://example/book1> dc:title "A new book" ; dc:creator "A.N.Other" . } " localhost:3030/mydataset/update
curl: (6) Could not resolve host: new
curl: (3) unmatched close brace/bracket in URL position 31:
book ; dc:creator A.N.Other . } 
                              ^
fabio@fabio-13Z940-G-BK71P1:~$ curl -X POST -d 'query= PREFIX dc: <http://purl.org/dc/elements/1.1/> INSERT DATA { <http://example/book1> dc:title "A new book" ; dc:creator "A.N.Other" . } ' localhost:3030/mydataset/update
SPARQL Update: No 'update=' parameter

O primeiro erro foi uma questão de doublequotes dentro de doublequotes, resolvi trocando os doublequotes mais externos por singlequotes. O segundo erro tem a ver com o nome do parâmetro, tem que ser update. Correções feitas:

Terminal em que executei curl:

fabio@fabio-13Z940-G-BK71P1:~$ curl -X POST -d 'update= PREFIX dc: <http://purl.org/dc/elements/1.1/> INSERT DATA { <http://example/book1> dc:title "A new book" ; dc:creator "A.N.Other" . } ' localhost:3030/mydataset/update
<html>
<head>
</head>
<body>
<h1>Success</h1>
<p>
Update succeeded
</p>
</body>
</html>
fabio@fabio-13Z940-G-BK71P1:~$ 

tela com mensagens nos terminais

tela de edição do dataset com as triplas inseridas

Carregar uma ontologia com uma consulta SPARQL LOAD usando curl e POST

  1. Na interface de controle do servidor Fuseki, criar um novo dataset. Neste exemplo chama-se MeuSSN.
  2. Abrir um novo terminal e executar curl -X POST -d 'update= LOAD <http://purl.org/dc/elements/1.1/> ' localhost:3030/MeuSSN/update
  3. Ver o resultado (abaixo)

Terminal em que executei curl:

fabio@fabio-13Z940-G-BK71P1:~/Documentos/git/Gestao$ curl -X POST -d 'update= LOAD <http://purl.org/dc/elements/1.1/>  ' localhost:3030/MeuSSN/update
<html>
<head>
</head>
<body>
<h1>Success</h1>
<p>
Update succeeded
</p>
</body>
</html>

tela de edição do dataset com as triplas inseridas

Comentário

Tentei fazer esta operação pela interface web do Fuseki. Obtive bad request como resposta. Este comportamento é semelhante ao que ocorreu com UPDATE. Creio que consultas que modificam os grafos de conhecimento foram restritas a usar o método POST e nó update.

Usar a instalação de Fuseki para servir páginas HTML.

Precisei modificar o index.html da minha instalação de Fuseki para conseguir renderizar um XML específico. O navegador não permitia o acesso.

Isto permite usar javascript no navegador, o que pode ser bastante útil.

A pasta que contém as páginas é FUSEKI_HOME/webapp. Modifiquei o index.html, acrescentei uma pasta e, dentro dela, dois arquivos. Serviu as páginas conforme esperado.

Fazer uma consulta SPARQL SELECT da barra de endereçamento do navegador ié HTTP:GET.

Desta vez o servidor Fuseki está hospedado em VPS e foi implantado como um .war no Tomcat.

Aqui a requisição passa pelo navegador, pelo servidor http (Apache), pelo servidor jsp (Tomcat), pelo Fuseki, e volta na direção oposta, para a janela do navegador onde a resposta é renderizada.

Neste caminho, a mensagem é transformada - tem caracteres substituídos, para ser compatível com o protocolo de comunicação usado. MAS nem sempre faz tudo que precisa...

Se copiar e colar a linha abaixo na barra de endereço do navegador e der ENTER:

http://ip-50-62-81-50.ip.secureserver.net:8080/fuseki/testeFabio/query?query=select ?s where { ?s ?p ?o}

A resposta é:

HTTP Status 400 – Bad Request


Type Exception Report

Message Invalid character found in the request target [/fuseki/testeFabio/query?query=select%20?s%20where%20{%20?s%20?p%20?o}]. The valid characters are defined in RFC 7230 and RFC 3986

Description The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).

Exception

java.lang.IllegalArgumentException: Invalid character found in the request target [/fuseki/testeFabio/query?query=select%20?s%20where%20{%20?s%20?p%20?o}]. The valid characters are defined in RFC 7230 and RFC 3986
	org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:490)
	org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:261)
	org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
	org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893)
	org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1707)
	org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	java.lang.Thread.run(Thread.java:748)

Note The full stack trace of the root cause is available in the server logs.


Apache Tomcat/9.0.44

Levei um tempo até entender a mensagem de erro

The valid characters are defined in RFC 7230 and RFC 3986

e perceber que as chaves também não são caracteres válidos em uma requisição HTTP:GET (Além dos espaços, que são substituídos por %20 automaticamente pelo navegador. A linha para colar na barra de endereço ficou:

http://ip-50-62-81-50.ip.secureserver.net:8080/fuseki/testeFabio/query?query=select%20?s%20where%20%7b%20?s%20?p%20?o%20%7d

alt text

Referências:

https://stackoverflow.com/questions/54287922/the-valid-characters-are-defined-in-rfc-7230-and-rfc-3986

https://secure.n-able.com/webhelp/nc_9-1-0_so_en/content/sa_docs/api_level_integration/api_integration_urlencoding.html

Fazer uma consulta SPARQL SELECT com curl e GET

A linha abaixo dá erro 404. (pode ser que a requisição fique com formato diferente: não sei se -d coloca os dados na requisição no formato que espero.

curl -X GET -d "query=select ?s where { ?s ?p ?o . }" ip-50-62-81-50.ip.secureserver.net:8080/fuseki/testeFabio/query

A linha abaixo é executada e retorna o resultado da consulta.

curl -X GET ip-50-62-81-50.ip.secureserver.net:8080/fuseki/testeFabio/query?query=select%20?s%20where%7b?s%20?p%20?o%7d
fabio@fabio-13Z940-G-BK71P1:~$ curl -X GET -d "query=select ?s where { ?s ?p ?o . }" ip-50-62-81-50.ip.secureserver.net:8080/fuseki/testeFabio/query
<!doctype html><html lang="en"><head><title>HTTP Status 404 – Not Found</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 404 – Not Found</h1><hr class="line" /><p><b>Type</b> Status Report</p><p><b>Message</b> Service Description: &#47;fuseki&#47;testeFabio&#47;query</p><p><b>Description</b> The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.</p><hr class="line" /><h3>Apache Tomcat/9.0.44</h3></body></html>fabio@fabio-13Z940-G-BK71P1:~$ curl -X GET -d "query=select ?s where { ?s 
fabio@fabio-13Z940-G-BK71P1:~$ 
fabio@fabio-13Z940-G-BK71P1:~$ 
fabio@fabio-13Z940-G-BK71P1:~$ 
fabio@fabio-13Z940-G-BK71P1:~$ curl -X GET ip-50-62-81-50.ip.secureserver.net:8080/fuseki/testeFabio/query?query=select%20?s%20where%7b?s%20?p%20?o%7d
{
  "head": {
    "vars": [ "s" ]
  } ,
  "results": {
.....