@prefix ex: <https://example.com/ontology-migration/> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix new: <https://example.com/person/v2/> .
@prefix old: <https://example.com/person/v1/> .
@prefix om: <https://ontology.inferal.com/modules/ontology-migration/> .
@prefix ord: <https://ontology.inferal.com/modules/ordering/> .
@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 vann: <http://purl.org/vocab/vann/> .

old:v1 a owl:Ontology .
new:v2 a owl:Ontology .
ex:unrelated-source
    a owl:Ontology ;
    dcterms:title "Unrelated source ontology" ;
    dcterms:license <https://creativecommons.org/publicdomain/zero/1.0/> ;
    vann:preferredNamespacePrefix "unrelated-source" ;
    vann:preferredNamespaceUri "https://example.com/unrelated/source/" ;
    owl:versionInfo "1" .

ex:unrelated-target
    a owl:Ontology ;
    dcterms:title "Unrelated target ontology" ;
    dcterms:license <https://creativecommons.org/publicdomain/zero/1.0/> ;
    vann:preferredNamespacePrefix "unrelated-target" ;
    vann:preferredNamespaceUri "https://example.com/unrelated/target/" ;
    owl:versionInfo "1" .

ex:person-v1-to-v2
    a om:OntologyMigrationSet ;
    om:sourceOntology old:v1 ;
    om:targetOntology new:v2 ;
    om:sourceShapesGraph ex:SourceShapes ;
    om:targetShapesGraph ex:TargetShapes ;
    om:executionShapesGraph ex:ExecutionShapes ;
    om:hasCase ex:PersonTypeCase .

ex:PersonTypeCase
    a sh:NodeShape ;
    rdfs:label "person type case" ;
    rdfs:comment "Transforms the source person type." ;
    sh:targetClass old:Person ;
    sh:rule ex:PersonTypeRule .

ex:PersonTypeRule
    a sh:TripleRule ;
    rdfs:label "person type rule" ;
    rdfs:comment "Constructs the target Person type." ;
    ord:inOrdering ex:person-v1-to-v2 ;
    sh:order 0 ;
    sh:subject sh:this ;
    sh:predicate rdf:type ;
    sh:object new:Person .

ex:NameCase
    a sh:NodeShape ;
    om:caseOf ex:person-v1-to-v2 ;
    rdfs:label "name case" ;
    rdfs:comment "Transforms the source full name property." ;
    sh:targetSubjectsOf old:fullName ;
    sh:rule ex:NameRule .

ex:NameRule
    a sh:SPARQLRule ;
    rdfs:label "name rule" ;
    rdfs:comment "Constructs the target display name." ;
    ord:follows ex:PersonTypeRule ;
    ord:inOrdering ex:person-v1-to-v2 ;
    sh:order 1 ;
    sh:construct """
        PREFIX new: <https://example.com/person/v2/>
        PREFIX old: <https://example.com/person/v1/>
        CONSTRUCT { $this new:displayName ?name }
        WHERE {
            $this a new:Person ;
                  old:fullName ?name .
        }
    """ .

ex:EnabledStatusCase
    a sh:NodeShape ;
    om:caseOf ex:person-v1-to-v2 ;
    rdfs:label "enabled status case" ;
    rdfs:comment "For a source status of enabled, constructs the corresponding target status assertion." ;
    sh:targetSubjectsOf old:status ;
    sh:rule ex:EnabledStatusRule .

ex:EnabledStatusRule
    a sh:SPARQLRule ;
    rdfs:label "enabled status rule" ;
    rdfs:comment "Constructs target active true when the source status is enabled." ;
    sh:construct """
        PREFIX new: <https://example.com/person/v2/>
        PREFIX old: <https://example.com/person/v1/>
        CONSTRUCT { $this new:active true }
        WHERE { $this old:status "enabled" }
    """ .

# This second set and its case test that endpoint and explicit membership joins
# keep unrelated cases out of the v1-to-v2 result.
ex:unrelated-set
    a om:OntologyMigrationSet ;
    rdfs:label "unrelated migration set" ;
    rdfs:comment "Provides a second endpoint pair whose explicitly associated case must not appear in the selected migration result." ;
    om:sourceOntology ex:unrelated-source ;
    om:targetOntology ex:unrelated-target ;
    om:sourceShapesGraph ex:UnrelatedSourceShapes ;
    om:targetShapesGraph ex:UnrelatedTargetShapes ;
    om:executionShapesGraph ex:UnrelatedExecutionShapes ;
    om:hasCase ex:UnrelatedCase .

ex:UnrelatedCase
    a sh:NodeShape ;
    rdfs:label "unrelated case" ;
    rdfs:comment "Proves that a rule-bearing shape from another migration set does not leak into the selected result." ;
    sh:targetNode ex:unrelated-item ;
    sh:rule [
        a sh:TripleRule ;
        sh:subject sh:this ;
        sh:predicate rdf:type ;
        sh:object ex:UnrelatedThing
    ] .
