@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix ex: <http://example.com/> .
@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 spsh: <https://w3id.org/spsh/def#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

<https://w3id.org/spsh/example/>
  rdf:type owl:Ontology ;
  dc:creator "Miltiadis Gkatzios" ;
  dcterms:contributor "Robin Franken" ;
  dcterms:created "2025-01-04"^^xsd:date ;
  dcterms:modified "2026-06-08"^^xsd:date ;
  owl:imports <https://w3id.org/spsh/def> ;
.

# Derived/Computed property
## Shape
ex:PersonShape
  rdf:type sh:NodeShape ;
  sh:rule ex:AgeComputation ;
  sh:targetClass ex:Person .
## TripleRule
ex:AgeComputation
  rdf:type sh:TripleRule ;
  sh:subject sh:this ;
  sh:predicate ex:age ;
  sh:object [
    spsh:SUBTRACT (          
      [ spsh:YEAR ( 
        [ spsh:NOW ( ) ] ) ]
      [ sh:path ex:birthYear ]
    )
  ]
.
##Data
ex:Bob rdf:type ex:Person ;
  ex:birthYear "1990"^^xsd:integer .
ex:Alice rdf:type ex:Person ;
  ex:birthYear "1990-01-01"^^xsd:date .

# Default value computation
## Shape
ex:OrderShape
  rdf:type sh:NodeShape ;
  sh:rule ex:ShippingMethodDefault ;
  sh:targetClass ex:Order .
## TripleRule
ex:ShippingMethodDefault
  rdf:type sh:TripleRule ;
  sh:condition [
    sh:property [
      sh:path ex:shippingMethod ;
      sh:maxCount 0 ;
    ]
  ] ;
  sh:subject sh:this ;
  sh:predicate ex:shippingMethod ;
  sh:object [
    spsh:IF (
      [ spsh:GREATER_THAN_OR_EQUALS ( 
        [ sh:path ex:weight ] 
        10 ) ] 
      "express" 
      "standard"
    )
  ] 
.
##Data
ex:Order_01 rdf:type ex:Order ;
  ex:weight "5"^^xsd:integer .
ex:Order_02 rdf:type ex:Order ;
  ex:weight "12"^^xsd:integer .
ex:Order_03 rdf:type ex:Order ;
  ex:weight "3"^^xsd:integer ;
  ex:shippingMethod "express" .

# Normalization
## Shape
ex:PersonShape
  rdf:type sh:NodeShape ;
  sh:rule ex:FamilyNameComputation ;
  sh:targetClass ex:Person .
## TripleRule
ex:FamilyNameComputation
  rdf:type sh:TripleRule ;
  sh:subject sh:this ;
  sh:predicate ex:normalisedLastName ;
  sh:object [
    spsh:COALESCE (          
      [ sh:path ex:lastName ]
      [ spsh:COALESCE (                    
        [ sh:path ex:surname ]
        [ sh:path ex:familyName ] ) ] 
    ) 
  ]
.
##Data
ex:Bob rdf:type ex:Person ;
  ex:surname "Doe" .
ex:Alice rdf:type ex:Person ;
  ex:fatherName "Doe" .

#Denormalization
## Shape
ex:ItemShape
  rdf:type sh:NodeShape ;
  sh:rule ex:ItemComputation ;
  sh:targetObjectsOf ex:hasItem .
## TripleRule
ex:ItemComputation
  rdf:type sh:TripleRule ;
  sh:subject [ sh:path [ sh:inversePath ex:hasItem ] ] ;
  sh:predicate [
    spsh:IRI (  
      [ spsh:CONCAT ( 
        [ spsh:STR ( ex:hasItem ) ]
        [ spsh:CONCAT ( 
          "_"
          [ spsh:STR ( [ sh:path ex:sequence ] ) ] ) ]
        )
      ]
    )
  ] ;
  sh:object sh:this ;
.
##Data
ex:Order_1 ex:hasItem ex:Item_1 , ex:Item_2 , ex:Item_3 .
ex:Item_1 ex:sequence "1"^^xsd:integer .
ex:Item_2 ex:sequence "2"^^xsd:integer .
ex:Item_3 ex:sequence "3"^^xsd:integer .
