OWL 2 RL (Rule Language) is one of four OWL 2 profiles designed for production use with rule-based reasoning engines. It's defined by the W3C in the OWL 2 Profiles specification as a set of rules (Tables 4–9) that can be implemented via forward-chaining materialization.
Unlike OWL 2 DL (which requires expensive tableau algorithms), OWL 2 RL rules operate in polynomial time and can handle millions of triples.
The W3C OWL 2 RL specification defines rules across six tables:
Rules for owl:sameAs — symmetry, transitivity, and replacement in triples.
owl:sameAs
eq-sym
a sameAs b
b sameAs a
eq-trans
b sameAs c
a sameAs c
eq-rep-s/p/o
Rules for class membership, intersections, unions, and restrictions.
cls-int1
x type (A ∩ B)
x type A
x type B
cls-int2
cls-uni
A ∪ B
x type (A ∪ B)
cls-svf1
includesProduct some Product
cls-svf2
cls-avf
reportsTo only Employee
cls-hv1/2
cls-com
Rules for subClassOf, equivalentClass, and disjointWith.
cax-sco
cax-eqc1/2
cax-dw
cax-adc
Rules for inverseOf, property chains, and property characteristics.
prp-inv1/2
manages inverseOf reportsTo
prp-spo2
boughtProduct
prp-symp
p(a,b)
p(b,a)
prp-trp
p(b,c)
p(a,c)
prp-fp
p(x,y1)
p(x,y2)
y1 sameAs y2
prp-ifp
p(x1,y)
p(x2,y)
x1 sameAs x2
Datatype-specific rules (XSD facets, data ranges). These are partially supported — cardinality counting for datatypes is limited.
The "meta-level" rules that operate on the ontology structure itself.
scm-sco
scm-eqc1/2
scm-spo
scm-eqp1/2
scm-dom1/2
scm-rng1/2
scm-int/uni/svf/avf
These constructs are silently ignored by OWL 2 RL reasoners:
owl:oneOf
owl:AsymmetricProperty
owl:IrreflexiveProperty
This is why we removed AsymmetricProperty, IrreflexiveProperty, and hasKey from the Northwind ontology — they're invisible to production reasoning engines.
AsymmetricProperty
IrreflexiveProperty
hasKey
RDF Studio uses a SPARQL-based materializer that executes OWL 2 RL rules as INSERT WHERE queries running natively in Oxigraph's Rust engine. It:
Architecture: 1. Clear inferred graph 2. Run 8 schema-level rules (scm-sco, scm-spo, scm-eqc, etc.) 3. Run 11 instance-level rules (cax-sco, prp-inv1, cls-svf1, etc.) 4. Repeat until no new triples are inferred 5. Store results in dedicated inferred graph
On the LUBM-10 benchmark (1.3M triples), this approach materializes 496,381 inferred triples in ~40 seconds — while the pure Python alternative (owlrl) never finished after 30+ minutes on the same dataset.