0

標準偏差を計算するカスタム集計関数を 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);
}
4

3 に答える 3

2

エラーの考えられる原因

SELECT の非グループ キー変数: 式の ?age (?age)

SPARQLバリデーターとARQは、それagg:stardog:stdevが集合体であるとは考えておらず、そのように解釈していません。(?x + ?y as ?sum)AndyS が指摘したように、構文は などの標準的な射影式と同じです。

SPARQL 仕様はカスタム集計をまったく排除していませんが、文法自体では考慮されていません。方法は異なりますが、Stardog と Jena の両方でカスタム集計を使用できます。

別の問題として、CONSTRUCT クエリでカスタム集計関数 (stdev) を使用していますが、これも Stardog API を介して正常に機能しているようです。ただし、コードのほとんどは Jena に基づいており、カスタム stdev 機能を認識していないようです。この拡張機能は Stardog 関連のみであり、Jena では使用できないためでしょうか?

はい、ジェナとスタードッグは別物です。カスタム集計など、Stardog で定義したカスタムは、Jena では直接使用できません。

Stardog ではなく、ARQ を介して Jena がクエリ エンジンになるような方法でモデルを構築している可能性があります。これにより、Stardog 内で定義したカスタム集計について Jena が認識しないという例外が発生する理由が説明されます。

データベースの一部を表す Jena モデルのようなものはないため、クエリで指定する必要はありません。ここで良いアプローチは何でしょうか?

データセットを使用して、SNARL API を介してプログラムでクエリのアクティブ グラフを指定できます。

私の質問は 2 つあります。Stardog でクエリが異なる方法で解析されるのはなぜですか。また、Jena にカスタムの Stardog 集計関数を検出させることは可能ですか? ありがとう!

カスタム集計を定義する標準的な方法がなく、Stardog と Jena が別の方法で実装することを選択したため、それらは異なる方法で解析されます。さらに、Jena は Stardog のカスタム集計を認識せず、その逆も同様です。

于 2016-03-07T17:28:13.490 に答える
1

SELECT の非グループ キー変数: 式の ?age (?age)

Stardog は仕様を別の方法で解釈しますか? それとも、これは私が知らない機能ですか?

仕様を正しく読んでいると思いますが、おそらくバリデーターは非組み込み集計を認識していないだけだと思います。仕様は次のように述べています。

19.8 文法

… 集計関数は、集計またはカスタム集計の組み込みキーワードの 1 つにすることができます。これは、構文的には関数呼び出しです。集計関数は、SELECT、HAVING、および ORDER BY 句でのみ使用できます。

コンストラクトクエリに関して:

別の問題として、CONSTRUCT クエリでカスタム集計関数 (stdev) を使用していますが、これも Stardog API を介して正常に機能しているようです。ただし、コードのほとんどは Jena に基づいており、カスタム stdev 関数を認識していないようです。

これをどのように使用しているかについては言及していません。構成パターン内で集計を使用するには、サブクエリを使用する必要があります。たとえば、次のようなものです。

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

CONSTRUCT/WHERE の SPARQL 関数には、この例がいくつかあります 。もちろん、バリデータが最初のものを拒否した場合、おそらく2番目のものも拒否しますが、実際には合法であるように見えます. Jena では、拡張を許可するクエリ言語を選択する必要がある場合がありますが、仕様ではカスタム関数 (IRI によって識別される場合) が許可されているため、標準の SPARQL 1.1 言語を使用できるはずだと思います。以前の SPARQL 仕様ではなく、SPARQL 1.1 を使用していますよ?

于 2016-03-07T16:44:18.083 に答える
0

カスタム集計がインストールされていない限り、パーサーはそれが集計であることを認識しません。デフォルトでは、Apache Jena ARQ にはカスタム集計がありません。

URI による集計は、単純なカスタム関数のように見えます。したがって、その集計をインストールしていない場合、パーサーはそれをカスタム関数と見なします。

AVG は暗黙のグループ化を強制するため、カスタム関数は非グループ キー変数にあり、これは違法です。

于 2016-03-07T17:18:34.700 に答える