我想知道是否可以使用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.hpl.jena.Update.Update对象(它使用QuadAcc对象,我找不到使用示例。
我担心的是,SPARQLUPDATE请求的管理和SPARQLSELECT查询的管理是分开的,ARQ不能用于动态"组装"查询。
提前感谢
这个问题也让我很头疼。我想用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旨在处理任意大的流无限的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();
我自己还没有尝试过,但看起来创建Update
对象并将它们组装成UpdateRequest
确实是可行的。
简单看一下,QuadAcc
似乎并不特别困难,只需将addTriple()
与包含变量的三元组一起使用即可。
Update
的UpdateModify
子类看起来特别有趣,它对应于示例中的DELETE … INSERT … WHERE
模式。不幸的是,WHERE
子句是用Element
(查询部分的句法表示)而不是Op
(代数表示)初始化的。