Jena UpdateFactory

时间:2012-04-02 16:16:25

标签: jena arq

我想知道是否可以使用ARQ Op对象在Jena中创建SPARQL UpdateRequest。我有兴趣以这样的方式创建程序更新:

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

通过在ARQ API的DELETE,INSERT和WHERE子句中创建模式。  到目前为止,我发现创建SPARQL更新请求的唯一方法是解析SPARQL字符串或创建 com.hp.hpl.jena.update.Update 对象(使用QuadAcc对象)找不到使用的例子。

我担心SPARQL UPDATE请求和SPARQL SELECT查询之一的管理是分开的,并且ARQ不能用于动态“汇编”查询。

提前致谢

2 个答案:

答案 0 :(得分:1)

这个问题也让我感到烦恼。我想从UpdateRequest个对象和ElementGroup对象组成ElementTriplesBlock。这是用于构造Query的两个主要类。例如:

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邮件列表并收到了这个答案:

  

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

答案 1 :(得分:0)

我自己没有尝试过,但看起来创建Update对象并将它们组装成UpdateRequest确实是可行的方法。

经过简短的介绍,QuadAcc似乎并不特别困难,只需使用包含变量的三元组addTriple()

UpdateModify的{​​{1}}子类看起来特别有趣,它对应于示例中的Update模式。不幸的是,DELETE … INSERT … WHERE子句初始化为WHERE(查询部分的句法表示)而不是Element(代数表示)。