カスタム 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:default
Stardog で表されるデフォルトのグラフには、オントロジーの公理が含まれています。次の 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 .
}