我想知道是否可以使用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不能用于动态“汇编”查询。
提前致谢
答案 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
(代数表示)。