我在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的自定义聚合,反之亦然。

08-25 14:13