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();

Reply via email to