OpenShift 上的 Fuseki:可以更新但不能 SELECT
Fuseki on OpenShift: Can UPDATE but not SELECT
我已经在 OpenShift 上安装了 Jena Fuseki 服务器。
--config services.ttl
配置文件如下图
我观察到的是:
如果我从控制面板执行 SPARQL 更新,我会得到 Update Succeeded
并且某些 TDB 文件在服务器上确实发生了变化(在 ./app-root/data/DB/
中)。
然而,当我在控制面板中再次执行 SPARQL 查询(例如 SELECT ?s ?p ?o WHERE { ?s ?p ?o. }
)时,我得到了零个语句。这个 GET 请求也是如此:
http://<obfuscated>.rhcloud.com/ds/query?query=SELECT+%3Fs+%3Fp+%3Fo+WHERE+{+%3Fs+%3Fp+%3Fo.+}&output=text&stylesheet=
OpenShift 上的日志文件包含以下条目:
INFO [24] GET http://<obfuscated>.rhcloud.com/ds/query?query=SELECT+%3Fs+%3Fp+%3Fo+WHERE+{+%3Fs+%3Fp+%3Fo.+}+&output=text&stylesheet=
INFO [24] Query = SELECT ?s ?p ?o WHERE { ?s ?p ?o. }
INFO [24] exec/select
INFO [24] 200 OK (2 ms)
所以看起来好像 RDF 语句可以写入 TDB 但不能检索。如果我在 Fuseki 的本地安装上尝试相同的问题,问题就不会出现。
我还能做些什么来诊断和解决 OpenShift 上 Fuseki 的这个问题?
UPDATE 显然,如果我将语句插入到命名图形(不是默认图形)中,问题就不会出现。
@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 (
<#service>
) .
[] ja:loadClass "com.hp.hpl.jena.tdb.TDB" .
tdb:DatasetTDB rdfs:subClassOf ja:RDFDataset .
tdb:GraphTDB rdfs:subClassOf ja:Model .
<#service> a fuseki:Service ;
fuseki:name "ds" ;
fuseki:serviceQuery "sparql" ;
fuseki:serviceQuery "query" ;
fuseki:serviceUpdate "update" ;
fuseki:serviceUpload "upload" ;
fuseki:serviceReadWriteGraphStore "data" ;
fuseki:dataset <#dataset> ;
.
<#dataset> a tdb:DatasetTDB ;
tdb:location "../data/DB" ;
tdb:unionDefaultGraph true ;
.
tdb:unionDefaultGraph true
原来是罪魁祸首。来自 documentation:
An assembler can specify that the default graph for query is the union
of the named graphs. This is done by adding tdb:unionDefaultGraph.
因为这没有提到默认图作为并集的一部分,我猜这个配置除了命名图的并集之外没有默认图,因此没有命名图的更新被忽略。
使用替代配置 tdb:unionDefaultGraph false
。
描述的问题消失了
我已经在 OpenShift 上安装了 Jena Fuseki 服务器。
--config services.ttl
配置文件如下图
我观察到的是:
如果我从控制面板执行 SPARQL 更新,我会得到 Update Succeeded
并且某些 TDB 文件在服务器上确实发生了变化(在 ./app-root/data/DB/
中)。
然而,当我在控制面板中再次执行 SPARQL 查询(例如 SELECT ?s ?p ?o WHERE { ?s ?p ?o. }
)时,我得到了零个语句。这个 GET 请求也是如此:
http://<obfuscated>.rhcloud.com/ds/query?query=SELECT+%3Fs+%3Fp+%3Fo+WHERE+{+%3Fs+%3Fp+%3Fo.+}&output=text&stylesheet=
OpenShift 上的日志文件包含以下条目:
INFO [24] GET http://<obfuscated>.rhcloud.com/ds/query?query=SELECT+%3Fs+%3Fp+%3Fo+WHERE+{+%3Fs+%3Fp+%3Fo.+}+&output=text&stylesheet=
INFO [24] Query = SELECT ?s ?p ?o WHERE { ?s ?p ?o. }
INFO [24] exec/select
INFO [24] 200 OK (2 ms)
所以看起来好像 RDF 语句可以写入 TDB 但不能检索。如果我在 Fuseki 的本地安装上尝试相同的问题,问题就不会出现。
我还能做些什么来诊断和解决 OpenShift 上 Fuseki 的这个问题?
UPDATE 显然,如果我将语句插入到命名图形(不是默认图形)中,问题就不会出现。
@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 (
<#service>
) .
[] ja:loadClass "com.hp.hpl.jena.tdb.TDB" .
tdb:DatasetTDB rdfs:subClassOf ja:RDFDataset .
tdb:GraphTDB rdfs:subClassOf ja:Model .
<#service> a fuseki:Service ;
fuseki:name "ds" ;
fuseki:serviceQuery "sparql" ;
fuseki:serviceQuery "query" ;
fuseki:serviceUpdate "update" ;
fuseki:serviceUpload "upload" ;
fuseki:serviceReadWriteGraphStore "data" ;
fuseki:dataset <#dataset> ;
.
<#dataset> a tdb:DatasetTDB ;
tdb:location "../data/DB" ;
tdb:unionDefaultGraph true ;
.
tdb:unionDefaultGraph true
原来是罪魁祸首。来自 documentation:
An assembler can specify that the default graph for query is the union of the named graphs. This is done by adding tdb:unionDefaultGraph.
因为这没有提到默认图作为并集的一部分,我猜这个配置除了命名图的并集之外没有默认图,因此没有命名图的更新被忽略。
使用替代配置 tdb:unionDefaultGraph false
。