In our graph we have :flow properties and need to distinguish different
kinds of flows, :flowA and :flowB.
We modelled this with in RDFS:
:flowA rdfs:subPropertyOf :flow
:flowB rdfs:subPropertyOf :flow
Some of our SPARQL queries use :flow+ and some use :flowA+, always from an
origin:
?origin :flowA+ :?result
or
?origin :flow+ :?result
If we start Fuseki *without* RDFS, the following queries finish in a second
or two:
?origin :flowA+ :?result
?origin :(flowA | :flowB)+ :?result
If we start Fuseki *with* RDFS, the following queries take about 85 seconds:
?origin :flowA+ :?result
?origin :flow+ :?result
What is causing this difference in performance? Are we missing something or
should we avoid RDFS for optimal performance? Any other alternatives?
Our overall process is:
1. Generate TTL files with :flowA and :flowB properties (not :flow other
than implied by rdfs:subPropertyOf)
2. Load with TDB2 loader
3. Start Fuseki (with RDSF vocabulary or not)
Here follows the code we use to start Fuseki.
Without RDFS:
*Dataset data = TDB2Factory.connectDataset(options.directory);*
FusekiServer server = FusekiServer.create()
.port(options.port)
.loopback(true)
*.addDataset(options.datasetName, data.asDatasetGraph())*
.addEndpoint(options.datasetName, "query", Operation.Query)
// shortestPath
.registerOperation(shortestPathOp, WebContent.contentTypeJSON,
new ShortestPathService())
.addEndpoint(options.datasetName, "shortestPath",
shortestPathOp)
// diagnostics
.verbose(true)
.enablePing(true)
.enableStats(true)
.enableMetrics(true)
.enableTasks(true)
.build();
// Start
server.start();
With RDFS:
*Dataset data = TDB2Factory.connectDataset(options.directory); Graph
vocabulary = RDFDataMgr.loadGraph(options.vocabularyFileName);
DatasetGraph dsg = RDFSFactory.datasetRDFS(data.asDatasetGraph(),
vocabulary);*
FusekiServer server = FusekiServer.create()
.port(options.port)
.loopback(true)
*.addDataset(options.datasetName,dsg)*
.addEndpoint(options.datasetName, "query", Operation.Query)
// shortestPath
.registerOperation(shortestPathOp, WebContent.contentTypeJSON,
new ShortestPathService())
.addEndpoint(options.datasetName, "shortestPath",
shortestPathOp)
// diagnostics
.verbose(true)
.enablePing(true)
.enableStats(true)
.enableMetrics(true)
.enableTasks(true)
.build();
// Start
server.start();