@prefix xsd: 	   <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 owl: 	   <http://www.w3.org/2002/07/owl#> . 

@prefix skos: 	   <http://www.w3.org/2004/02/skos/core#> . 
@prefix vann: 	   <http://purl.org/vocab/vann/> . 
@prefix dc: 	   <http://purl.org/dc/elements/1.1/> . 
@prefix foaf: 	   <http://xmlns.com/foaf/0.1/> . 
@prefix dcterms:   <http://purl.org/dc/terms/> . 
@prefix cc:        <http://creativecommons.org/ns#> .
@prefix sh: 	   <http://www.w3.org/ns/shacl#> . 
@prefix shsh:      <http://www.w3.org/ns/shacl-shacl#> .

@prefix ex: 	   <http://example.net/ns#> . 

@prefix ottr: 	   <http://ns.ottr.xyz/0.4/> . 

@prefix o-wottr:   <http://spec.ottr.xyz/wOTTR/0.4.4/tpl/> . 

ottr:VocabularyTokenShape a sh:NodeShape ;
  sh:targetNode ex:ANY_NODE ; ## matches any node
  sh:sparql [ a sh:SPARQLConstraint ;
    sh:select """
    PREFIX ottr: <http://ns.ottr.xyz/0.4/>
    SELECT ?value 
    WHERE { { ?value ?p ?o }
      UNION { ?s ?value ?o }
      UNION { ?s ?p ?value }
    FILTER (isIRI(?value) && STRSTARTS(STR(?value), "http://ns.ottr.xyz/0.4/"))
    FILTER (?value NOT IN ( ottr:IRI, ottr:Bot, ottr:NEList, ottr:LUB, 
     
    ) )
    }
    """ ;
    ] ;
  sh:name "OTTR vocabulary element." ;
  sh:message "Unrecognised OTTR vocabulary element. Check spelling." 
.
