Stardog 自定义聚合函数在耶拿不可用

Stardog custom aggregate function unavailable in Jena

我在 Stardog 中创建了一个自定义聚合函数来计算标准差。当您 post 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 验证器抛出异常:

Non-group key variable in SELECT: ?age in expression (?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);
}

Non-group key variable in SELECT: ?age in expression (?age)

Stardog 对规范的解释是否不同,或者这是一个 我不知道的功能?

我认为您没有正确阅读规范,验证器可能只是无法识别非内置聚合。规范说:

19.8 Grammar

… Aggregate functions can be one of the built-in keywords for aggregates or a custom aggregate, which is syntactically a function call. Aggregate functions may only be used in SELECT, HAVING and ORDER BY clauses.

关于构造查询:

Another problem, we're using a custom aggregate function (stdev) in a CONSTRUCT query and again that seems to be working fine via the Stardog API's. Most of our code though is based on Jena, and it doesn't seem to recognize the custom stdev function.

你没有提到你是如何使用它的。要在构造模式中使用聚合,您需要使用子查询。例如,类似于:

construct { ?s :hasStandardDeviation ?stddev }
where {{
  select ?s (agg:stddev(?value) as ?stddev) {
    ?s :hasSampleValue ?value 
  }
  group by ?s
}}

中有一些这样的例子。当然,如果验证器拒绝第一个,它可能也会拒绝第二个,但它 看起来 它实际上应该是合法的。使用 Jena,您可能需要确保您 select 一种允许扩展的查询语言,但由于规范允许自定义函数(当由 IRI 标识时),我认为您应该能够使用标准SPARQL 1.1 语言。您使用的是 SPARQL 1.1 而不是早期的 SPARQL 规范,对吗?

除非安装自定义聚合,否则解析器不知道它是一个聚合。 Apache Jena ARQ 默认没有自定义聚合。

按 URI 聚合看起来像一个普通的自定义函数。因此,如果您尚未安装该聚合,解析器会将其视为自定义函数。

AVG 强制进行隐式分组,因此自定义函数位于非组键变量上,这是非法的。

错误的可能原因

Non-group key variable in SELECT: ?age in expression (?age)

SPARQL 验证器和 ARQ 是否不知道 agg:stardog:stdev 是一个聚合并且不会那样解释它。正如 AndyS 所指出的,语法与标准投影表达式(例如 (?x + ?y as ?sum))没有什么不同。

虽然 SPARQL 规范并未完全排除自定义聚合,但语法本身并未考虑到它们。 Stardog 和 Jena 都允许自定义聚合,尽管方式不同。

Another problem, we're using a custom aggregate function (stdev) in a CONSTRUCT query and again that seems to be working fine via the Stardog API's. Most of our code though is based on Jena, and it doesn't seem to recognize the custom stdev fuction. I guess because this extension is only Stardog related and unavailable for Jena?

是的,Jena 和 Stardog 是不同的。您在 Stardog 中定义的任何自定义内容(例如自定义聚合)都不能直接在 Jena 中使用。

您构建模型的方式可能是 Jena 通过 ARQ 成为查询引擎,而不是 Stardog。这可以解释为什么您会收到 Jena 不知道您在 Stardog 中定义的自定义聚合的异常。

There's nothing like a Jena model that represents a part of the database so that we can avoid specifying it in the query. What would be a good approach here?

您可以使用 dataset

通过 SNARL API 以编程方式指定查询的活动图

So my question is twofold: why are queries parsed differently in Stardog and is it possible to have Jena detect the custom Stardog aggregate functions? Thanks!

它们的解析方式不同,因为没有定义自定义聚合的标准方法,而 Stardog 和 Jena 选择以不同方式实现它。此外,Jena 不会知道 Stardog 的自定义聚合,反之亦然。