Jena UpdateFactory

Мне было интересно, можно ли создать SPARQL UpdateRequest в Йене с помощью объектов ARQ Op. Мне было бы интересно создавать программные обновления следующим образом:

DELETE {?s :predicate <http://example.org#old> }    
INSERT {?s :predicate <http://example.org#toAdd>} 
WHERE  {?s :predicate <http://example.org#old> } 

путем создания шаблонов в предложениях DELETE, INSERT и WHERE из ARQ API. До сих пор единственным найденным мной способом создания запросов на обновление SPARQL является анализ строки SPARQL или создание объекта com.hp.hpl.jena.update.Update (который использует объекты QuadAcc, для которых я не нашел примеров использования.

Я опасаюсь, что управление запросами SPARQL UPDATE и одним из запросов SPARQL SELECT разделены и что ARQ нельзя использовать для «сборки» запросов на лету.

заранее спасибо


person GCorrendo    schedule 02.04.2012    source источник


Ответы (2)


Я не пробовал это сам, но похоже, что создание объектов Update и сборка их в UpdateRequest — это действительно правильный путь.

После беглого взгляда QuadAcc не кажется особенно сложным, просто используйте addTriple() с тройками, содержащими переменные.

Подкласс UpdateModify из Update выглядит особенно интересно, он соответствует шаблону DELETE … INSERT … WHERE в вашем примере. К сожалению, предложение WHERE инициализируется с помощью Element (синтаксическое представление части запроса), а не Op (алгебраическое представление).

person cygri    schedule 03.04.2012
comment
Привет, спасибо за ответ. Меня мучает вопрос: настолько ли определение объекта UPDATE отличается от SELECT, что не удается найти мост из операции ARQ? - person GCorrendo; 03.04.2012

Меня этот вопрос тоже обжег. Я хотел составить UpdateRequest из ElementGroup объектов и ElementTriplesBlock объектов. Это два основных класса, используемых для построения запроса. Например:

ElementGroup queryPattern = ...
ElementTriplesBlock constructTriples = ...

Query query = new Query();
query.setQueryConstructType();

// set CONSTRUCT clause
query.setConstructTemplate(new Template(constructTriples.getPattern()));

// set WHERE clause
query.setQueryPattern(queryPattern);

Я попробовал список рассылки Jena и получил такой ответ:

API обновления предназначен для потоковой передачи произвольно больших неограниченных данных INSERT и DELETE, поэтому для части INSERT/DELETE обновления используется QuadAcc, а не элемент.

В конце концов я реализовал это, используя ParametrizedSparqlString:

ElementGroup queryPattern = ...
ElementTriplesBlock deleteTriples = ...
ElementTriplesBlock insertTriples = ...

ParameterizedSparqlString qstring = new ParameterizedSparqlString();

// Set DELETE clause
qstring.append("DELETE {");
qstring.append(deleteTriples.toString());
qstring.append("}");

// Set INSERT clause
qstring.append("INSERT {");
qstring.append(insertTriples.toString());
qstring.append("}");

// Set WHERE clause
qstring.append("WHERE {");
qstring.append(queryPattern.toString());
qstring.append("}");

// Construct an update query
UpdateRequest request = qstring.asUpdate();
person mvdssel    schedule 21.05.2015