我正在尝试使用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);
我尝试过:
- 使用以下方法,在加载模型以及使用 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();
- 使用以下方法,在加载模型时执行 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
的事实.
我看过 Fuseki、TDB 和命名图的推理吗?但问题更多的是关于 Fuseki TDB 和 Fuseki 的"汇编器"接口。我认为这个问题部分相关,但它没有为我的问题提供答案(这似乎更"基本"(。 我还在 Jena 邮件列表中看到了 TDB 中持久化命名图和 jena-fuseki 的线程,它部分谈到了这个问题,但更倾向于 TDB 中命名图的持久性。
总结一下:如何使用Jena Fuseki编程API创建SPARQL端点,允许使用基础图和命名图概念,同时允许在添加新三元组时在运行时进行OWL推理?可能吗?我错过了什么吗?
尽管听起来很奇怪,但解决方案似乎只是简单地替换
final Dataset ds = DatasetFactory.create();
ds.setDefaultModel(m);
跟
final Dataset ds = DatasetFactory.create(m);
通过这样做,我得到了我想要的,即我可以向默认图添加新的三元组,并且新的OWL实现正确完成;我可以在这个数据集上成功地创建新的命名图。
我发现创建数据集的两种方式之间的行为差异有点令人困惑,但我希望这个答案对其他耶拿/Fuseki用户有用。
(使用耶拿 3.14 测试(