1

我正在尝试使用 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. 使用以下方法,在加载模型时以及使用 SPARQL 添加新的三元组时执行 OWL 推理。另一方面,不可能创建一个新的命名图(如果我尝试这样做,我会收到一条错误消息,指出不支持此操作: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 实现。确实可以在命名图或“基础”图中添加新的三元组。另一方面,正如 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 .

测试数据.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

我见过用 Fuseki、TDB 和命名图进行推理吗?但问题更多的是关于 Fuseki TDB 和 Fuseki 的“汇编器”接口。我认为这个问题部分相关,但它没有为我的问题提供答案(这似乎更“基本”)。我还在 Jena 邮件列表上看到了线程Persisting named graphs in TDB with jena-fuseki,它部分地谈到了这个问题,但更面向 TDB 中命名图的持久性。

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

4

1 回答 1

0

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

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

final Dataset ds = DatasetFactory.create(m);

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

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

(使用 Jena 3.14 测试)

于 2021-04-20T17:09:46.620 回答