Help needed to get equivalentClass and intersectionOf inferences working

I am evaluating virtual graph functionalities Stardog with a simple proof of concept ontology and a single MySQL database table. I have managed to write a mapping in SMS2 (Stardog Studio cloud does not seem to accept R2RML files exported from Protege) to map the data, which appears to be mostly correct, however my inferencing does not appear to as I would expect, which makes me suspect there being parts of the axiom that is not covered by the reasoner. In the equivalentClass axiom below, should Stardog's SL reasoner be able to handle this, or would I need a reasoner that can handle OWL DL?

The data model is a simple systems control process, wherein process hasEvent event instances and event hasCode code. The inference is simply to classify FailedProcess as process having events with the code "OFF".

### http://www.semanticweb.org/huylenguyen/ontologies/2025/5/uncommanded_v3#FailedProcess
umc:FailedProcess rdf:type owl:Class ;
  owl:equivalentClass [
    owl:intersectionOf (
      umc:ControlProcess
      [
        rdf:type owl:Restriction ;
        owl:onProperty umc:hasEvent ;
        owl:someValuesFrom [
          owl:intersectionOf (
            umc:OperatingEvent
            [
              rdf:type owl:Restriction ;
              owl:onProperty umc:hasCode ;
              owl:someValuesFrom [
                owl:intersectionOf (
                  umc:OperatingCode
                  [
                    rdf:type owl:Restriction ;
                    owl:onProperty umc:hasText ;
                    owl:hasValue "OFF"
                  ]
                ) ;
                rdf:type owl:Class
              ]
            ]
          ) ;
          rdf:type owl:Class
        ]
      ]
    ) ;
    rdf:type owl:Class
  ] .

Additionally to the above query, I am seeing something strange in the SMS2 mapping process, where there are duplicate entities with the same IRI. I was under the impression that in the SPARQL mapping, IRIs are unique and should always refer to the same entity. Is this not the case with Stardog? the mappings worked fine in Ontop.

Please note the docs at Advanced Reasoning Features | Stardog Documentation Latest

You can write the equivalent Stardog Rule as follows.

prefix umc: <urn:yourNamespace> 

IF {
  ?process a umc:ControlProcess ;
           umc:hasEvent ?event .

  ?event a umc:OperatingEvent ;
         umc:hasCode ?code .

  ?code a umc:OperatingCode ;
        umc:hasText "OFF" .
}
THEN {
  ?process a umc:FailedProcess .
}

The rule can be written with the Rule Builder in Designer as

and in Explorer we can see the appropriate Control Processes classified as FailedProcess

Huy,

It would be great to see the SMS2 file and sample data.

Stardog doesn’t create the IRIs per se. I mean Stardog doesn’t decide the IRIs. Stardog only follows the template rule and uses the rule and the data to generate an IRI.

BIND(TEMPLATE("urn:{ID}") AS ?ID_iri) # read value in {ID} column and append to urn:

If the ID column has value 1234 then the IRI will be urn:1234

It would be great to see the mapping and sample data that is causing the problem