我正在尝试自定义 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>
:实际需要查询的数据
所以我重复我的问题,为什么当我将第二个 FROM 子句排除在 SPARQL 查询之外时,我会得到正确的结果?仅供参考,我一直在使用推理类型 SL。
在@user1538695 回答后编辑
当我在模式(TBox)中保留规则时,我仍然需要添加FROM <tag:stardog:api:context:default>
我的查询。我只想查询一个命名图并使用模式进行推理。如果不必明确提及默认图(模式),这难道不是可能的吗?这是我当前查询的样子:
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 .
}