標準偏差を計算するカスタム集計関数を 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 モデルのようなものはないため、クエリで指定する必要はありません。ここで良いアプローチは何でしょうか?
私の質問は 2 つあります。Stardog でクエリが異なる方法で解析されるのはなぜですか。また、Jena にカスタムの Stardog 集計関数を検出させることは可能ですか? ありがとう!
アップデート
最後に、私たちが達成しようとしているのは、指定された名前付きグラフに対して構成クエリを実行することですが、新しく構築されたトリプルを別のグラフに書き込みます。私の Jena の例では、これを実現するために 2 つの 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);
}