Feature support¶
Legend: ✅ supported · ⚠️ partial / gated · ❌ unsupported.
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-AF (Advanced Features)¶
Feature |
Status |
Notes |
|---|---|---|
Rules — |
✅ |
forward-chained to a fixed point with |
Node expressions — |
✅ |
|
SPARQL targets — |
✅ |
|
SPARQL constraints — |
✅ |
native execution with Spareval fallback |
Custom constraint components — |
✅ |
optional params, simple & complex |
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 below) |
JavaScript — |
❌ |
no JS engine |
Recursion & semantics¶
Feature |
Status |
Notes |
|---|---|---|
Stratified recursive shapes |
✅ |
gfp validation / lfp inference per stratum |
Non-stratifiable schemas (cycle through negation) |
❌ |
diagnosed and refused, never guessed |
Feature-handling policy¶
Partially supported features are handled per an on_unsupported setting
(EngineOptions in Rust; the on_unsupported= keyword on
validate / validate_algebra / infer and PreparedValidator in
Python):
"ignore"(default) — best-effort: e.g. a graph-reading function called from a SPARQL context is evaluated over an empty dataset (result may be unreliable)."error"— fail loudly: the unsupported construct is refused so the failure surfaces (e.g. as a constraint error) instead of a silent wrong answer.
conforms, report, text = shifty.validate(data, shapes, on_unsupported="error")