@prefix convo: <https://ontology.inferal.com/modules/conversation/> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix prof: <http://www.w3.org/ns/dx/prof/> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix role: <http://www.w3.org/ns/dx/prof/role/> .
@prefix sh: <http://www.w3.org/ns/shacl#> .

convo:TargetedCommentProfile
    a prof:Profile ;
    prof:isProfileOf convo: ;
    prof:hasResource <https://ontology.inferal.com/modules/conversation/profiles/targeted-comment#constraints> .

<https://ontology.inferal.com/modules/conversation/profiles/targeted-comment#constraints>
    a prof:ResourceDescriptor ;
    rdfs:label "Targeted Comment constraints descriptor"@en ;
    rdfs:comment "Describes the SHACL artifact that validates qualified whole-resource and selected-fragment targets."@en ;
    prof:hasArtifact <https://ontology.inferal.com/modules/conversation/profiles/targeted-comment.ttl> ;
    prof:hasRole role:constraints, role:validation ;
    dcterms:conformsTo <http://www.w3.org/ns/shacl#> ;
    dcterms:format <https://www.iana.org/assignments/media-types/text/turtle> .

convo:TargetedCommentShape
    a sh:NodeShape ;
    rdfs:label "targeted comment shape"@en ;
    rdfs:comment "Requires each comment in the profile to identify at least one qualified target."@en ;
    sh:targetClass convo:Comment ;
    sh:property [ sh:path convo:hasTarget ; sh:class convo:Target ; sh:minCount 1 ] .

convo:TargetShape
    a sh:NodeShape ;
    rdfs:label "target shape"@en ;
    rdfs:comment "Requires a target to identify exactly one source resource; a selector remains optional for whole-resource targets."@en ;
    sh:targetClass convo:Target ;
    sh:property [ sh:path convo:sourceResource ; sh:minCount 1 ; sh:maxCount 1 ] ;
    sh:property [ sh:path convo:selector ; sh:maxCount 1 ] .
