2012-03-15 15 views
7

Sto provando a creare una piccola applicazione web semantica usando Jena framework, JSP e JAVA. Ho un endpoint SPARQL remoto e ho già scritto una semplice query che funziona bene ma ora ho bisogno di usare alcuni parametri. Ecco il mio codice finora:Query SPARQL parametrizzata con JENA

final static String serviceEndpoint = "http://fishdelish.cs.man.ac.uk/sparql/"; 

String comNameQuery = 
     "PREFIX fd: <http://fishdelish.cs.man.ac.uk/rdf/vocab/resource/> " + 
     "SELECT ?name ?language ?type" + 
     "WHERE { ?nameID fd:comnames_ComName ?name ;" + 
     "fd:comnames_Language ?language ;" + 
     "fd:comnames_NameType ?type ." + 
     "}"; 

Query query = QueryFactory.create(comNameQuery); 
QueryExecution qe = QueryExecutionFactory.sparqlService(serviceEndpoint,query); 

try { 
    ResultSet rs = qe.execSelect(); 
    if (rs.hasNext()) { 
     System.out.println(ResultSetFormatter.asText(rs)); 
    } 
} 
catch(Exception e) { 
    System.out.println(e.getMessage()); 
} 
finally { 
    qe.close(); 
} 

Quello che voglio fare è parametrizzare? Nome. Sono nuovo di Jena e non sono sicuro di come usare i parametri in una query SPARQL. Lo apprezzerei se qualcuno potesse aiutarmi con questo.

+0

Duplicato su http://answers.semanticweb.com/questions/15237/parameterized-sparql-query-with-jena – RobV

+0

@sandra Una di queste risposte ha funzionato per te? Se lo facessi, dovresti accettarlo per far sapere agli altri che era utile. –

risposta

6

Se si desidera limitare una variabile per avere un determinato valore per le query locali, è possibile farlo con un sovraccarico del metodo QueryFactory.create() che accetta un valore QuerySolutionMap per impostare le restrizioni del valore. Nota che questo non altera la tua query limita solo i risultati finali, quindi questa non è realmente una parametrizzazione.

Se si desidera effettivamente avere query con parametri reali (ovvero variabili sostitutive per le costanti), in base alla propria versione di ARQ sono disponibili due metodi.

Utilizzando qualsiasi versione corrente (fino a 2.9.0), l'unico modo per farlo è la concatenazione delle stringhe, ovvero anziché inserire il nome nella query, basta inserire il valore desiderato ad es. "Bob"

Utilizzando il trunk più recente (2.9.1-SNAPSHOT in poi) c'è una nuova classe ParameterizedSparqlString che rende questo molto più user friendly, ad es.

ParameterizedSparqlString queryStr = new ParameterizedSparqlString(comNameQuery); 
queryStr.setLiteral("name", "Bob"); 

Query query = QueryFactory.create(queryStr.toString()); 

E infatti è possibile semplificare il codice ulteriormente dal ParameterizedSparqlString ha un'interfaccia stile StringBuffer e può essere utilizzato per costruire la vostra parte query bit e include funzionalità utili come anteponendo i prefissi alla tua richiesta.

Il vantaggio di questo nuovo metodo è che fornisce un modo più generico di eseguire query parametrizzate che possono essere utilizzate anche con gli aggiornamenti ed è utilizzabile per la preparazione di query remote che i metodi esistenti non coprono.

+0

Grazie Rob proverò ciò che hai suggerito. Quello che intendo fare è ottenere un input dall'utente per es. un nome e passare questo valore a? nome nella mia query. C'è qualche altro framework che offre questa funzione o è in generale migliore da usare rispetto al framework Jena? – sandra

+1

Probabilmente puoi fare la stessa cosa con Sesame ma non conosco i dettagli, il framework migliore per te dipenderà dal tipo di cose che devi fare. Se hai ulteriori domande non direttamente correlate a questa risposta, chiedi loro come nuove domande sul sito in modo che siano più visibili – RobV

2

Si può provare a esaminare Twinkql. È un framework di mappatura SPARQL-to-Java. Utilizza Jena nel back-end, ma cerca di semplificare le query SPARQL e l'associazione Java dei risultati.

Esso consente di definire le query SPARQL in xml:

<select id="getNovel" resultMap="novelResultMap"> 
<![CDATA[ 
    SELECT ?novel ?author 
    WHERE { 
     ?novel a <http://dbpedia.org/class/yago/EnglishNovels> ; 
      <http://dbpedia.org/property/name> "#{novelName}"@en ; 
      <http://dbpedia.org/property/author> ?author . 
    } 
]]> 
</select> 

Annotare il #{novelName} segnaposto - questo è dove i parametri possono essere passati in in fase di query.

Inoltre, i risultati possono essere associati a Java Beans:

<resultMap id="novelResultMap" resultClass="org.twinkql.example.Novel"> 
    <uniqueResult>novel</uniqueResult> 
    <rowMap var="novel" varType="localName" beanProperty="name" /> 
    <rowMap var="author" varType="localName" beanProperty="author"/> 
</resultMap> 

C'è un'API per chiamare queste query, passare nei parametri, ecc E 'molto simile a MyBatis, ma per SPARQL invece di SQL.

Problemi correlati