2012-03-15 38 views
7

Estoy tratando de construir una pequeña aplicación web semántica usando Jena framework, JSP y JAVA. Tengo un punto final SPARQL remoto y ya he escrito una consulta simple que funciona bien pero ahora necesito usar algunos parámetros. Aquí está mi código hasta ahora:Consulta SPARQL parametrizada 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(); 
} 

Lo que quiero hacer es parametrizar? Nombre. Soy nuevo en Jena y no estoy seguro de cómo usar los parámetros en una consulta SPARQL. Agradecería que alguien pudiera ayudarme con esto.

+0

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

+0

@sandra ¿Alguna de estas respuestas terminó trabajando para usted? Si lo hizo, debe aceptarlo para que los demás sepan que fue útil. –

Respuesta

6

Si solo desea restringir una variable para que tenga un cierto valor para las consultas locales, puede hacerlo con una sobrecarga del método QueryFactory.create() que toma un QuerySolutionMap para establecer las restricciones de valores. Tenga en cuenta que esto no altera su consulta, solo restringe los resultados finales, por lo que no se trata de la parametrización.

Si realmente quiere tener verdaderas consultas parametrizadas (es decir, variables sustitutivas para constantes), entonces hay un par de maneras de hacerlo dependiendo de su versión de ARQ.

Usando cualquier versión actual (hasta 2.9.0) la única forma de hacerlo es concatenación de cadenas, es decir, en lugar de tener? Nombre en su consulta, simplemente inserta el valor que desea, p. "Bob"

Usando la última troncal (2.9.1-SNAPSHOT en adelante) hay una nueva clase ParameterizedSparqlString que hace que esto sea mucho más amigable para el usuario, por ej.

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

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

Y, de hecho, se puede simplificar el código aún más desde ParameterizedSparqlString tiene una interfaz de estilo StringBuffer y se puede utilizar para construir su consulta poco a poco e incluye funcionalidades útiles como prefijos anteponiendo a su consulta.

La ventaja de este nuevo método es que proporciona una forma más genérica de realizar consultas parametrizadas que también se pueden usar con actualizaciones y se puede usar para preparar consultas remotas que los métodos existentes no cubren.

+0

Gracias Rob intentaré lo que sugirió. Lo que pretendo hacer es obtener una entrada del usuario, por ej. un nombre y pasar este valor a? nombre en mi consulta. ¿Existe algún otro marco que ofrezca esta función o, en general, es mejor usarlo que el marco de Jena? – sandra

+1

Probablemente pueda hacer lo mismo con Sesame pero no conozco los detalles, qué marco es mejor para usted dependerá de qué tipo de cosas necesite hacer. Si tiene más preguntas que no están directamente relacionadas con esta respuesta, por favor haga preguntas nuevas en el sitio para que sean más visibles. – RobV

2

Puede probar buscando en Twinkql. Es un marco de mapeo de SPARQL a Java. Utiliza Jena en el back-end, pero intenta simplificar las consultas SPARQL y el enlace Java de los resultados.

Se le permite definir consultas SPARQL en 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> 

Nota del marcador de posición #{novelName} - aquí es donde los parámetros se pueden pasar en al momento de la consulta.

Asimismo, los resultados se pueden unir 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> 

Existe una API para llamar a estas consultas, para pasar en los parámetros, etc. Es muy parecido a MyBatis, pero para SPARQL en lugar de SQL.

Cuestiones relacionadas