我在 Stardog 中创建了一个计算标准偏差的自定义聚合函数。当您将 SPARQL 查询发布到端点或通过管理控制台中的查询面板时,这非常有用。
到目前为止,一切都很好,但我们面临着一些问题。首先,当我们执行如下查询时,它将通过 Stardog 完美执行,但在SPARQL 验证器(以及 Jena API 也是)中会失败:
PREFIX : <http://our/namespace#>
PREFIX agg: <urn:aggregate:>
SELECT (agg:stardog:stdev(?age) AS ?stdLMD) (AVG(?age) AS ?avg)
WHERE {
?pat a :Person .
?pat :age ?age .
}
Stardog 给出了标准偏差和平均年龄的正确结果,但 SPARQL 验证器抛出异常:
SELECT 中的非组键变量:表达式中的 ?age (?age)
Stardog 是否以不同的方式解释规范,或者这是我不知道的功能?
另一个问题是,我们在 CONSTRUCT 查询中使用了自定义聚合函数 (stdev),而且通过 Stardog API 似乎可以正常工作。虽然我们的大部分代码都是基于 Jena 的,但它似乎无法识别自定义 stdev 功能。我猜是因为这个扩展只与 Stardog 相关并且对 Jena 不可用?让我举个例子。ATM,我们正在通过以下 Jena 代码执行 CONSTRUCT 查询:
final Query dbQuery = QueryFactory.create(query.getContent());
final QueryExecution queryExec = QueryExecutionFactory.create(dbQuery, model);
queryExec.execConstruct(infModel);
只要我们不使用聚合函数,这就像一个魅力。当我们在多个命名图中构建三元组时,拥有一个可用的模型(它代表一个命名图)非常方便。
我想用 Stardog java API 做一些类似的事情。我只做到了:
UpdateQuery dbQuery;
try {
dbQuery = connection.update(query.getContent());
dbQuery.execute();
} catch (final StardogException e) {
LOGGER.error("Cannot execute CONSTRUCT query", e);
}
问题是您明确需要在 CONSTRUCT 查询中指定要操作的命名图。没有什么能像 Jena 模型那样代表数据库的一部分,这样我们就可以避免在查询中指定它。这里有什么好的方法?
所以我的问题是双重的:为什么在 Stardog 中查询的解析方式不同,是否可以让 Jena 检测到自定义 Stardog 聚合函数?谢谢!
更新
最后,我们试图完成的是对给定的命名图执行构造查询,但将新构造的三元组写入不同的图。在我的 Jena 示例中,您可以看到我正在使用两个 Jena 模型来实现这一点。您将如何使用 SNARL API 做到这一点?我已经得到了以下代码片段,但这仅定义了将执行此查询的数据集,而不是三元组将被写入的位置。对此的任何帮助仍然值得赞赏!
UpdateQuery dbQuery;
try {
dbQuery = connection.update(query.getContent());
final DatasetImpl ds = new DatasetImpl();
ds.addNamedGraph(new URIImpl(infDatasource));
dbQuery.dataset(ds);
dbQuery.execute();
} catch (final StardogException e) {
LOGGER.error("Cannot execute CONSTRUCT query", e);
}