3

カスタム Stardog ルールを試しています。カスタム ルールは基本的に次のようになります。

@prefix rule: <tag:stardog:api:rule:> .
[] a rule:SPARQLRule ;
  rule:content """
PREFIX : <http://url/draft#>
IF {
      ?x a :Person; :has_yob ?yob.
      BIND (2014 - ?yob AS ?age)
   }
THEN {
      ?x :has_age ?age
}
""" .

次の Java コードを含むこの ttl ファイルをアップロードしました。

final Connection conn = ConnectionConfiguration.to("db_name").server("snarl").connect();
conn.begin();
conn.add().io().context(new URIImpl("http://url/rules")).file(ttlFile);
conn.commit();

ルールを別のグラフに保持したいので、ルールのトリプルをhttp://url/rulesグラフにロードしました。tag:stardog:api:context:defaultStardog で表されるデフォルトのグラフには、オントロジーの公理が含まれています。次の SPARQL クエリを使用すると、Stardog ルールが期待どおりに機能します。

PREFIX : <http://url/draft#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

SELECT ?s ?age
FROM <tag:stardog:api:context:default> 
FROM <http://url/rules>
FROM NAMED <http://url/datasource>
WHERE {
  ?s rdf:type :Person .
  ?s :has_age ?age .
}

おそらく、今では何が問題なのか疑問に思っているでしょう。FROM 句と FROM NAMED 句の理解が間違っていると思います。クエリをFROM <http://url/rules>除外すると、クエリからの結果は期待できません。それでも、元のクエリと同じように結果が得られます。これはどのように可能ですか?これらの条項について、私は次のように考えています。

  • FROM <tag:stardog:api:context:default>: デフォルトのグラフのオントロジー公理を使用します
  • FROM <http://url/rules>: この特定のクエリでルールを使用します
  • FROM NAMED <http://url/datasource>: クエリが必要な実際のデータ

SPARQL クエリから 2 番目の FROM 句を除外すると、正しい結果が得られるのはなぜですか? 参考までに、私はいつも推理系SLを使っています。

@ user1538695の回答後に編集

スキーマ (TBox) にルールを永続化する場合でもFROM <tag:stardog:api:context:default>、クエリを追加する必要があります。名前付きグラフを 1 つだけクエリし、推論のためにスキーマを使用したい。これは、デフォルトのグラフ (スキーマ) を明示的に言及しなくても可能ではないでしょうか? これは私の現在のクエリがどのように見えるかです:

PREFIX : <http://url/draft#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

SELECT ?s ?age
FROM <tag:stardog:api:context:default> 
FROM <http://url/datasource>
WHERE {
  ?s rdf:type :Person .
  ?s :has_age ?age .
}
4

1 に答える 1