我在Stardog中创建了一个自定义聚合函数,用于计算标准差。当您将SPARQL查询发布到端点或通过管理控制台中的查询面板发布时,这非常有用。
到目前为止,一切都很好,但是我们面临着两个问题。首先,当我们执行如下查询时,它将通过Stardog完美执行,但在the SPARQL validator中(以及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);
}
最佳答案
错误的可能原因
SELECT中的非组键变量:表达式中的?age(?age)
是SPARQL验证器和ARQ是否不知道agg:stardog:stdev
是聚合,并且不以这种方式解释它。如AndyS所指出的,语法与诸如(?x + ?y as ?sum)
的标准投影表达式没有区别。
尽管SPARQL规范并未完全排除自定义聚合,但语法本身并未考虑它们。 Stardog和Jena都允许自定义聚合,尽管以不同的方式。
另一个问题是,我们在CONSTRUCT查询中使用了一个自定义聚合函数(stdev),这似乎又可以通过Stardog API正常工作。尽管我们的大多数代码都基于Jena,但似乎无法识别自定义stdev功能。我猜是因为此扩展仅与Stardog相关,Jena无法使用?
是的,Jena和Stardog截然不同。您在Stardog中定义的任何自定义内容(例如自定义聚合)都无法直接在Jena中使用。
您可能以这样的方式构建模型,即Jena通过ARQ是与Stardog相对的查询引擎。这可以解释为什么您会收到杰娜不知道的关于您在Stardog中定义的自定义聚合的异常。
没有什么像Jena模型那样代表数据库的一部分,因此我们可以避免在查询中指定它。什么是这里的好方法?
您可以使用dataset通过SNARL API以编程方式指定查询的活动图
所以我的问题是双重的:为什么在Stardog中查询的解析方式不同,并且Jena是否有可能检测到自定义的Stardog聚合函数?谢谢!
它们的解析方式不同,因为没有定义自定义聚合的标准方法,而Stardog&Jena选择以不同的方式实现它。此外,Jena不会知道Stardog的自定义聚合,反之亦然。