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

标签 java sparql jena stardog

我在 Stardog 中创建了一个自定义聚合函数来计算标准差。当您将 SPARQL 查询发布到端点或通过管理控制台中的查询面板时,这非常有用。

到目前为止,一切顺利,但我们面临一些问题。首先,当我们执行如下查询时,它会通过Stardog完美执行,但会在 the SPARQL validator 中失败。 (以及耶拿 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 validator 抛出异常:

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

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

另一个问题是,我们在 CONSTRUCT 查询中使用自定义聚合函数 (stdev),并且通过 Stardog API 似乎也可以正常工作。我们的大部分代码都是基于 Jena,并且它似乎无法识别自定义的 stdev 函数。我猜是因为这个扩展仅与 Stardog 相关并且不适用于耶拿?让我举个例子。 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)

SPARQL validator 和 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 以编程方式指定查询的 Activity 图

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

关于java - Stardog 自定义聚合函数在耶拿不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35849008/

相关文章:

java - 如何获取ArrayList中记录的信息?

java - 尝试在 ActionListener 中调用的方法中抛出异常

java - 正在调用 struts.xml 中定义的操作,并且不会调用 Action 包中存在的操作

java - 通过 EL 以人类可读的格式打印 Duration

java - 如何将 JENA Sparql 查询结果集保存为 JSON?

regex - SPARQL 正则表达式过滤器

java - 如何使用 Apache Jena Java API 创建 Fuseki SPARQL 服务器?

SPARQL 将 "."替换为 "_"

java - 在 TDB Triple Store 中加载 RDF 三元组时出错

java - 导致空字段的 Jena TDB 插入语句