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.
Apresentar algumas formas de usar Fuseki.
Para cada tutorial:
- Entendê-lo;
- Partindo de uma nova instalação de Fuseki, carregar o que for requisito, apresentando o que motiva o requisito;
- Apresentar o estado com requisito satisfeito;
- Apresentar a execução;
- Apresentar o resultado da execução.
- 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.
Este corresponde ao tutorial 5.
- Iniciar Fuseki;
- Acessar o servidor com um browser, acessando o endereço
localhost:3030
- Criar um dataset, clicando em
manage Datasets
,add new Dataset
; - Baixar o arquivo vc-db-1.rdf das referências;
- Fazer upload do arquivo no Fuseki;
- Verificar, abrindo para edição;
- Neste exemplo o dataset foi criado em memória. Os dados não persistem quando Fuseki for fechado.
SELECT ?subject ?predicate ?object
WHERE {
?subject ?predicate ?object
}
LIMIT 25
- Clicar no triângulo no canto superior direito da caixa de texto para executar a consulta;
- 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
PREFIX dc: <http://purl.org/dc/elements/1.1/>
INSERT DATA
{
<http://example/book1> dc:title "A new book" ;
dc:creator "A.N.Other" .
}
- Clicar no triângulo no canto superior direito da caixa de texto para executar a consulta;
- Resultou em bad request Ver o resultado;
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
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.
- Ler RDF para carregar alguma informação;
- Abrir um novo terminal e executar
curl -X POST -d "query=select ?s where { ?s ?p ?o . }" localhost:3030/mydataset/query
- 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:~$
nota: composição de Fazer uma consulta SPARQL UPDATE usando curl e POST com a especulação sobre POST
- Ler RDF para carregar alguma informação;
- 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
- 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
- Na interface de controle do servidor Fuseki, criar um novo dataset. Neste exemplo chama-se
MeuSSN
. - Abrir um novo terminal e executar
curl -X POST -d 'update= LOAD <http://purl.org/dc/elements/1.1/> ' localhost:3030/MeuSSN/update
- 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
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.
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.
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 é:
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.
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
Referências:
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: /fuseki/testeFabio/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": { .....