Recuperar triplas acessadas

25 views
Skip to first unread message

Vinicius Pires de Moura Freire

unread,
Dec 8, 2011, 11:34:07 AM12/8/11
to linke...@googlegroups.com
Ola Pessoal,

Estou com uma duvida de implementação. Alguém sabe se existe alguma função para recuperar as triplas acessadas por uma query utilizando o Jena ARQ? Por exemplo, na query:


quando eu executo QueryExecutionFactory.sparqlService(serviceURI, query).execSelect() eu consigo retornar os valores para as variáveis ?city e ?latd, mas eu estou interessado em todas triplas correspondentes ao resultado, ou seja, o que não eh variável também. Voces conhecem alguma função no Jena ARQ que possa me dar essa informação?

--
Vinicius Pires de Moura Freire

David Araujo

unread,
Dec 8, 2011, 11:38:23 AM12/8/11
to linke...@googlegroups.com
Acho que aqui nesse link tem algo a respeito disso. Espero que ajude.

att,
--
David Araújo
Abreu
Bacharel em Análise de Sistemas
Mestrando em Ciência da Computação - UFC
Advanced Research in Database - ARIDA
http://www.lia.ufc.br/~araujodavid/

Helio Rodrigues

unread,
Dec 8, 2011, 12:41:10 PM12/8/11
to linke...@googlegroups.com
Olá, se você todas as triplas relacionadas a estas variaveis, basta restruturar a consulta de forma a retornar as variaveis tanto no suj quanto no objeto da tripla.

Ou você pode usar API do LDSpider, um crawler semantico, que da pra recuperar todas as triplas com o recurso desejado.

-- 
Hélio Rodrigues
BSc in Computer Science - UFC
MSc Student at Center of Informatics (CIn) - UFPE
Collaborator of DBpedia Portuguese
Skype: helio_rodrigues1
Gtalk: soulraz

Regis Pires Magalhães

unread,
Dec 8, 2011, 12:47:51 PM12/8/11
to linke...@googlegroups.com
Vinicius,
A meu ver, uma solução possível para obter essas triplas seria usando CONSTRUCT:

CONSTRUCT { 


Abraços,
Regis.


2011/12/8 Helio Rodrigues <sou...@gmail.com>

Regis Pires Magalhães

unread,
Dec 8, 2011, 12:59:46 PM12/8/11
to linke...@googlegroups.com
Ao usar o CONSTRUCT na DBpedia podemos diretamente obter a tripla em vários formatos.
Em anexo as triplas resultantes de sua consulta em formato NTriples...

Abraços,
Regis.


2011/12/8 Regis Pires Magalhães <regisp...@gmail.com>
result.nt

Vinicius Pires de Moura Freire

unread,
Dec 8, 2011, 1:06:16 PM12/8/11
to linke...@googlegroups.com
Obrigado a todos,

Regis, acho que eh isso mesmo. Então eu posso substituir o select pelo construct colocando sempre o que esta dentro do where apos o construct e ele vai me retornar as triplas, correto?

Obrigado,
Vinicius
--
Vinícius

Regis Pires Magalhães

unread,
Dec 8, 2011, 1:10:17 PM12/8/11
to linke...@googlegroups.com
Sim, sendo que o CONSTRUCT faz muito mais. Ele permite, por exemplo, manipular as triplas até para "criar" triplas que não estão na RDF Store.

Abraços,
Regis.


2011/12/8 Vinicius Pires de Moura Freire <vini...@gmail.com>

Vinicius Pires de Moura Freire

unread,
Dec 8, 2011, 6:15:29 PM12/8/11
to linke...@googlegroups.com
Obrigado Regis,

Funcionou, ao final o codigo para resolver minha duvida (utilizando construct ao invés de select) ficou da seguinte forma:


QueryExecution qe = QueryExecutionFactory.sparqlService(serviceURI, query);
             Model model = qe.execConstruct();
             StmtIterator statements = model.listStatements();
             Statement statement;
             
             for (int i = 0; statements.hasNext(); i++) {
statement = statements.next();
System.out.println(statement.getSubject() + " " + statement.getPredicate() + " " + statement.getObject());
}

Assim ele retorna justamente as triplas acessadas.
Obrigado a todos.

Abraços,
Vinicius

--
Vinícius

Percy Enrique Rivera Salas

unread,
Dec 8, 2011, 6:38:12 PM12/8/11
to linke...@googlegroups.com, linke...@googlegroups.com
Isso funciona mas vc poderia ter utilizado de qualquer forma o select, o Construct é muito utilizado de fato mas quando vc consulta diretamente sparql endpoint para poder criar arquivos.

[]'s

Percy

Vinicius Pires de Moura Freire

unread,
Dec 8, 2011, 7:19:11 PM12/8/11
to linke...@googlegroups.com
Eu continuo usando os select, mas estou transformando eles em construct, basicamente da seguinte forma:

// retorna os patterns da query na forma { ?a ?b ?c }
Element pattern = querySelect.getQueryPattern();     
String queryConstruct = prefixos + "CONSTRUCT "+ pattern + " WHERE " + pattern;

Por enquanto esta dando certo, não testei para muitos casos, mas espero a solução esteja no caminho certo.

Abraços,
Vinicius


2011/12/8 Percy Enrique Rivera Salas <priver...@gmail.com>



--
Vinícius

Percy Enrique Rivera Salas

unread,
Dec 8, 2011, 8:08:19 PM12/8/11
to linke...@googlegroups.com
Segue query com SELECT

String queryString=
            "PREFIX"+
            "SELECT ?s ?p ?o WHERE{ ?s ?p ?o. }";

            Query query = QueryFactory.create(queryString,Syntax.syntaxARQ);

            QueryExecution qexec = QueryExecutionFactory.sparqlService(URI_ENDPOINT, query);
 try {
                    ResultSet results = qexec.execSelect();
                    for ( ; results.hasNext() ; )
                    {
                        cont++;
                        QuerySolution soln = results.nextSolution() ;
                        RDFNode s = soln.get("s");
                        RDFNode p = soln.get("p");
                        RDFNode o = soln.get("o");  
                        out.write(s.toString()+","+p.toString()+","+o.toString()+"\n");
                    }
      } finally { qexec.close() ; }

[]'s

Percy

Vinicius Pires de Moura Freire

unread,
Dec 8, 2011, 9:17:07 PM12/8/11
to linke...@googlegroups.com
Obrigado Percy,

O Problema dessa forma eh que eu preciso recuperar a tripla a partir das variaveis, e nem sempre eu terei um select com as variaveis sujeito, predicado e objeto, por exemplo no select do exemplo dado nos emails anteriores acho que nao da pra recuperar as triplas dessa forma, pois eu soh tenho as variáveis city e latd, e tambem acredito que nao recuperaria as constantes que fazem parte dela.

Abraços,
--
Vinícius

Percy Enrique Rivera Salas

unread,
Dec 8, 2011, 9:36:20 PM12/8/11
to linke...@googlegroups.com
Vincius,

SELECT ?s <http://dbpedia.org/property/subdivisionName> as ?p <http://dbpedia.org/resource/Brazil> as ?o
WHERE
{.....}


[]'s

Percy

2011/12/9 Vinicius Pires de Moura Freire <vini...@gmail.com>

Regis Pires Magalhães

unread,
Dec 9, 2011, 5:29:20 AM12/9/11
to linke...@googlegroups.com
Percy,
Fiquei curioso para saber como ficaria o SELECT completo.
A questão é que há um join envolvido.
Ou seja, nem todas as triplas são no formato que você está sugerindo no exemplo que você deu.
Você poderia escrever o SELECT completo para eu entender melhor como funcionaria?

Abraços,
Regis.

Percy Enrique Rivera Salas

unread,
Dec 9, 2011, 5:45:10 AM12/9/11
to linke...@googlegroups.com
Regis,

No caso que a query tenha mais de um nivel do tipo.

?s ?p ?o;
a ?type
 
uma solução com SELECT seria


de ai vc manipularia com as variaveis da forma

RDFNode s = soln.get("s");
                        RDFNode p = soln.get("p");
                        RDFNode o = soln.get("o");  

                        RDFNode p2 = soln.get("p2");
                        RDFNode o2 = soln.get("o2");  

 //primeira tripla                      
out.write(s.toString()+","+p.toString()+","+o.toString()+"\n");

//segunda tripla
out.write(s.toString()+","+p2.toString()+","+o2.toString()+"\n");

desta forma vc poderia controlar melhor as variaveis porque manipulando atraves do CONSTRUCT
vc perde um pouco o "Controle" (Porque vc teria que reconhecer se a tripla retornada é a par ou a impar)
=)

System.out.println(statement.
getSubject() + " " + statement.getPredicate() + " " + statement.getObject());

[]'s

Percy

2011/12/9 Regis Pires Magalhães <regisp...@gmail.com>

Regis Pires Magalhães

unread,
Dec 9, 2011, 6:15:49 AM12/9/11
to linke...@googlegroups.com
Percy,
Só não entendi se haveria necessidade de escrever <http://dbpedia.org/property/subdivisionNameas ?p no select já que isso acarretaria mais dados para serem transmitidos remotamente do Endpoint SPARQL para o cliente Jena.

Não poderíamos retirar essas partes fixas da projeção e incluí-las diretamente do código conforme o exemplo abaixo?


out.write(s.toString()+",<http://dbpedia.org/property/subdivisionName>,"+o.toString()+"\n");

ao invés de:

out.write(s.toString()+","+p.toString()+","+o.toString()+"\n");

Abraços,
Regis.


2011/12/9 Percy Enrique Rivera Salas <priver...@gmail.com>

Percy Enrique Rivera Salas

unread,
Dec 9, 2011, 6:39:09 AM12/9/11
to linke...@googlegroups.com, linke...@googlegroups.com
Corretisimo, eu só estava ilustrando que vc pode passar valores fixo com uma consulta sparql

[]'s

Percy

Helio Rodrigues

unread,
Dec 9, 2011, 7:44:56 AM12/9/11
to linke...@googlegroups.com
Regis, as vezes é mais pratico passar no select, pois nao tem que ficar alterando dentro do .write().
--
Hélio Rodrigues
Computer Science - UFC
Reply all
Reply to author
Forward
0 new messages