1

我想知道是否可以使用 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 不能用于动态“组装”查询。

提前致谢

4

2 回答 2

1

这个问题也让我很头疼。我想UpdateRequestElementGroup对象和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 数据流,因此在更新的 INSERT/DELETE 部分使用 QuadAcc 而不是 Element。

最终我使用一个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();
于 2015-05-21T10:03:27.983 回答
0

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

看了一会,QuadAcc似乎不是特别难,只要addTriple()和包含变量的三元组一起使用就可以了。

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

于 2012-04-03T05:48:11.180 回答