Feature support¶
Legend: ✅ supported · ⚠️ partial or gated · ❌ unsupported.
The pinned SHACL 1.0 suite and reporting procedure are described in Run the W3C SHACL suite. Test results cover the cases in that suite; the feature descriptions below also identify extension-specific limits.
SHACL Core¶
Feature |
Status |
Notes |
|---|---|---|
Node & property shapes |
✅ |
|
Targets — |
✅ |
|
Cardinality — |
✅ |
|
Value type — |
✅ |
|
Range — |
✅ |
numeric, date/time, and duration ordering |
String — |
✅ |
|
Logical — |
✅ |
|
Shape-based — |
✅ |
|
Property pairs — |
✅ |
on node and property shapes |
Other — |
✅ |
|
Paths — predicate, inverse, sequence, alternative, |
✅ |
|
|
✅ |
SHACL-SPARQL¶
Feature |
Status |
Notes |
|---|---|---|
SPARQL constraints — |
✅ |
native execution with Spareval fallback |
Custom constraint components — |
✅ |
optional params, simple and complex |
SHACL-AF (Advanced Features)¶
Feature |
Status |
Notes |
|---|---|---|
Rules — |
✅ |
forward-chained to a fixed point, honouring |
Node expressions — |
✅ |
|
SPARQL targets — |
✅ |
|
Expression constraints — |
✅ |
|
SHACL functions — |
✅ |
full data-graph access |
SHACL functions — |
⚠️ |
evaluated as pure functions of their arguments; a body that reads the data graph is gated — see Partial support |
JavaScript — |
❌ |
no JS engine |
Recursion and semantics¶
Feature |
Status |
Notes |
|---|---|---|
Stratified recursive shapes |
✅ |
greatest fixed point for validation, least for inference, per stratum |
Non-stratifiable schemas (a cycle through negation) |
❌ |
diagnosed and refused, never guessed |
See Recursive shapes for the recursion policy.
Partial support¶
A ⚠️ feature has partial support and may produce incorrect results.
on_unsupported controls how these features are handled. It is set through
EngineOptions in Rust, and a keyword on
validate, validate_algebra, infer, and PreparedValidator in
Python:
"ignore"Best effort. A graph-reading function called from a SPARQL context is evaluated over an empty dataset, so the result may be wrong.
"error"(default)Refuse. The unsupported construct surfaces as a failure instead of a silent wrong answer.
conforms, report, text = shifty.validate(data, shapes, on_unsupported="error")
Invalid shapes diagnostics are separate from this policy. A malformed SHACL constraint or rule, including malformed SPARQL or an unresolved query prefix, is always rejected before validation or inference starts; it is never lowered as an absent feature.
Use "error" when an unsupported feature should stop validation.
Evidence and repair coverage¶
Structural explanations are not always available: a sh:sparql constraint is opaque to evidence and
blocked for repair, because an arbitrary query cannot be inverted. The complete
list of these cases is in Evidence reference under “Opaque and blocked evidence”,
and repair’s blocking reasons are in Repair reference.