在 Jena Fuseki 的命名图中添加新三元组时的推理

Reasoning when adding new triples in a named graph in Jena Fuseki

我正在尝试使用 Jena Fuseki 的 API 创建一个 FusekiServer 使用 OWL 模型,包裹在 Dataset.

我想在向此 Dataset 添加新的三元组(使用 SPARQL)时进行 OWL 推理,同时仍然能够创建命名图。

在我接下来的两个例子中,模型打开如下:

final Model m = ModelFactory.createOntologyModel(OntModelSpec.OWL_LITE_MEM_RULES_INF);
m.read(SparqlOwl.class.getResourceAsStream("/test_schema.ttl"), null, FileUtils.langTurtle);
m.read(SparqlOwl.class.getResourceAsStream("/test_data.ttl"), null, FileUtils.langTurtle);

我尝试过的:

  1. 使用以下方法,OWL 在加载模型时以及使用 SPARQL 添加新三元组时执行推理。另一方面,不可能创建一个新的命名图(如果我尝试这样做,我有一个错误说这个动作不受支持:java.lang.UnsupportedOperationException: DatasetGraphOne.add(named graph) 我从 Dataset 的方式理解已创建。)。
final Dataset ds = DatasetFactory.wrap(m);
FusekiServer server = FusekiServer.create()
        .add("/ds", ds, true)
        .build();
server.start();
  1. 使用以下方法,OWL 加载模型时执行实现。确实可以在命名图中或 "base" 图中添加新的三元组。另一方面,由于 OWL 模型所描述和预期的新推论,在添加新的三元组时不会进行(无论是添加到基础图中还是在命名图中)。
final Dataset ds = DatasetFactory.create();
ds.setDefaultModel(m);
FusekiServer server = FusekiServer.create()
        .add("/ds", ds, true)
        .build();
server.start();

示例中加载的两个文件是简单模型和一些示例个体如下:

test_schema.ttl:

@prefix ex: <http://example.com/> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@base <http://example.com> .


ex:Person  a  owl:Class .

ex:hasChild a owl:ObjectProperty ;
    rdfs:domain ex:Person ;
    rdfs:range ex:Person .

ex:hasParent a owl:ObjectProperty ;
    owl:inverseOf ex:hasChild .

test_data.ttl

@prefix ex: <http://example.com/> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@base <http://example.com> .

ex:John a owl:NamedIndividual .

ex:Marie a ex:Person ;
         ex:hasChild ex:John .

为了测试推理是否完成,我使用 SPARQL 插入的三元组只是像这样的东西:

ex:Alice ex:hasParent ex:Bob

为了看看他们是否都被推断出他们是 ex:Person

我看过 Reasoning with Fuseki, TDB and named graphs? 但问题更多是关于 Fuseki TDB 和 Fuseki 的 "assembler" 界面。我认为这个问题部分相关,但它没有为我的问题提供答案(这似乎更 "elementary")。 我还看到了 Jena 邮件列表上的线程 Persisting named graphs in TDB with jena-fuseki,它部分谈到了这个问题,但更倾向于 TDB 中命名图的持久性。

总结:如何使用 Jena Fuseki 编程创建 SPARQL 端点 API,允许使用基础图和命名图概念,同时允许 OWL 添加新的时在运行时发生推理三胞胎?可能吗 ?我错过了什么吗?

听起来很奇怪,解决方案似乎只是替换

final Dataset ds = DatasetFactory.create();
ds.setDefaultModel(m);

final Dataset ds = DatasetFactory.create(m);

通过这样做,我得到了我想要的,即我可以将新的三元组添加到默认图形,并且新的 OWL 实现已正确完成;我可以在此数据集上成功创建新的命名图。

我发现创建数据集的两种方式之间的行为差​​异有点令人困惑,但我希望这个答案对其他 Jena / Fuseki 用户有用。

(使用 Jena 3.14 测试)