我被迫将外部推理器 Pellet 包含在我的 Fuseki 服务器中。到目前为止,一切都很好,尽管我无法删除包含诸如字符串或整数之类的文字的三元组。我的设置:配置了 Pellet 2.3.1 作为推理器的 Fuseki 0.2.6。
最小示例配置:
@prefix : <#> .
@prefix fuseki: <http://jena.apache.org/fuseki#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix tdb: <http://jena.hpl.hp.com/2008/tdb#> .
@prefix ja: <http://jena.hpl.hp.com/2005/11/Assembler#> .
[] rdf:type fuseki:Server ;
fuseki:services (
<#mem>
) .
## ---------------------------------------------------------------
## Updatable in-memory dataset.
<#mem> rdf:type fuseki:Service ;
# URI of the dataset -- http://host:port/mem
fuseki:name "mem" ;
fuseki:serviceQuery "sparql" ;
fuseki:serviceQuery "query" ;
fuseki:serviceUpdate "update" ;
fuseki:serviceUpload "upload" ;
fuseki:serviceReadWriteGraphStore "data" ;
fuseki:serviceReadGraphStore "get" ;
fuseki:dataset <#emptyDataset> ;
.
## In-memory, initially empty.
<#emptyDataset> rdf:type ja:RDFDataset ;
ja:defaultGraph <#model_inf1> ;
.
<#model_inf1> rdfs:label "Inf-model" ;
ja:reasoner
[ ja:reasonerClass
"org.mindswap.pellet.jena.PelletReasonerFactory";]
.
内存中加载的最小 owl 文件:
<?xml version="1.0"?>
<!DOCTYPE rdf:RDF [
<!ENTITY owl "http://www.w3.org/2002/07/owl#" >
<!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
<!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
<!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
<!ENTITY test "http://www.semanticweb.org/ontologies/2014/9/test.owl#" >
]>
<rdf:RDF xmlns="http://www.semanticweb.org/ontologies/2014/9/test.owl#"
xml:base="http://www.semanticweb.org/ontologies/2014/9/test.owl"
xmlns:test="http://www.semanticweb.org/ontologies/2014/9/test.owl#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
<owl:Ontology rdf:about="http://www.semanticweb.org/ontologies/2014/9/test.owl"/>
<!--
///////////////////////////////////////////////////////////////////////////////////////
//
// Data properties
//
///////////////////////////////////////////////////////////////////////////////////////
-->
<!-- http://www.semanticweb.org/ontologies/2014/9/test.owl#hasAge -->
<owl:DatatypeProperty rdf:about="&test;hasAge">
<rdfs:domain rdf:resource="&test;human"/>
<rdfs:range rdf:resource="&xsd;integer"/>
</owl:DatatypeProperty>
<!-- http://www.semanticweb.org/ontologies/2014/9/test.owl#hasName -->
<owl:DatatypeProperty rdf:about="&test;hasName">
<rdfs:domain rdf:resource="&test;human"/>
<rdfs:range rdf:resource="&xsd;string"/>
</owl:DatatypeProperty>
<!--
///////////////////////////////////////////////////////////////////////////////////////
//
// Classes
//
///////////////////////////////////////////////////////////////////////////////////////
-->
<!-- http://www.semanticweb.org/ontologies/2014/9/test.owl#human -->
<owl:Class rdf:about="&test;human"/>
<!--
///////////////////////////////////////////////////////////////////////////////////////
//
// Individuals
//
///////////////////////////////////////////////////////////////////////////////////////
-->
<!-- http://www.semanticweb.org/ontologies/2014/9/test.owl#Alfred -->
<owl:NamedIndividual rdf:about="&test;Alfred">
<rdf:type rdf:resource="&test;human"/>
</owl:NamedIndividual>
</rdf:RDF>
我在本地主机上使用“--update”标志运行服务器,将“test.owl”上方加载到默认图形中,然后插入两个文字:
insert data {test:Alfred test:hasName "Alfred"^^xsd:string;
test:hasAge "43"^^xsd:integer .}
查询与“Alfred”链接的所有三元组显示,插入成功:
PREFIX test: <http://www.semanticweb.org/ontologies/2014/9/test.owl#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdfs: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
Select *
Where{test:Alfred ?p ?o}
--------------------------------------------------------------------------------------------
| p | o |
============================================================================================
| rdfs:type | test:human |
| rdfs:type | <http://www.w3.org/2002/07/owl#Thing> |
| <http://www.w3.org/2002/07/owl#sameAs> | test:Alfred |
| test:hasAge | 43 |
| test:hasName | "Alfred"^^xsd:string |
| rdfs:type | <http://www.w3.org/2002/07/owl#NamedIndividual> |
-------------------------------------------------------------------------------------------
然后我尝试删除 Alfred 的年龄和姓名:
delete data {test:Alfred test:hasAge "43"^^xsd:integer}
delete data {test:Alfred test:hasName "Alfred"^^xsd:string}
但无论我尝试哪种删除模式,都无法删除文字。我检查了 SPARQL 更新语法没有错误。可以毫无问题地插入和删除不包含任何文字的三元组。我认为颗粒插件可能会引发这种行为,因为所有删除操作都使用 fuseki 服务器使用其默认的 jena 推理器。升级到 Fuseki 1.1.1 不是一种选择,因为这似乎会导致颗粒显示错误的兼容性/可见性问题:
Error 500: tried to access field com.hp.hpl.jena.reasoner.BaseInfGraph.isPrepared from class org.mindswap.pellet.jena.PelletInfGraph
Fuseki - version 1.1.1 (Build date: 2014-10-02T16:36:17+0100)
我还尝试使用 TDB 数据库进行此操作,结果与我无法删除任何带有文字的三元组的结果相同。任何人都可以重现这种行为吗?有人知道解决方案或解决方法吗?我错过了什么吗?我会很感激任何提示。感谢您的支持和努力 - 迈克尔