CAC Production SHACL Shapes with gUFO Validation
type: Ontology
comment: SHACL validation shapes for gUFO-enhanced CAC production ontology, including anti-rigidity constraints, temporal validation, and foundational type compliance.
version IRI: https://cacontology.projectvic.org/production/shapes/3.1.0
version info: 3.1.0
creator: CAC Ontology Team
modified: 2026-08-09
imports: https://cacontology.projectvic.org/production/3.1.0
imports: http://purl.org/nemo/gufo#/1.0.0
imports: https://ontology.unifiedcyberontology.org/uco/core/1.5.0

Production Phase Shape
type: NodeShape
target class: Phase
comment: gUFO-enhanced validation shape for production phases with anti-rigidity constraints.
property:
  path: hasProductionPhaseBeginPoint
  datatype: dateTimeStamp
  min count: 0
  max count: 1
  message: Production phase may have at most one begin point.
property:
  path: hasProductionPhaseEndPoint
  datatype: dateTimeStamp
  min count: 0
  max count: 1
  message: Production phase may have an end point.
sparql:
  message: Phase begin point must be before end point.
  prefixes:
    declare:
      prefix: cacontology-production
      namespace: https://cacontology.projectvic.org/production#
  select: PREFIX cacontology-production: <https://cacontology.projectvic.org/production#> SELECT ?this WHERE { ?this cacontology-production:hasProductionPhaseBeginPoint ?begin . ?this cacontology-production:hasProductionPhaseEndPoint ?end . FILTER(?begin >= ?end) }
sparql:
  message: Phase instances must be anti-rigid (cannot exist without being instantiated by entities).
  prefixes:
    declare:
      prefix: gufo
      namespace: http://purl.org/nemo/gufo#
  select: PREFIX gufo: <http://purl.org/nemo/gufo#> PREFIX owl: <http://www.w3.org/2002/07/owl#> SELECT ?this WHERE { ?this a gufo:Phase . FILTER NOT EXISTS { ?this a owl:Class . } FILTER NOT EXISTS { ?entity ?property ?this . ?property rdfs:subPropertyOf* gufo:hasPhase . } }

Active Production Phase Shape
type: NodeShape
target class: ActiveProductionPhase
comment: Validation for active production phase instances.
property:
  path: productionActivity
  datatype: string
  min count: 1
  max count: 1
  in: recording
  in: editing
  in: streaming
  in: distribution_preparation
  message: Active production phase must specify current production activity.

Production Role Shape
type: NodeShape
target class: Role
comment: gUFO-enhanced validation shape for production roles with anti-rigidity and temporal constraints.
property:
  path: hasRoleBeginPoint
  datatype: dateTimeStamp
  min count: 0
  max count: 1
  message: Production role may have at most one begin point.
property:
  path: hasRoleEndPoint
  datatype: dateTimeStamp
  min count: 0
  max count: 1
  message: Production role may have an end point.
sparql:
  message: Role begin point must be before end point.
  prefixes:
    declare:
      prefix: cacontology-production
      namespace: https://cacontology.projectvic.org/production#
  select: PREFIX cacontology-production: <https://cacontology.projectvic.org/production#> SELECT ?this WHERE { ?this cacontology-production:hasRoleBeginPoint ?begin . ?this cacontology-production:hasRoleEndPoint ?end . FILTER(?begin >= ?end) }
sparql:
  message: Role instances must be anti-rigid (cannot exist without being played by entities).
  prefixes:
    declare:
      prefix: gufo
      namespace: http://purl.org/nemo/gufo#
  select: PREFIX gufo: <http://purl.org/nemo/gufo#> PREFIX owl: <http://www.w3.org/2002/07/owl#> SELECT ?this WHERE { ?this a gufo:Role . FILTER NOT EXISTS { ?this a owl:Class . } FILTER NOT EXISTS { ?entity ?property ?this . ?property rdfs:subPropertyOf* gufo:playsRole . } }

Producer Role Conflict Shape
type: NodeShape
target class: Producer
comment: Prevents conflicting roles from being assigned simultaneously.
sparql:
  message: Individual cannot simultaneously be Producer and VictimRole.
  prefixes:
    declare:
      prefix: cacontology-production
      namespace: https://cacontology.projectvic.org/production#
    declare:
      prefix: cacontology-gufo
      namespace: https://cacontology.projectvic.org/gufo#
  select: PREFIX cacontology-production: <https://cacontology.projectvic.org/production#> PREFIX cacontology-gufo: <https://cacontology.projectvic.org/gufo#> PREFIX gufo: <http://purl.org/nemo/gufo#> SELECT ?this WHERE { ?entity gufo:playsRole ?this . ?entity gufo:playsRole ?victimRole . ?this a cacontology-production:Producer . ?victimRole a cacontology:VictimRole . ?this cacontology-production:hasRoleBeginPoint ?producerBegin . ?victimRole cacontology-production:hasRoleBeginPoint ?victimBegin . FILTER(?producerBegin <= ?victimBegin) OPTIONAL { ?this cacontology-production:hasRoleEndPoint ?producerEnd } OPTIONAL { ?victimRole cacontology-production:hasRoleEndPoint ?victimEnd } FILTER( (!BOUND(?producerEnd) && !BOUND(?victimEnd)) || (!BOUND(?producerEnd) && ?victimBegin <= ?victimEnd) || (!BOUND(?victimEnd) && ?producerBegin <= ?producerEnd) || (BOUND(?producerEnd) && BOUND(?victimEnd) && !((?producerEnd < ?victimBegin) || (?victimEnd < ?producerBegin))) ) }

Production Event Shape
type: NodeShape
target class: Event
comment: gUFO validation for production events ensuring proper temporal modeling.
property:
  path: hasBeginPointInXSDDateTimeStamp
  datatype: dateTimeStamp
  min count: 1
  max count: 1
  message: Production event must have exactly one begin point.
property:
  path: hasEndPointInXSDDateTimeStamp
  datatype: dateTimeStamp
  min count: 0
  max count: 1
  message: Production event may have an end point.
sparql:
  message: Event begin point must be before end point.
  prefixes:
    declare:
      prefix: gufo
      namespace: http://purl.org/nemo/gufo#
  select: SELECT ?this WHERE { ?this gufo:hasBeginPointInXSDDateTimeStamp ?begin . ?this gufo:hasEndPointInXSDDateTimeStamp ?end . FILTER(?begin >= ?end) }

Production Situation Shape
type: NodeShape
target class: Situation
comment: gUFO validation for production situations ensuring proper modeling of ongoing states.
sparql:
  message: Situations should involve multiple entities or persist over time.
  prefixes:
    declare:
      prefix: gufo
      namespace: http://purl.org/nemo/gufo#
  select: SELECT ?this WHERE { ?this a gufo:Situation . FILTER NOT EXISTS { { SELECT ?this WHERE { ?this gufo:involves ?entity1 . ?this gufo:involves ?entity2 . FILTER(?entity1 != ?entity2) } } UNION { SELECT ?this WHERE { ?this gufo:hasBeginPointInXSDDateTimeStamp ?begin . ?this gufo:hasEndPointInXSDDateTimeStamp ?end . FILTER(?end > ?begin) } } } }

Production Offense Shape
type: NodeShape
target class: ProductionOffense
comment: Validation shape for CSAM production offense instances.
property:
  path: productionMethod
  datatype: string
  min count: 1
  max count: 1
  in: direct_recording
  in: photography
  in: video_recording
  in: live_streaming
  in: photography_with_modification
  in: multi_session_recording
  in: edited_compilation
  message: Production offense must specify exactly one production method from the allowed list.
property:
  path: sessionCount
  datatype: nonNegativeInteger
  min count: 0
  max count: 1
  min inclusive: 1
  max inclusive: 1000
  message: Session count must be between 1 and 1000 when specified.
property:
  path: victimCount
  datatype: nonNegativeInteger
  min count: 1
  max count: 1
  min inclusive: 1
  max inclusive: 50
  message: Production offense must specify victim count between 1 and 50.
property:
  path: durationMinutes
  datatype: decimal
  min count: 0
  max count: 1
  min inclusive: 1.0
  max inclusive: 10080.0
  message: Duration must be between 1 minute and 1 week (10080 minutes).
property:
  path: startTime
  datatype: dateTime
  min count: 0
  max count: 1
  message: Production offense may have a start time.
property:
  path: endTime
  datatype: dateTime
  min count: 0
  max count: 1
  message: Production offense may have an end time.

Live Production Event Shape
type: NodeShape
target class: LiveProductionEvent
comment: Validation shape for live production event instances.
property:
  path: streamingPlatform
  datatype: string
  min count: 1
  max count: 1
  min length: 2
  max length: 100
  message: Live production event must specify streaming platform (2-100 characters).
property:
  path: viewerCount
  datatype: nonNegativeInteger
  min count: 0
  max count: 1
  min inclusive: 1
  max inclusive: 10000
  message: Viewer count must be between 1 and 10000 when specified.

Extended Production Operation Shape
type: NodeShape
target class: ExtendedProductionOperation
comment: Validation shape for extended production operation instances.
property:
  path: operationDuration
  datatype: decimal
  min count: 1
  max count: 1
  min inclusive: 7.0
  max inclusive: 3650.0
  message: Extended operation duration must be between 7 days and 10 years.
property:
  path: totalSessions
  datatype: nonNegativeInteger
  min count: 1
  max count: 1
  min inclusive: 5
  max inclusive: 5000
  message: Extended operation must have between 5 and 5000 total sessions.

Producer Shape
type: NodeShape
target class: Producer
comment: Validation shape for producer role instances.
property:
  path: productionExperience
  datatype: decimal
  min count: 0
  max count: 1
  min inclusive: 0.0
  max inclusive: 50.0
  message: Production experience must be between 0 and 50 years.
property:
  path: technicalSkillLevel
  datatype: string
  min count: 0
  max count: 1
  in: novice
  in: intermediate
  in: advanced
  in: expert
  in: professional
  message: Technical skill level must be from the allowed list.

Primary Producer Shape
type: NodeShape
target class: PrimaryProducer
comment: Validation shape for primary producer instances.
property:
  path: leadershipRole
  datatype: boolean
  min count: 1
  max count: 1
  has value: true
  message: Primary producer must have leadership role set to true.

Facilitator Shape
type: NodeShape
target class: Facilitator
comment: Validation shape for facilitator role instances.
property:
  path: facilitationType
  datatype: string
  min count: 1
  max count: 1
  in: equipment_provider
  in: location_provider
  in: victim_recruiter
  in: technical_support
  in: distribution_coordinator
  in: financial_facilitator
  message: Facilitator must specify facilitation type from the allowed list.

Production Equipment Shape
type: NodeShape
target class: ProductionEquipment
comment: Validation shape for production equipment instances.
property:
  path: equipmentType
  datatype: string
  min count: 1
  max count: 1
  in: camera
  in: smartphone
  in: tablet
  in: laptop
  in: desktop
  in: recording_device
  in: lighting_equipment
  in: audio_equipment
  in: editing_software
  in: streaming_equipment
  message: Equipment must specify type from the allowed list.
property:
  path: equipmentCondition
  datatype: string
  min count: 0
  max count: 1
  in: new
  in: good
  in: fair
  in: poor
  in: damaged
  in: modified
  message: Equipment condition must be from the allowed list.

Recording Device Shape
type: NodeShape
target class: RecordingDevice
comment: Validation shape for recording device instances.
property:
  path: recordingQuality
  datatype: string
  min count: 0
  max count: 1
  in: low
  in: standard
  in: high
  in: ultra_high
  in: professional
  message: Recording quality must be from the allowed list.
property:
  path: storageCapacity
  datatype: decimal
  min count: 0
  max count: 1
  min inclusive: 0.1
  max inclusive: 100000.0
  message: Storage capacity must be between 0.1 GB and 100 TB.

Production Location Shape
type: NodeShape
target class: ProductionLocation
comment: Validation shape for production location instances.
property:
  path: locationType
  datatype: string
  min count: 1
  max count: 1
  in: residential
  in: commercial
  in: institutional
  in: outdoor
  in: vehicle
  in: temporary
  in: mobile
  message: Production location must specify type from the allowed list.
property:
  path: privacyLevel
  datatype: string
  min count: 1
  max count: 1
  in: public
  in: semi_private
  in: private
  in: highly_private
  in: isolated
  message: Production location must specify privacy level from the allowed list.
property:
  path: accessControl
  datatype: string
  min count: 0
  max count: 1
  in: open
  in: restricted
  in: controlled
  in: secured
  in: locked
  message: Access control must be from the allowed list.

Image Post-Processing Shape
type: NodeShape
target class: ImagePostProcessing
comment: Validation shape for image post-processing instances.
property:
  path: modificationCount
  datatype: nonNegativeInteger
  min count: 1
  max count: 1
  min inclusive: 1
  max inclusive: 1000
  message: Image post-processing must specify modification count between 1 and 1000.
property:
  path: modificationSoftware
  datatype: string
  min count: 1
  max count: 1
  min length: 2
  max length: 100
  message: Modification software must be specified (2-100 characters).

Text Overlay Shape
type: NodeShape
target class: TextOverlay
comment: Validation shape for text overlay instances.
property:
  path: textType
  datatype: string
  min count: 1
  max count: 1
  in: victim_name
  in: victim_name_and_slang
  in: explicit_text
  in: identifying_text
  in: threatening_text
  in: instructional_text
  message: Text overlay must specify text type from the allowed list.
property:
  path: textPlacement
  datatype: string
  min count: 1
  max count: 1
  in: overlay_on_image
  in: caption_below
  in: watermark
  in: corner_placement
  in: center_placement
  message: Text overlay must specify placement from the allowed list.

ProducesContentShape
type: PropertyShape
path: producesContent
name: produces content
description: Links producer to content they create
class: UcoObject
min count: 0

UsesEquipmentShape
type: PropertyShape
path: usesEquipment
name: uses equipment
description: Links production to equipment used
class: ProductionEquipment
min count: 0

ProducedAtShape
type: PropertyShape
path: producedAt
name: produced at
description: Links production to location where it occurred
class: Location
min count: 0

FacilitatesProductionShape
type: PropertyShape
path: facilitatesProduction
name: facilitates production
description: Links facilitator to production they assist
class: ProductionOffense
min count: 0

ModifiesImagesShape
type: PropertyShape
path: modifiesImages
name: modifies images
description: Links post-processing to image modification
class: UcoObject
min count: 0

OverlaysTextShape
type: PropertyShape
path: overlaysText
name: overlays text
description: Links text overlay to image modification
class: ImagePostProcessing
min count: 0

Production Cross Reference Shape
type: NodeShape
target class: ProductionOffense
comment: Validates cross-references between production and related entities.
sparql:
  message: Production offense should have at least one producer or facilitator.
  select: SELECT $this WHERE { $this a cacontology-production:ProductionOffense . FILTER NOT EXISTS { { ?producer cacontology-production:producesContent $this } UNION { ?facilitator cacontology-production:facilitatesProduction $this } } }

Equipment Usage Validation Shape
type: NodeShape
target class: ProductionOffense
comment: Validates that production offenses have appropriate equipment.
sparql:
  message: Production offense should specify equipment used for recording or streaming.
  select: SELECT $this WHERE { $this a cacontology-production:ProductionOffense ; cacontology-production:productionMethod ?method . FILTER (?method IN ("direct_recording", "video_recording", "live_streaming")) FILTER NOT EXISTS { $this cacontology-production:usesEquipment ?equipment . ?equipment a cacontology-production:RecordingDevice . } }

Temporal Validation Shape
type: NodeShape
target class: ProductionOffense
comment: Validates temporal consistency in production offenses.
sparql:
  message: Start time must be before end time when both are specified.
  select: SELECT $this WHERE { $this uco-core:startTime ?start ; uco-core:endTime ?end . FILTER (?start >= ?end) }

Extended Operation Validation Shape
type: NodeShape
target class: ExtendedProductionOperation
comment: Validates extended production operation consistency.
sparql:
  message: Extended operation duration should be consistent with total sessions.
  select: SELECT $this WHERE { $this cacontology-production:operationDuration ?duration ; cacontology-production:totalSessions ?sessions . FILTER (?sessions > (?duration * 10)) }

Data Quality Shape
type: NodeShape
target class: ProductionOffense
comment: Validates data quality for production offenses.
property:
  path: label
  datatype: string
  min count: 0
  max count: 1
  min length: 5
  max length: 200
  message: Label should be between 5 and 200 characters when provided.
property:
  path: comment
  datatype: string
  min count: 0
  max count: 1
  min length: 10
  max length: 1000
  message: Comment should be between 10 and 1000 characters when provided.