2012-04-02 2 views
1

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

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

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

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

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

ответ

0

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

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

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

+0

Привет, спасибо за ответ. Вопрос, который меня горит, - это определение объекта UPDATE, отличающегося от SELECT, что невозможно было обнаружить мост из операции ARQ? – GCorrendo

+0

... хотя бы частичный мост. – GCorrendo

1

Этот вопрос также сожгли меня. Я хотел составить 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 данные, следовательно, использованием QuadAcc а не Элемент для части INSERT/DELETE обновления.

В конце концов я реализовал это с помощью 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();