2012-04-02 72 views
1

我想知道是否有可能通过使用ARQ运算对象来创建SPARQL UpdateRequest在耶拿。我很想创造编程更新这样的:耶拿UpdateFactory

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

通过建立在DELETE,INSERT模式,并在从ARQ API条款。 到目前为止,我已经找到创建SPARQL更新请求的唯一途径需要分析一个SPARQL字符串或创建com.hp.hpl.jena.update.Update对象(使用QuadAcc对象进行我找不到使用的例子。

我担心的是SPARQL UPDATE请求的管理和SPARQL SELECT查询的一个预先

分离和ARQ不能使用“组装”查询的飞行。

谢谢

回答

0

我还没有尝试过这个自己,但它看起来像创建Update对象并将其组装成一个UpdateRequest的确是要走的路。

经过短暂的观察,QuadAcc似乎并不特别困难,只是使用与三元组包含变量。

UpdateModify子类的Update看起来特别有趣,它对应于您的示例DELETE … INSERT … WHERE模式。不幸的是,WHERE子句被初始化与Element(查询部分的句法表示),而不是一个Op(代数表示法)。

+0

您好,感谢答案。燃烧我的问题是,UPDATE对象的定义与SELECT不同,因此无法找到来自ARQ操作的网桥? – GCorrendo 2012-04-03 06:30:28

+0

...至少部分桥。 – GCorrendo 2012-04-03 07:44:07

1

这个问题也烧了我。我想从ElementGroup对象和ElementTriplesBlock对象组成一个UpdateRequest。这是用于构建查询的两个主要类。例如:

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

我尝试了耶拿邮件列表和收到这样的回答:

更新API的设计,因此处理流任意大 无限的插入和删除数据使用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();