Interoperability
The format covers the parts of RDFS and SHACL that describe a domain, not all of either. It is not RDF, not OWL: no triples, no IRIs, no inference. It is descriptive first: a model says what a domain looks like. Only part of what it says is enforced in the database.
The coverage tables name fields from the Properties, Relationships, Constraints and indexes and Extensions pages. Constructs with no native field travel in custom data. Each row gets one of these verdicts:
-
covered: maps to native fields.
-
partially covered: maps, with limits.
-
lossy: maps, but drops meaning.
-
carried: no native field. Travels in custom data.
-
different mechanism: met another way.
-
excluded: deliberately out.
-
n/a: not a construct of that vocabulary.
RDFS coverage
| Construct | Mapping | Verdict |
|---|---|---|
|
A node. Its |
covered |
|
A relationship when its range is a class, a
property when its range is a datatype. Nothing records which it came from: a
tool importing RDF decides. A property with several domains or ranges becomes one relationship entry per pair of
ends. RDFS joins them conjunctively. The per-pair entries do not carry that: the combination survives as the
identifier and |
covered |
|
The |
covered |
|
|
covered |
|
|
covered |
|
|
partially covered |
|
No hierarchy to traverse: a tool importing RDF flattens it into the |
covered |
|
No field on a node, relationship or property. Property hierarchies are excluded. |
excluded |
containers ( |
No field. The list types, such as
|
excluded |
cardinality, enums, patterns |
Not RDFS constructs, but native here: count, min_count and max_count on a relationship end. one_of and pattern on a property. |
n/a |
SHACL coverage
| Construct | Mapping | Verdict |
|---|---|---|
|
The type of a property, a Neo4j type rather than an xsd
datatype. |
covered |
|
one_of on a property of a node or relationship: a list of strings, so
non-string literals must be quoted. Mutually exclusive with |
partially covered |
|
pattern on a property: a single regex string, with flags such
as |
covered |
|
must_exist on a property: shorthand for an
|
covered |
|
count alone, or min_count with max_count, on a relationship end. Descriptive: not yet enforced in the database. |
covered |
|
A list type, such as |
lossy |
|
The |
covered |
|
The shape of the model itself: literals live under |
lossy |
|
|
lossy |
|
No native field. Rides custom data. The format has no severity concept. |
lossy |
|
No native field on a property: only |
carried |
|
No native field on a property. Rides custom
data. Not the length caps on the rules page: those bound the model’s own |
carried |
|
No native field. Rides custom data. Property values carry no language tags. |
carried |
|
No native field. Rides custom data. See Gaps and caveats. |
carried |
|
No dedicated field. Rides custom data. Approximate it with
|
carried |
|
No native field. Rides custom data. Neo4j is schema-optional: a closed world is enforcement policy, not ontology content. |
carried |
|
No native field. Rides custom data. The
nearest native field to styling is a node’s |
carried |
property paths (inverse) |
No field of its own: the |
different mechanism |
property paths (alternative/sequence) |
Not constraints in this format. Anything beyond a single hop rides custom data. |
carried |
|
No boolean composition: the
constraint types are only |
excluded |
SHACL-SPARQL constraints |
No SPARQL machinery. Raw text at best in custom data. |
excluded |
SHACL-AF rules/functions |
No field on the model, deliberately: rules and functions imply inference, which the format does not do. |
excluded |
Enforcement
A model is descriptive first. The libraries validate the model document itself, not the data in the database. The database enforces only what its schema can carry.
Enforced in the database:
-
The
identifierlabel of a node and thetypeof a relationship: they select what the constraints apply to. Theimpliedandoptionallabels are descriptive. -
must_exist,
uniqueandkeyon a property, and the constraints of a node or relationship: the four constraint types,EXISTS,UNIQUE,KEYandPROPERTY_TYPE.
Descriptive, not enforced:
Gaps and caveats
Gaps, likeliest to matter first:
-
Value ranges:
sh:minInclusive,sh:maxExclusiveand the rest. Plausible in regulated industries (ingredient classes, dosage ranges). No native field on a property. The route is an owner-defined validation object in custom data. -
String lengths:
sh:minLengthandsh:maxLength. Cheap to add on the same validation object. Nothing on a property today. Not the length caps on the rules page: those bound the model’s ownnameanddescription, not property values. -
Property-pair comparisons:
sh:equals,sh:disjoint,sh:lessThan. Rare in practice. The same route through custom data.
Caveats:
-
SHACL validates instance data after loading it. This format is descriptive first, enforced via the database schema where possible. Validation checks the model document, not the data.
-
SHACL binds shapes to data with targets such as
sh:targetClass. Here the binding is identity: a node entry is the shape for itsidentifierlabel. No target machinery.