我正在尝试使用 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);
我试过的:
- 使用以下方法,在加载模型时以及使用 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 .
测试数据.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 推理?可能吗 ?我错过了什么吗?