Exemplar S007 — Transactions paired report

    chain-of-transactions

    Three-link chain via buyer-also-seller participants — recursive Relator predicate + TransactionChain.

    Input instance (ABox)

    # Diagnostic exemplar — ODR-0004 §8a, IC-only — input to ODR-0007 (Transactions & Lifecycle).
    # Situation: three-link chain of property sales — buyer of property A is selling property B
    # (which has a buyer who is selling property C). Tests Q4 chain modelling.
    # Status: ratified. Namespace: https://opda.org.uk/pdtf/ (Session 003b + ADR-0006).
    # ODR-0004 status: accepted (council: session-004); ODR-0007 status: accepted (council: session-007).
    
    @prefix opda:    <https://opda.org.uk/pdtf/> .
    @prefix opda-x:  <https://opda.org.uk/pdtf/harness/data/exemplar/chain-of-transactions/> .
    @prefix prov:    <http://www.w3.org/ns/prov#> .
    @prefix dct:     <http://purl.org/dc/terms/> .
    @prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
    @prefix skos:    <http://www.w3.org/2004/02/skos/core#> .
    @prefix xsd:     <http://www.w3.org/2001/XMLSchema#> .
    
    opda-x:exemplar
        a opda:DiagnosticExemplar ;
        dct:title "Chain of three property transactions linked by buyer-also-seller participants" ;
        dct:status "ratified" ;
        dct:references <ODR-0007> , <ODR-0006> , <ODR-0005> , <ODR-0004> ;
        skos:scopeNote
            "Tests Q4 chain modelling. Three transactions: T_A (sale of Property A; buyer = Person X), T_B (sale of Property B; seller = Person X, buyer = Person Y), T_C (sale of Property C; seller = Person Y). The chain is recursive on the buyer-also-seller relationship. The plan §S007 Q4 names three candidate mechanisms: (a) recursive Relator (opda:dependsOnTransaction); (b) list of Transactions on a parent ChainTransaction; (c) two separate predicates (opda:dependsOn / opda:dependedOnBy). Each transaction's status is the S011 Phase label scheme; chain status is derived (any-blocked → chain-blocked). Q3 lifecycle event: a milestone-not-met on T_C cascades up via opda:dependedOnBy to T_B and T_A — the linked transactions go on hold." .
    
    # Three Persons (each plays Buyer in one transaction and Seller in another)
    opda-x:person-w a opda:Person ; rdfs:label "Person W (seller of Property A; transaction-chain origin)" .
    opda-x:person-x a opda:Person ; rdfs:label "Person X (buyer of Property A; seller of Property B)" .
    opda-x:person-y a opda:Person ; rdfs:label "Person Y (buyer of Property B; seller of Property C)" .
    opda-x:person-z a opda:Person ; rdfs:label "Person Z (buyer of Property C; chain terminus — cash buyer)" .
    
    # Three Properties (each with its own LegalEstate + RegisteredTitle per S005 3-class)
    opda-x:property-a a opda:Property ; rdfs:label "Property A (44 Pine Crescent)" ; opda:uprn "100070111111" .
    opda-x:property-b a opda:Property ; rdfs:label "Property B (12 Elm Grove)" ; opda:uprn "100070222222" .
    opda-x:property-c a opda:Property ; rdfs:label "Property C (Flat 7, Beech House)" ; opda:uprn "100070333333" .
    
    opda-x:title-a a opda:RegisteredTitle ; opda:titleNumber "NK111000" .
    opda-x:title-b a opda:RegisteredTitle ; opda:titleNumber "NK222000" .
    opda-x:title-c a opda:RegisteredTitle ; opda:titleNumber "NK333000" .
    
    opda-x:title-a opda:identifiesSameProperty opda-x:property-a .
    opda-x:title-b opda:identifiesSameProperty opda-x:property-b .
    opda-x:title-c opda:identifiesSameProperty opda-x:property-c .
    
    # Three transactions, chained
    opda-x:transaction-a
        a opda:Transaction ;
        rdfs:label "T_A: Person W → Person X (sale of Property A)" ;
        opda:concerns opda-x:title-a .
    
    opda-x:transaction-b
        a opda:Transaction ;
        rdfs:label "T_B: Person X → Person Y (sale of Property B; depends on T_A)" ;
        opda:concerns opda-x:title-b ;
        opda:dependsOnTransaction opda-x:transaction-a .   # Q4 candidate (a) — recursive Relator predicate
    
    opda-x:transaction-c
        a opda:Transaction ;
        rdfs:label "T_C: Person Y → Person Z (sale of Property C; depends on T_B; cash buyer terminus)" ;
        opda:concerns opda-x:title-c ;
        opda:dependsOnTransaction opda-x:transaction-b .
    
    # Chain as a first-class entity (Q4 candidate b — list-of-Transactions parent)
    opda-x:chain
        a opda:TransactionChain ;
        rdfs:label "Three-link chain (T_A → T_B → T_C); 4 participants; cash buyer at T_C" ;
        opda:chainMembers opda-x:transaction-a , opda-x:transaction-b , opda-x:transaction-c ;
        opda:chainStatus "active" ;
        opda:chainLength 3 .
    

    Expected SHACL validation report

    # chain-of-transactions-expected-report.ttl — paired SHACL validation report
    # Generated by opda-gen 1.0.2; DO NOT HAND-EDIT.
    # Specification: https://opda.org.uk/pdtf/harness/adr/ADR-0007-ontology-generator-specification
    # Implementation: https://opda.org.uk/pdtf/harness/adr/ADR-0014-baspi5-round-trip-mvp-harness
    # Ratifying ODR: ODR-0004 §8a (diagnostic exemplar pairing).
    # Comparison is semantic-equivalence (focusNode, resultPath, severity, constraint, message) per tests/baspi5_round_trip/compare_reports.py.
    
    @prefix dct: <http://purl.org/dc/terms/> .
    @prefix opda: <https://opda.org.uk/pdtf/> .
    @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
    @prefix sh: <http://www.w3.org/ns/shacl#> .
    @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
    
    <https://opda.org.uk/pdtf/harness/data/exemplar-reports/report>
        rdf:type sh:ValidationReport ;
        dct:source <https://opda.org.uk/pdtf/harness/data/exemplar/chain-of-transactions> ;
        sh:conforms "true"^^xsd:boolean .
    

    The full exemplar catalogue and round-trip contract: Exemplars; the shapes this graph validates against: SHACL shapes; the overlay profiles it loads: Overlay profiles.