Virtuoso OpenLink Reasoning: backward or/and forward


I’m looking for some technical information about the type of reasoning supported in virtuoso: backward or /and forward.

In some articles, I find that Virtuoso already supports both modes but in the official documentation “SPARQL and Scalable Inference on Demand
By Orri Erling and Ivan Mikhailov” It is indicated that the combination of the two modes is planned for the future.

Could you please give me some detailed information about the support of these modes and the exactly RDF/OWL axioms considered by Virtuoso for inference.

Thinks in advance.

I presume you are referring to this Virtuoso SPARQL and Scalable Inference on Demand paper, which is more than a decade old.

Virtuoso supports both backward (materialised at runtime/demand) and forward (pre materialised in storage) chained reasoning in SPARQL queries, which it has done for over a decade.

Here are links to documentation on Virtuoso’s built-in Inferencing and reasoning and custom inferencing using the SPIN vocabulary. Note that SHACL constraint validation support will also be in the upcoming Virtuoso commercial release.

Dear Williams,

Thank you very much for your answers.

I am conducting a comparative study between Virtuoso and other relational RDF management systems in order to be used later in a real application case. However, I has difficulty finding detailed and up-to-date technical information about query processing and reasoning in virtuoso.

The mechanism described in the official documentation details that reasoning is based on the concept of rule sets. In this case, as outlined no query rewriting (expanding) is required as the graph of the rule is copied in the input data and the system iterates over sub-classes (at run-time) (is this correct for the actual version?)

I find that the combination of backward and forward chaining is a distinction with the other systems. However, In which cases each type is used?

Also, How the materialization in bulk-load and query time can be activated because by default it is not. (by demand… how this is possible?)

Thanks again for you help.

@beli: The Virtuoso built-in (rule sets) and custom inferencing and reasoning is backward chaining, where the inferred results are materialised at query runtime. This results in fewer physical triples having to exist in the database, saving space and ultimately cost of ownership, i.e., less physical resources are required, compared to forward chaining where the inferred data is pre-generated as physical triples, requiring more physical resources for hosting the data.

Materialization during bulk load is not supported in Virtuoso, and materialisation required would have to be done post bulk load with a SPARQL INSERT query to generate and insert the required triples.

Hi @beli,

You can use SPARQL INSERTs with relevant inference rules (built-in and/or custom) enabled to achieve that goal. Basically, this is bulk-forward-chained inference.