Fuseki owl reasoner not working with TDB

2019-08-11 23:50发布

问题:

This is my configuration file

# Licensed under the terms of http://www.apache.org/licenses/LICENSE-2.0

## Fuseki Server configuration file.

@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 ja:      <http://jena.hpl.hp.com/2005/11/Assembler#> .
@prefix tdb:     <http://jena.hpl.hp.com/2008/tdb#> .

[] rdf:type fuseki:Server ;
    fuseki:services (
        <#service1>
    )
.

# TDB
tdb:DatasetTDB  rdfs:subClassOf  ja:RDFDataset .
tdb:GraphTDB    rdfs:subClassOf  ja:Model .

[] ja:loadClass "com.hp.hpl.jena.tdb.TDB" .

<#service1> rdf:type fuseki:Service ;
fuseki:name                       "rs" ;       # http://host:port/ds
fuseki:serviceQuery               "sparql" ;   # SPARQL query service
fuseki:serviceQuery               "query" ;    # SPARQL query service (alt name)
fuseki:serviceUpdate              "update" ;   # SPARQL update service
fuseki:serviceUpload              "upload" ;   # Non-SPARQL upload service
fuseki:serviceReadWriteGraphStore "data" ;     # SPARQL Graph store protocol (read and write)
# A separate read-only graph store endpoint:
fuseki:serviceReadGraphStore      "get" ;      # SPARQL Graph store protocol (read only)
fuseki:dataset                   <#dataset> ;
.


<#dataset> rdf:type      tdb:DatasetTDB ;
    tdb:location "RS" ;
    ja:defaultGraph       <#model_inf> ;
.


<#model_inf> a ja:InfModel ;
    ja:baseModel <#tdbGraph> ;
    ja:reasoner [
    ja:reasonerURL <http://jena.hpl.hp.com/2003/OWLFBRuleReasoner>]
.


<#tdbGraph> rdf:type tdb:GraphTDB ;
    tdb:dataset <#RSDataSet> .

<#RSDataSet> rdf:type  tdb:DatasetTDB ;
    tdb:location "RS" ;
    tdb:unionDefaultGraph true ;
.

when I run fuseki (2.3) I can see my data set which uses TDB (not in memeory) I can upload my rdf triple, and even when i close fuseki and re open it, the triples are there, but the reaoner is not working

this is my data

@prefix : <http://example.org/rs#>
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>

:A   rdfs:subClassOf :B .
:B   rdfs:subClassOf :C .
:i  a   :A .

when i do this query

select * where {
:i a ?e
}

I get just :A where i should have gotten :B and :C

whats wrong in my configuration please?

回答1:

I guess you might not load the configuration file correctly, when you run the fuseki. Did you explicitly ask fuseki to use your configuration file?

I have my fuseki running well with reasoning capability, by following the instruction in this tutorial (http://krr.cs.vu.nl/wp-content/uploads/2013/09/protege-fuseki-yasgui-manual.pdf). Check the page 3, and I hope you would solve your problem.



回答2:

This line

<#dataset> rdf:type      tdb:DatasetTDB ;

says it's TDB database but that isn't what is needed. You need a ja:RDFDataset to contain the inf graph that uses TDB as it's base data.

(needs testing)

<#dataset> rdf:type       ja:RDFDataset ;
    ja:defaultGraph       <#model_inf> ;
    .


回答3:

Not being familiar with the specifics of Fuseki, I'd bet you need to explicitly invoke an inference engine on an OWL or RDFS profile. Once that is completed you should see the entailments you want. OTOH, there is a common SPARQL query that will get the same entailed results:

SELECT ?e
WHERE {
   :i a ?cls .
   ?cls rdfs:subClassOf* ?e .
}

Or, more compactly using property paths:

SELECT ?e
WHERE {
   :i rdf:type/rdfs:subClassOf* ?e .
}