【问题标题】:Reasoning when adding new triples in a named graph in Jena Fuseki在 Jena Fuseki 的命名图中添加新三元组时的推理
【发布时间】:2020-06-17 21:02:31
【问题描述】:

我正在尝试使用 Jena Fuseki 的 API 创建一个使用 OWL 模型的 FusekiServer,包裹在 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 .

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 的“汇编器”接口。我认为这个问题部分相关,但它没有为我的问题提供答案(这似乎更“基本”)。 我还在 Jena 邮件列表上看到了线程 Persisting named graphs in TDB with jena-fuseki,它部分谈到了这个问题,但更倾向于 TDB 中命名图的持久性。

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

【问题讨论】:

    标签: jena owl fuseki reasoning named-graphs


    【解决方案1】:

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

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

    final Dataset ds = DatasetFactory.create(m);
    

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

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

    (使用 Jena 3.14 测试)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多