Параметризованный запрос SPARQL с JENA - PullRequest
7 голосов
/ 16 марта 2012

Я пытаюсь создать небольшое семантическое веб-приложение, используя инфраструктуру Jena, JSP и JAVA. У меня есть удаленная конечная точка SPARQL, и я уже написал простой запрос, который отлично работает, но теперь мне нужно использовать некоторые параметры. Вот мой код:

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();
}

То, что я хочу сделать, это параметризовать? Name. Я новичок в Jena, и я не совсем уверен, как использовать параметры в запросе SPARQL. Буду признателен, если кто-нибудь поможет мне с этим.

Ответы [ 2 ]

6 голосов
/ 16 марта 2012

Если вы просто хотите ограничить переменную определенным значением для локальных запросов, вы можете сделать это с перегрузкой метода QueryFactory.create(), который принимает QuerySolutionMap для установки ограничения значения. Обратите внимание, что это не меняет ваш запрос, а только ограничивает конечные результаты, так что на самом деле это не параметризация.

Если вы действительно хотите иметь истинно параметризованные запросы (то есть заменять переменные константами), то есть несколько способов сделать это в зависимости от вашей версии ARQ.

Используя любой текущий выпуск (до версии 2.9.0), единственный способ сделать это - конкатенация строк, то есть вместо того, чтобы иметь? Name в вашем запросе, вы просто вставите желаемое значение, например. "Боб"

Используя новейшую транк (начиная с 2.9.1-SNAPSHOT), существует новый класс ParameterizedSparqlString, который делает этот интерфейс более удобным для пользователя, например,

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

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

И на самом деле вы можете еще больше упростить свой код, поскольку ParameterizedSparqlString имеет интерфейс в стиле StringBuffer и может использоваться для построения вашего запроса по крупицам и включает полезные функции, такие как добавление префиксов к вашему запросу.

Преимущество этого нового метода заключается в том, что он предоставляет более общий способ выполнения параметризованных запросов, который также может использоваться с обновлениями и может использоваться для подготовки удаленных запросов, которые не охватываются существующими методами.

2 голосов
/ 05 июля 2012

Вы можете попробовать заглянуть в Twinkql . Это среда сопоставления SPARQL-Java. Он использует Jena в серверной части, но пытается упростить запросы SPARQL и привязку результатов Java.

Позволяет определять запросы SPARQL в 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>

Обратите внимание на заполнитель #{novelName} - здесь параметры могут быть переданы во время запроса.

Кроме того, результаты могут быть связаны с 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>

Существует API для вызова этих запросов, передачи параметров и т. Д. Это очень похоже на MyBatis , но для SPARQL вместо SQL.

...