@prefix dash: <http://datashapes.org/dash#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@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 xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix vann: <http://purl.org/vocab/vann/> .
@prefix sarefsh: <https://saref.etsi.org/shape#> .
@prefix schema: <http://schema.org/> .

sarefsh:OntologyShape
	a sh:NodeShape ;
	  sh:targetClass owl:Ontology ;
	  sh:closed	true ;
	sh:property [
		sh:path rdf:type ;
		sh:minCount 1 ;
		sh:hasValue owl:Ontology ;
	] ;
	sh:property [
		sh:path owl:versionInfo ;
		sh:maxCount 0 ;
		sh:severity sh:Warning ;
		sh:message "The annotation owl:versionInfo shall not be set in the source file, as it will be computed automatically."
	] ;
	sh:property [
		sh:path owl:versionIRI ;
		sh:maxCount 0 ;
		sh:severity sh:Warning ;
		sh:message "The annotation owl:versionIRI shall not be set in the source file, as it will be computed automatically."
	] ;
	sh:property [
		sh:path owl:priorVersion ;
		sh:maxCount 0 ;
		sh:severity sh:Warning ;
		sh:message "The annotation owl:priorVersion shall not be set in the source file, as it will be computed automatically."
	] ;
	sh:property [
		sh:path owl:imports ;
		sh:nodeKind sh:IRI ;
		sh:pattern "^https://saref.etsi.org/(core|saref4[a-z]{4})/v[1-9][0-9]*\\.[1-9][0-9]*\\.[1-9][0-9]*/$" ;
		sh:severity sh:Violation ;
		sh:message "Only SAREF ontologies with specific versions shall be imported. Their URIs conform to the regular expression `^https://saref.etsi.org/(core|saref4[a-z]{4})/v[1-9][0-9]*\\.[1-9][0-9]*\\.[1-9][0-9]*/$`"
	] ;
	sh:property [
		sh:path dcterms:title ;
		sh:nodeKind sh:Literal ;
		sh:minCount 1 ;
		sh:maxCount 1 ;
		sh:severity sh:Violation ;
		sh:message "The ontology should have exactly one <http://purl.org/dc/terms/title>. No documentation will be generated"
	] ;  
	sh:property [
		sh:path dcterms:abstract ;
		sh:nodeKind sh:Literal ;
		sh:minCount 1 ;
		sh:maxCount 1 ;
		sh:severity sh:Warning ;
		sh:message "The ontology should have exactly one <http://purl.org/dc/terms/abstract>."
	] ;
	sh:property [
		sh:path dcterms:description ;
		sh:nodeKind sh:Literal ;
		sh:minCount 1 ;
		sh:maxCount 1 ;
		sh:severity sh:Warning ;
		sh:message "The ontology should have exactly one <http://purl.org/dc/terms/description>."
	] ;
	sh:property [
		sh:path rdfs:comment ;
		sh:nodeKind sh:Literal ;
		sh:minCount 0 ;
	] ;
	sh:property [
		sh:path dcterms:issued ;
		sh:datatype xsd:date ;
		sh:minCount 1 ;
		sh:maxCount 1 ;
		sh:severity sh:Warning ;
		sh:message "The ontology shall have exactly one <http://purl.org/dc/terms/issued> annotation, which shall be a valid xsd:date literal YYYY-MM-DD."
	] ;
	sh:property [
		sh:path dcterms:modified ;
		sh:datatype xsd:date ;
		sh:maxCount 0 ;
		sh:severity sh:Warning ;
		sh:message "The annotation <http://purl.org/dc/terms/modified> shall not be set in the source file, as it will be computed automatically."
	] ;
	sh:property [
		sh:path dcterms:source ;
		sh:minCount 1 ;
		sh:maxCount 1 ;
		sh:pattern "^http://www.etsi.org/deliver/etsi_ts/" ;
		sh:severity sh:Warning ;
		sh:message "There shall be exactly one annotation <http://purl.org/dc/terms/source> that points to the ETSI Technical Specification URL `http://www.etsi.org/deliver/etsi_ts/...`."
	] ;
	sh:property [
		sh:path dcterms:creator ;
		sh:maxCount 0 ;
		sh:severity sh:Violation ;
		sh:message "The ontology shall have no <http://purl.org/dc/terms/creator> annotation."
	] ;
	sh:property [
		sh:path dcterms:license ;
		sh:nodeKind sh:IRI ;
		sh:minCount 1 ;
		sh:maxCount 1 ;
		sh:pattern "https://forge.etsi.org/etsi-software-license" ;
		sh:severity sh:Violation ;
		sh:message "There shall be exactly one annotation <http://purl.org/dc/terms/license> <https://forge.etsi.org/etsi-software-license>."
	] ;
	sh:property [
		sh:path dcterms:contributor ;
		sh:nodeKind sh:BlankNodeOrIRI ;
		sh:minCount 1 ;
		sh:severity sh:Warning ;
		sh:message "There shall be at least one <http://purl.org/dc/terms/contributor>, that shall be a blank node or a IRI."
	] ;
	sh:property [
		sh:path dcterms:contributor ;
		sh:severity sh:Warning ;
		sh:node sarefsh:PersonShape ;
		sh:message "Every contributor shall be a <http://schema.org/Person> with <http://schema.org/givenName>, <http://schema.org/familyName>, and <http://schema.org/affiliation>."
	] ;
	sh:property [
		sh:path dcterms:publisher ;
		sh:maxCount 0 ;
		sh:severity sh:Warning ;
		sh:message "The annotation <http://purl.org/dc/terms/publisher> shall not be set in the source file, as it will be computed automatically."
	] ;
	sh:property [
		sh:path vann:preferredNamespacePrefix ;
		sh:maxCount 0 ;
		sh:severity sh:Warning ;
		sh:message "The annotation <http://purl.org/vocab/vann/preferredNamespacePrefix> shall not be set in the source file, as it will be computed automatically."
	] ;
	sh:property [
		sh:path vann:preferredNamespaceUri ;
		sh:maxCount 0 ;
		sh:severity sh:Warning ;
		sh:message "The annotation <http://purl.org/vocab/vann/preferredNamespaceUri> shall not be set in the source file, as it will be computed automatically."
	] .
	
sarefsh:PersonShape
	a sh:NodeShape ;
  sh:targetClass schema:Person ;
	sh:severity sh:Warning ;
	sh:property [
    sh:path rdf:type ;
    sh:hasValue schema:Person ;
		sh:severity sh:Warning ;
    sh:message "Each contributor shall be a <http://schema.org/Person>."
	] ;
	sh:property [
    sh:path schema:givenName ;
    sh:minCount 1 ;
    sh:maxCount 1 ;
		sh:severity sh:Warning ;
    sh:message "Each contributor shall have exactly one <http://schema.org/givenName>."
	] ;
	sh:property [
    sh:path schema:familyName ;
    sh:minCount 1 ;
    sh:maxCount 1 ;
		sh:severity sh:Warning ;
    sh:message "Each contributor shall have exactly one <http://schema.org/lastName>."
	] ;
	sh:property [
    sh:path schema:affiliation ;
    sh:minCount 1 ;
		sh:nodeKind sh:BlankNodeOrIRI ;
		sh:node sarefsh:AffiliationShape ;
		sh:severity sh:Warning ;
    sh:message "Each contributor shall have at least one <http://schema.org/affiliation>, that shall be a blank node or a IRI of type <http://schema.org/Organization> with exactly one <http://schema.org/name>."
	] .
	
sarefsh:AffiliationShape
	a sh:NodeShape ;
  sh:targetClass schema:Organization ;
	sh:severity sh:Warning ;
	sh:property [
    sh:path rdf:type ;
    sh:hasValue schema:Organization ;
		sh:severity sh:Warning ;
    sh:message "The affiliation of each contributor shall be a <http://schema.org/Organization>."
	] ;
	sh:property [
    sh:path schema:name ;
    sh:minCount 1 ;
    sh:maxCount 1 ;
		sh:severity sh:Warning ;
    sh:message "The affiliation of each contributor shall have exactly one <http://schema.org/name>."
	] .	

[] a sh:NodeShape ;
  sh:targetClass owl:Class ;
  sh:message "The owl:Class should have exactly one rdfs:label and one rdfs:comment" ;
	sh:severity sh:Warning ;
  sh:or (
  	[ sh:nodeKind sh:BlankNode ]
  	[
  	  sh:and (
  	  	[ 
  	  	  sh:path rdfs:label ;
					sh:nodeKind sh:Literal ;
					sh:minCount 1 ;
					sh:maxCount 1 ;
					sh:severity sh:Warning ;
					sh:message "The term should have exactly one rdfs:label."
				] 
			  [
					sh:path rdfs:comment ;
					sh:nodeKind sh:Literal ;
					sh:minCount 1 ;
					sh:maxCount 1 ;
					sh:severity sh:Warning ;
					sh:message "The term should have exactly one rdfs:comment."
				] 
	  	)
		] 
	) .
[] a sh:NodeShape ;
  sh:targetClass owl:ObjectProperty ;
  sh:message "The owl:ObjectProperty should have exactly one rdfs:label and one rdfs:comment" ;
	sh:severity sh:Warning ;
  sh:or (
  	[ sh:nodeKind sh:BlankNode ]
  	[
  	  sh:and (
  	  	[ 
  	  	  sh:path rdfs:label ;
					sh:nodeKind sh:Literal ;
					sh:minCount 1 ;
					sh:maxCount 1 ;
					sh:severity sh:Warning ;
					sh:message "The term should have exactly one rdfs:label."
				] 
			  [
					sh:path rdfs:comment ;
					sh:nodeKind sh:Literal ;
					sh:minCount 1 ;
					sh:maxCount 1 ;
					sh:severity sh:Warning ;
					sh:message "The term should have exactly one rdfs:comment."
				] 
	  	)
		] 
	) .
[] a sh:NodeShape ;
  sh:targetClass owl:DatatypeProperty ;
  sh:message "The owl:DatatypeProperty should have exactly one rdfs:label and one rdfs:comment" ;
	sh:severity sh:Warning ;
  sh:or (
  	[ sh:nodeKind sh:BlankNode ]
  	[
  	  sh:and (
  	  	[ 
  	  	  sh:path rdfs:label ;
					sh:nodeKind sh:Literal ;
					sh:minCount 1 ;
					sh:maxCount 1 ;
					sh:severity sh:Warning ;
					sh:message "The term should have exactly one rdfs:label."
				] 
			  [
					sh:path rdfs:comment ;
					sh:nodeKind sh:Literal ;
					sh:minCount 1 ;
					sh:maxCount 1 ;
					sh:severity sh:Warning ;
					sh:message "The term should have exactly one rdfs:comment."
				] 
	  	)
		] 
	) .
[] a sh:NodeShape ;
  sh:targetClass owl:NamedIndividual ;
  sh:message "The owl:NamedIndividual should have exactly one rdfs:label and one rdfs:comment" ;
	sh:severity sh:Warning ;
  sh:or (
  	[ sh:nodeKind sh:BlankNode ]
  	[
  	  sh:and (
  	  	[ 
  	  	  sh:path rdfs:label ;
					sh:nodeKind sh:Literal ;
					sh:minCount 1 ;
					sh:maxCount 1 ;
					sh:severity sh:Warning ;
					sh:message "The term should have exactly one rdfs:label."
				] 
			  [
					sh:path rdfs:comment ;
					sh:nodeKind sh:Literal ;
					sh:minCount 1 ;
					sh:maxCount 1 ;
					sh:severity sh:Warning ;
					sh:message "The term should have exactly one rdfs:comment."
				] 
	  	)
		] 
	) .