# Intersecting Shape Trees * /data/#registry # the data registry # data registration for notes#notebook-tree must be validated against data registration shape # AND must indicate it contains Notebooks inside of it * /data/49a5259/#registration * /data/49a5259/12345-65735/#notebook # instance of notes#notebook-tree * /data/49a5259/77562-43213/#notebook # instance of notes#notebook-tree * /data/ # the data Container * Notebook/ # Notebook instance Container ```<> tree:shapeTree <...>``` * 12345-65735/#notebook # instance of notes#notebook-tree * 49a5259/77562-43213/#notebook # instance of notes#notebook-tree # /metadata/ (server managed) * Notebook/_meta.ttl ```<../data/Notebook/> tree:shapeTree <...>``` ``` turtle <> eco:registration <#registration> . <#registration> a eco:DataRegistration ; ``` ``` <>@<RegisteredContainer> <RegisteredContainer> CLOSED { a [lpd:Container] ; dc:title xsd:string ; eco:registration @eco-shex:DataRegistrationShape ; } ``` * POST (plant w ShapeTree #data-registry-tree) * Parent Container: / * Slug: data * includes the #registry body * ShapeTree Validation: * Graph body: #DataRegistryShape * Contents: #data-registration-tree * POST (plant w ShapeTree #data-registration-tree) * Parent Container: /data * Slug: 49a..5259 * includes the #registration body * ShapeTree Validation: * Graph body: #DataRegistrationShape (implied by Ecosystem) * POST * Parent Container: /data/49a..5259 * Slug: 12345-65735 * includes content of a notebook # Josh Proposal ## Existing Metadata (prefixes removed) Stored at: https://ldp.local-ess.inrupt.com/podid/shapetree-testing/Git-Orgs/.meta Note that 4 metadata triples are part of subject: https://ldp.local-ess.inrupt.com/podid/shapetree-testing/Git-Orgs/ (not the subject of the metadata file) https://ldp.local-ess.inrupt.com/podid/shapetree-testing/Git-Orgs/ has a describedBy of https://ldp.local-ess.inrupt.com/podid/shapetree-testing/Git-Orgs/.meta (which has a describes of the former). The .meta file contains these assertions about the document it describes: ```turtle @prefix tree: <http://www.w3.org/ns/shapetree#> . <https://ldp.local-ess.inrupt.com/podid/shapetree-testing/Git-Orgs/> a tree:Locator ; # -ish, 'cause it's also the instance itself. tree:shapeTreeInstancePath "." ; tree:shapeTreeInstanceRoot <https://ldp.local-ess.inrupt.com/podid/shapetree-testing/Git-Orgs/> ; tree:shapeTreeRoot <http://localhost:9999/static/gh-flat/gh-flat-ShapeTree.jsonld#orgs> ; tree:shapeTreeStep <http://localhost:9999/static/gh-flat/gh-flat-ShapeTree.jsonld#orgs> . <https://ldp.local-ess.inrupt.com/podid/shapetree-testing/Git-Orgs/.meta> rdf:type ldp:RDFSource . ``` ## Proposed Metadata (prefixes removed) Stored at: https://ldp.local-ess.inrupt.com/podid/shapetree-testing/Git-Orgs/.meta ```turtle @prefix tree: <http://www.w3.org/ns/shapetree#> . # On the subject of the container, we provide "follow your nose" method to get to any planted shapetrees on the container <https://ldp.local-ess.inrupt.com/podid/shapetree-testing/Git-Orgs/> tree:hasShapeTreeLocator <https://ldp.local-ess.inrupt.com/podid/shapetree-testing/Git-Orgs/#UUID1>, <https://ldp.local-ess.inrupt.com/podid/shapetree-testing/Git-Orgs/#UUID2> . # ShapeTrees are planted with UUID subjects since they are navigated instead of explicitly retrieved. # This represents the ecosystem shapetree <https://ldp.local-ess.inrupt.com/podid/shapetree-testing/Git- Orgs/#UUID1> a tree:Locator ; tree:shapeTreeInstancePath "." ; tree:shapeTreeInstanceRoot <https://ldp.local-ess.inrupt.com/podid/shapetree-testing/Git-Orgs/> ; tree:shapeTreeRoot <http://localhost:9999/static/ecosystem/ecosystem-shapetree.jsonld#data-registration-tree> ; tree:shapeTreeStep <http://localhost:9999/static/ecosystem/ecosystem-shapetree.jsonld#data-registration-tree> . # This represents the application shapetree <https://ldp.local-ess.inrupt.com/podid/shapetree-testing/Git-Orgs/#UUID2> a tree:Locator ; tree:shapeTreeInstancePath "." ; tree:shapeTreeInstanceRoot <https://ldp.local-ess.inrupt.com/podid/shapetree-testing/Git-Orgs/> ; tree:shapeTreeRoot <http://localhost:9999/static/gh-flat/gh-flat-ShapeTree.jsonld#orgs> ; tree:shapeTreeStep <http://localhost:9999/static/gh-flat/gh-flat-ShapeTree.jsonld#orgs> . <https://ldp.local-ess.inrupt.com/podid/shapetree-testing/Git-Orgs/.meta> rdf:type ldp:RDFSource . ``` ### Proposed Revised Workflow 1. When performing a PUT/PATCH/POST/DELETE determine if the in-context container (the parent container being POSTed to or the one containing the target of the PUT/PATCH/DELETE) 1. A container is a ```managed``` if: * A metadata resource exists for that container (regardless of how it is obtained... .meta, in graph, rel=describedby) * The metadata resource contains one or more ```tree:hasShapeTree``` predicate 1. If the container is ```managed```, iterate each triple with a predicate of ```tree:hasShapeTree``` 1. Apply the appropriate rules for each ShapeTree ### Proposed Revised 'Plant' workflow 1. When planting a ShapeTree, determine if there is already a ShapeTree via the ```tree:hasShapeTree``` predicate. If so, validation should occur to ensure there is no "conflict" between the ShapeTrees. Current conflict rules: * Only one ShapeTree can specify the ```tree:shape``` predicate * Only one ShapeTree can specify the ```tree:contents``` predicate * All ShapeTrees must have the same ```tree:expectedType```