Warning:
This wiki has been archived and is now read-only.

Refactor metamodel

From RDF Data Shapes Working Group
Jump to: navigation, search
# SHACL metamodel

@prefix xs: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix shmm: <http://www.w3.org/ns/shaclmm#> .

##      CORE LANGUAGE plus SPARQL bodies
sh:Shape a rdfs:Class .

# RDFS domains and ranges for the properties
sh:scopeClass           a rdf:Property; rdfs:domain sh:Shape; rdfs:range rdfs:Class .
sh:scopeNode            a rdf:Property; rdfs:domain sh:Shape .
sh:scopePropertyObject  a rdf:Property; rdfs:domain sh:Shape; rdfs:range rdf:Property.
sh:scopePropertySubject a rdf:Property; rdfs:domain sh:Shape; rdfs:range rdf:Property.
sh:scopeAllObjects      a rdf:Property; rdfs:domain sh:Shape; rdfs:range xs:boolean .
sh:scopeAllSubjects     a rdf:Property; rdfs:domain sh:Shape; rdfs:range xs:boolean .
sh:scopeSPARQL          a rdf:Property; rdfs:domain sh:Shape; rdfs:range xs:string .
sh:filter               a rdf:Property; rdfs:domain sh:Shape; rdfs:range sh:Shape .

sh:hasValue         a rdf:Property ; rdfs:domain sh:Shape .
sh:in               a rdf:Property ; rdfs:domain sh:Shape ; rdfs:range rdf:List .
sh:class            a rdf:Property ; rdfs:domain sh:Shape ; rdfs:range rdfs:Class .
sh:classIn          a rdf:Property ; rdfs:domain sh:Shape ; rdfs:range rdf:List .
sh:datatype         a rdf:Property ; rdfs:domain sh:Shape ; rdfs:range rdfs:Datatype .
sh:datatypeIn       a rdf:Property ; rdfs:domain sh:Shape ; rdfs:range rdf:List .
sh:directType       a rdf:Property ; rdfs:domain sh:Shape ; rdfs:range rdfs:Class .
sh:minLength        a rdf:Property ; rdfs:domain sh:Shape ; rdfs:range xs:integer .
sh:maxLength        a rdf:Property ; rdfs:domain sh:Shape ; rdfs:range xs:integer .
sh:minExclusive     a rdf:Property ; rdfs:domain sh:Shape ; rdfs:range rdfs:Literal .
sh:minInclusive     a rdf:Property ; rdfs:domain sh:Shape ; rdfs:range rdfs:Literal .
sh:maxExclusive     a rdf:Property ; rdfs:domain sh:Shape ; rdfs:range rdfs:Literal .
sh:maxInclusive     a rdf:Property ; rdfs:domain sh:Shape ; rdfs:range rdfs:Literal .
sh:nodeKind         a rdf:Property ; rdfs:domain sh:Shape ; rdfs:range rdfs:Resource .
sh:pattern          a rdf:Property ; rdfs:domain sh:Shape ; rdfs:range rdf:List .
sh:equals           a rdf:Property ; rdfs:domain sh:Shape ; rdfs:range rdf:List .
sh:notEquals        a rdf:Property ; rdfs:domain sh:Shape ; rdfs:range rdf:List .
sh:lessThan         a rdf:Property ; rdfs:domain sh:Shape ; rdfs:range rdf:List .
sh:lessThanOrEquals a rdf:Property ; rdfs:domain sh:Shape ; rdfs:range rdf:List .
sh:fillers          a rdf:Property ; rdfs:domain sh:Shape ; rdfs:range rdf:List .
sh:list             a rdf:Property ; rdfs:domain sh:Shape ; rdfs:range sh:Shape .
sh:shape            a rdf:Property ; rdfs:domain sh:Shape ; rdfs:range sh:Shape .
sh:and              a rdf:Property ; rdfs:domain sh:Shape ; rdfs:range rdf:List .
sh:or               a rdf:Property ; rdfs:domain sh:Shape ; rdfs:range rdf:List .
sh:not              a rdf:Property ; rdfs:domain sh:Shape ; rdfs:range sh:Shape .
sh:minCount         a rdf:Property ; rdfs:domain sh:Shape ; rdfs:range xs:integer .
sh:maxCount         a rdf:Property ; rdfs:domain sh:Shape ; rdfs:range xs:integer .
sh:uniqueLang       a rdf:Property ; rdfs:domain sh:Shape ; rdfs:range xs:boolean .
sh:partition        a rdf:Property ; rdfs:domain sh:Shape ; rdfs:range rdf:List .
sh:closed           a rdf:Property ; rdfs:domain sh:Shape ; rdfs:range rdf:List .
sh:sparql           a rdf:Property ; rdfs:range xs:sring .

sh:severity         a rdf:Property .

sh:inverse          a rdf:Property ; rdfs:range rdf:Property .

# Shapes that reiterate RDFS ranges (if this is felt desirable )
# Don't do this for ranges that are classes, datatypes, or properties
# or lists of same.  Instead only require being IRIs

shmm:scopeAllObjectsRange a sh:Shape ; sh:scopeClass sh:Shape ;
  sh:fillers ( sh:sscopeAllObjects [ sh:datatype xs:boolean ] ) .
# and so on for many of the SHACL constructs

# Shapes different from the RDFS range

shmm:scopeClassIRI a sh:Shape ; sh:scopeClass sh:Shape ;
  sh:fillers ( sh:scopeClass [ sh:nodeKind sh:IRI ] ) .

shmm:scopePropertyObjectIRI a sh:Shape ; sh:scopeClass sh:Shape ;
  sh:fillers ( sh:scopePropertyObject [ sh:nodeKind sh:IRI ] ) .

shmm:scopePropertySubjectIRI a sh:Shape ; sh:scopeClass sh:Shape ;
  sh:fillers ( sh:scopePropertySubject [ sh:nodeKind sh:IRI ] ) .

shmm:scopeAllObjectsUnique a sh:Shape ; sh:scopeClass sh:Shape ;
  sh:fillers ( sh:scopeAllObjects [ sh:maxCount 1 ] ) .

sh:scopeAllSubjectsUnique a sh:Shape ; sh:scopeClass sh:Shape ;
  sh:fillers ( sh:scopeAllSubjects [ sh:maxCount 1 ] ) .

shmm:classInSyntax a sh:Shape ; sh:scopeClass sh:Shape ;
# NO, not required  sh:fillers ( sh:classIn [ sh:list [ sh:class rdfs:Class ] ] ) ;
  sh:fillers ( sh:classIn [ sh:list [ sh:nodeKind sh:IRI ] ] ) .

shmm:datatypeInSyntax a sh:Shape ; sh:scopeClass sh:Shape ;
# NO, not required  sh:fillers ( sh:datatypeIn [ sh:list rdfs:Datatype ] ) .
  sh:fillers ( sh:datatypeIn [ sh:list [ sh:nodeKind sh:IRI ] ] ) .

shmm:minLengthSyntax a sh:Shape ; sh:scopeClass sh:Shape ;
  sh:fillers ( sh:minLength [ sh:minInclusive 0 ] ) .

shmm:maxLengthSyntax a sh:Shape ; sh:scopeClass sh:Shape ;
  sh:fillers ( sh:minLength [ sh:minInclusive 0 ] ) .

shmm:nodeKindSyntax a sh:Shape ; sh:scopeClass sh:Shape ;
  sh:fillers ( sh:nodeKind [ sh:in ( sh:BlankNode sh:IRI sh:Literal ) ] ) .

shmm:patternSyntax a sh:Shape ; sh:scopeClass sh:Shape ;
  sh:fillers ( sh:pattern 
    [ sh:or (
      [ sh:datatype xs:string ] # no flags, just a pattern
      [ sh:list [ sh:datatype xs:string ] ; # pattern and flags are both strings
        sh:fillers ( ( rdf:rest rdf:rest ) [ sh:in ( rdf:nil ) ] ) ] ) ] ) .

shmm:equalsSyntax a sh:Shape ; sh:scopeClass sh:Shape ;
  sh:fillers ( sh:equals [ sh:list shmm:pathShape ] ) .

shmm:notEqualsSyntax a sh:Shape ; sh:scopeClass sh:Shape ;
  sh:fillers ( sh:notEquals [ sh:list shmm:pathShape ] ) .

shmm:lessThanSyntax a sh:Shape ; sh:scopeClass sh:Shape ;
  sh:fillers ( sh:lessThan [ sh:list shmm:pathShape ] ) .

shmm:lessThanOrEqualsSyntax a sh:Shape ; sh:scopeClass sh:Shape ;
  sh:fillers ( sh:lessThanOrEquals [ sh:list shmm:pathShape ] ) .

shmm:fillersSyntax a sh:Shape ; sh:scopeClass sh:Shape ;
  sh:fillers ( sh:fillers 
    [ sh:list [ sh:and ( ) ] ; # no common shape for the list elements
      sh:fillers ( rdf:first shmm:pathShape ) ;
      sh:fillers ( ( rdf:rest rdf:first ) [ sh:class sh:Shape ] ) ;
      sh:fillers ( ( rdf:rest rdf:rest ) [ sh:in ( rdf:nil ) ] ) ] ) .

shmm:andSyntax a sh:Shape ; sh:scopeClass sh:Shape ;
  sh:fillers ( sh:and [ sh:list [ sh:class sh:Shape ] ] ) .

shmm:orSyntax a sh:Shape ; sh:scopeClass sh:Shape ;
  sh:fillers ( sh:or [ sh:list [ sh:class sh:Shape ] ] ) .

shmm:minCountSyntax a sh:Shape ; sh:scopeClass sh:Shape ;
  sh:fillers ( sh:minCount [ sh:minInclusive 0 ] ) .

shmm:maxCountSyntax a sh:Shape ; sh:scopeClass sh:Shape ;
  sh:fillers ( sh:maxCount [ sh:minInclusive 0 ] ) .

shmm:uniqueLangUnique a sh:Shape ; sh:scopeClass sh:Shape ;
  sh:fillers ( sh:uniqueLang [ sh:maxCount 1 ] ) .

shmm:partitionSyntax a sh:Shape ; sh:scopeClass sh:Shape ;
  sh:fillers ( sh:partition [ sh:list [ sh:class sh:Shape ] ] ) .

shmm:closedIRI a sh:Shape ; sh:scopeClass sh:Shape ;
# NO, not required  sh:fillers ( sh:closed [ sh:list [ sh:class rdf:Property ] ] ) ;
  sh:fillers ( sh:classIn [ sh:list [ sh:nodeKind sh:IRI ] ] ) .

sh:severitySyntax a sh:Shape ; sh:scopeClass sh:Shape ;
  sh:fillers ( sh:severity [ sh:in ( sh:Info sh:Warning sh:Violation ) ] ) .

# Shapes for paths; note that the empty path is allowed
# Has some quirky dependencies (properties can't be list nodes, ...
shmm:pathShape a sh:Shape ;
  sh:or ( shmm:pathPartShape
          [ sh:not shmm:pathPartShape ; sh:list shmm:pathPartShape ] ) .
shmm:pathPartShape a sh:Shape ;
 sh:or ( [ sh:datatype xs:string ] # SPARQL code - TOO CLUNKY
         shmm:inverseShape         # inverse of a property
         [ sh:not shmm:inverseShape ; sh:nodeKind sh:IRI ] ) . # property
shmm:inverseShape a sh:Shape ;
 sh:fillers ( sh:inverse [ sh:minCount 1 ; sh:maxCount 1 ;
                           sh:nodeKind sh:IRI ] ) .

# Non-validating constructs

sh:name         a rdf:Property ; rdfs:range rdf:langString .
sh:description  a rdf:Property ; rdfs:range rdf:langString .
sh:message      a rdf:Property ; rdfs:range rdf:LangString.
sh:order        a rdf:Property ; rdfs:domain sh:Shape ; rdfs:range xs:decimal .
sh:defaultValue a rdf:Property ; rdfs:domain sh:Shape .

sh:orderUnique a sh:Shape ; sh:scopeClass sh:Shape ;
  sh:fillers ( sh:order [ sh:maxCount 1 ] ) .

sh:defaultValueUnique a sh:Shape ; sh:scopeClass sh:Shape ;
  sh:fillers ( sh:defaultValue [ sh:maxCount 1 ] ) .

# Validation results
sh:ValidationResult a rdfs:Class .
sh:focusNode        a rdf:Property ; rdfs:domain sh:ValidationResult .
sh:subject          a rdf:Property ; rdfs:domain sh:ValidationResult .
sh:object           a rdf:Property ; rdfs:domain sh:ValidationResult .
sh:sourceComponent  a rdf:Property ; rdfs:domain sh:ValidationResult .
sh:sourceShape      a rdf:Property ; rdfs:domain sh:ValidationResult ; rdfs:range sh:Shape .
sh:sourceTemplate   a rdf:Property ; rdfs:domain sh:ValidationResult ; rdfs:range sh:ComponentTemplate .
sh:detail           a rdf:Property ; rdfs:domain sh:ValidationResult .
sh:message          a rdf:Property ; rdfs:domain sh:ValidationResult ; rdfs:range rdf:LangString .

sh:ValidationResultSyntax a sh:Shape ; sh:scopeClass sh:ValidationResult ;
  sh:fillers ( sh:focusNode [ sh:maxCount 1 ] ) ;
  sh:fillers ( sh:subject [ sh:maxCount 1 ] ) ;
  sh:fillers ( sh:predicate [ sh:maxCount 1 ] ) ;
  sh:fillers ( sh:object [ sh:maxCount 1 ] ) ;
  sh:fillers ( sh:sourceConstraint [ sh:maxCount 1 ] ) ;
  sh:fillers ( sh:sourceShape [ sh:maxCount 1 ] ) ;
  sh:fillers ( sh:sourceTemplate [ sh:maxCount 1 ] ) ;
  sh:fillers ( sh:message [ sh:datatype rdf:LangString ] ) ;
  sh:fillers ( sh:severity [ sh:in ( sh:Info sh:Warning sh:Violation ) ] ) .

## EXTENSION LANGUAGE - not needed if sticking to core

# ComponentTemplates
sh:ComponentTemplate a rdfs:Class ; rdfs:subClassOf rdf:Property ; rdfs:subClassOf sh:Shape .

sh:labelTemplate a rdf:Property ; rdfs:range rdf:LangString.
sh:sparqlTemplate a rdf:Property ; rdfs:range xs:string.

shmm:sparqlComponentTemplateUnique a sh:Shape ; sh:scopeClass sh:ComponentTemplate ;
  sh:fillers ( sh:sparqlTemplate [ sh:minCount 1 ; sh:maxCount 1 ] ) .

# The core component properties can be defined by templates if desired

# Scope Templates
sh:ScopeTemplate a rdfs:Class; rdfs:subClassOf rdf:Property; rdfs:subClassOf sh:Shape.

shmm:sparqlScopeTemplateUnique a sh:Shape ; sh:scopeClass sh:ScopeTemplate ;
  sh:fillers ( sh:sparqlTemplate [ sh:minCount 1 ; sh:maxCount 1 ] ) .

# Functions

sh:Function a rdfs:Class ; rdfs:subClassOf sh:Shape .

sh:returnType a rdf:Property ; rdfs:domain sh:Function ; rdfs:range rdfs:Datatpye .
sh:sparqlFunction a rdf:Property ; rdfs:domain sh:Function ; rdfs:range xs:string.

shmm:returnTypeUnique a sh:Shape ; sh:scopeClass sh:Function ;
  sh:fillers ( sh:returnType [ sh:minCount 1 ; sh:maxCount 1 ] ) .

shmm:sparqlFunctionUnique a sh:Shape ; sh:scopeClass sh:Function ;
  sh:fillers ( sh:sparqlFunction [ sh:minCount 1 ; sh:maxCount 1 ] ) .