java - 触发 Stardog 规则的 SPARQL 查询

标签 java sparql triples stardog named-graphs

我正在尝试自定义 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 .
}

最佳答案

首先,对FROM NAMED 子句存在误解。 FROM NAMED 子句指定将用于匹配 GRAPH 子句中的图形模式的命名图形。如果您的查询没有 GRAPH 子句,则 FROM NAMED 将无效。

其次,Stardog 将规则视为模式的一部分,并且数据库的模式通过 reasoning.schema.graphs 数据库选项固定。无论您的查询使用什么 FROM 或 FROM NAMED 子句,所使用的模式公理和规则都是相同的。 FROM 或 FROM NAMED 子句将仅确定实例将从中匹配到查询的命名图。

最后,Stardog 2.x 中 reasoning.schema.graphs 的默认值是默认图(在 Stardog 3.0 中,默认值更改为所有图)因此命名图中的任何公理或规则都将被忽略,除非您更改此选项。但是还有 query.all.graphs 配置选项指示 Stardog 使用所有图的并集作为默认图。因此,使用 reasoning.schema.graphs=default 但更改 query.all.graphs 也会间接更改架构图。

根据此信息,如果您仍然没有得到预期的答案,您应该整理一个最小示例并将其发送到 Stardog 邮件列表。

关于java - 触发 Stardog 规则的 SPARQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29145032/

相关文章:

rdf - 选择(组合)多个属性值 - SPARQL/RDF

sparql - 使用命名图会影响检索查询结果的速度吗?

python - 使用 Python 处理时 sparql 查询中的错误

marklogic - SVC-CODEPOINT 将三元组加载到 MarkLogic 时出错

java - 使用 Hibernate 和多线程批量更新 DB2

java - 使用 keycloak 管理客户端以编程方式为具有 access-type public 的客户端创建用户

java "redundant"包装类?

java - 使用 FTPClient 传输 FTP 文件时出现错误

rdf - 将一个复杂的句子翻译成一组 SPO 三元组 (RDF)(可能需要具体化)

rdf - 如何从 SPARQL 中的术语列表中获取基本术语关联