@hawkeyexl/manni 4.0.3 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,689 @@
1
+ # manni graph graph shapes 1.0.0 — the published SHACL contract for graphs emitted
2
+ # by `manni graph build`. Consumed by `manni graph check` (and the `manni graph fill`
3
+ # guardrail).
4
+ #
5
+ # Three segments, per the versioning convention in CLAUDE.md, and the first
6
+ # file that convention binds. The two-segment files whose history the notes
7
+ # below record are gone; this is the only shapes file that ships. MAJOR,
8
+ # because a graph that used to validate can now fail — see the language
9
+ # pattern.
10
+ #
11
+ # 1.0.0 makes language a scope dimension and gives translations a relation
12
+ # (ADR 01037):
13
+ #
14
+ # - dcterms:language gains a BCP-47 sh:pattern. `lang: English` validated
15
+ # under 0.7 and does not here. The value is a partition key — scope
16
+ # filtering, per-language coverage, and the per-locale retrieval artifacts
17
+ # all group on it — so "a string" is not the contract, any more than it was
18
+ # for graph:contentHash. A free-text label silently partitions a corpus into
19
+ # buckets of one.
20
+ # - Document learns schema:translationOfWork and schema:workTranslation, the
21
+ # two directions manni graph materializes from one authored `translation-of` key.
22
+ # Without them the closed shape rejects every translated corpus, which is
23
+ # the mechanism working, not a bug to route around.
24
+ #
25
+ # There is deliberately no negative-language predicate, and so no sh:disjoint
26
+ # pair as there is for variants and subjects (ADR 01014). A document has one
27
+ # language, which sh:maxCount 1 already says; "not in German" is not a claim an
28
+ # author makes.
29
+ #
30
+ # 0.7 required graph:contentHash on every Document: a lowercase sha256 hex
31
+ # digest of the source file's content (ADR 01036). Required rather than
32
+ # optional because the predicate is unconditional — it is intrinsic like
33
+ # graph:path, not gated behind a derive source — so optional would let a
34
+ # regression that stops emitting it pass `check` in silence. A graph built
35
+ # before 0.7 therefore fails it until rebuilt. There is no older file to pin
36
+ # check.shapes to any more: 0.1 through 0.7 were dockg's published history,
37
+ # which nothing read and which went with that identity (proposal 0051 §7).
38
+ #
39
+ # 0.6 changed no constraint. It existed because the graph: namespace moved to a
40
+ # location that resolves — https://hawkeyexl.github.io/manni/graph/ns# — alongside the
41
+ # vocabulary document that defines every term (ADR 01030). Published shapes
42
+ # are immutable, so a namespace change is a new file rather than an edit. The
43
+ # shapes namespace moves with each version: dsh: is now
44
+ # https://hawkeyexl.github.io/manni/graph/shapes/1.0.0#.
45
+ #
46
+ # 0.5 reified fill provenance (ADR 01015): the graph-fill activity now links to one
47
+ # entry node per filled field via graph:filledFieldEntry, and each entry carries
48
+ # graph:filledField + an optional graph:confidence decimal (replacing the bare
49
+ # graph:filledField literal on the activity). 0.4 added negative scope (ADR
50
+ # 01014); 0.3 added section-level iiRDS typing (ADR 01013); 0.2 added iiRDS
51
+ # Core/Software typing on Documents (ADR 01012).
52
+ #
53
+ # This file is immutable once published: evolve by adding a new version file
54
+ # (shapes-1.1.0.ttl), never by editing this one. Every shape has a named IRI — the
55
+ # only anonymous nodes are the sh:ignoredProperties and sh:in lists the SHACL
56
+ # vocabulary requires — so the file diffs cleanly.
57
+ #
58
+ # Severity contract: these three levels map onto the family scale every manni
59
+ # tool speaks (proposal 0051 §2). sh:Violation → error, and errors exit 1;
60
+ # sh:Warning → warning and sh:Info → notice, both reported at exit 0. Each
61
+ # finding also keeps SHACL's own word, as `shaclSeverity`. Cycle detection
62
+ # (skos:broader loops) and broaderTransitive/related disjointness cannot be
63
+ # expressed in core SHACL and are enforced by graph's check core alongside these
64
+ # shapes.
65
+
66
+ @prefix dcterms: <http://purl.org/dc/terms/> .
67
+ @prefix graph: <https://hawkeyexl.github.io/manni/graph/ns#> .
68
+ @prefix dsh: <https://hawkeyexl.github.io/manni/graph/shapes/1.0.0#> .
69
+ @prefix foaf: <http://xmlns.com/foaf/0.1/> .
70
+ @prefix iirds: <http://iirds.tekom.de/iirds#> .
71
+ @prefix iirdsSft: <http://iirds.tekom.de/iirds/domain/software#> .
72
+ @prefix prov: <http://www.w3.org/ns/prov#> .
73
+ @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
74
+ @prefix schema: <https://schema.org/> .
75
+ @prefix sh: <http://www.w3.org/ns/shacl#> .
76
+ @prefix skos: <http://www.w3.org/2004/02/skos/core#> .
77
+ @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
78
+
79
+ # --- Documents ---------------------------------------------------------------
80
+ # Closed over the full derived predicate set: an unexpected predicate from a
81
+ # new derive source fails loudly (same stance as additionalProperties: false).
82
+
83
+ dsh:DocumentShape
84
+ a sh:NodeShape ;
85
+ sh:targetClass graph:Document ;
86
+ sh:closed true ;
87
+ sh:ignoredProperties ( rdf:type ) ;
88
+ sh:property
89
+ dsh:Document-path ,
90
+ dsh:Document-contentHash ,
91
+ dsh:Document-title ,
92
+ dsh:Document-description ,
93
+ dsh:Document-creator ,
94
+ dsh:Document-created ,
95
+ dsh:Document-modified ,
96
+ dsh:Document-language ,
97
+ dsh:Document-primaryTopic ,
98
+ dsh:Document-subject ,
99
+ dsh:Document-hasPart ,
100
+ dsh:Document-references ,
101
+ dsh:Document-brokenLink ,
102
+ dsh:Document-brokenSectionRef ,
103
+ dsh:Document-image ,
104
+ dsh:Document-codeLanguage ,
105
+ dsh:Document-topicType ,
106
+ dsh:Document-appliesToVariant ,
107
+ dsh:Document-softwareLifecyclePhase ,
108
+ dsh:Document-softwareSubject ,
109
+ dsh:Document-notApplicableToVariant ,
110
+ dsh:Document-notSoftwareSubject ,
111
+ dsh:Document-translationOfWork ,
112
+ dsh:Document-workTranslation ,
113
+ dsh:Document-wasAttributedTo ,
114
+ dsh:Document-qualifiedAttribution ,
115
+ dsh:Document-generatedAtTime ,
116
+ dsh:Document-wasDerivedFrom ,
117
+ dsh:Document-wasRevisionOf ,
118
+ dsh:Document-wasGeneratedBy .
119
+
120
+ dsh:Document-path
121
+ a sh:PropertyShape ;
122
+ sh:path graph:path ;
123
+ sh:datatype xsd:string ;
124
+ sh:minCount 1 ;
125
+ sh:maxCount 1 .
126
+
127
+ # Pattern-checked, not merely typed: the value is a join key other systems index
128
+ # on, so "a string" is not the contract — 64 lowercase hex characters is.
129
+ dsh:Document-contentHash
130
+ a sh:PropertyShape ;
131
+ sh:path graph:contentHash ;
132
+ sh:datatype xsd:string ;
133
+ sh:pattern "^[0-9a-f]{64}$" ;
134
+ sh:minCount 1 ;
135
+ sh:maxCount 1 .
136
+
137
+ dsh:Document-title
138
+ a sh:PropertyShape ;
139
+ sh:path dcterms:title ;
140
+ sh:maxCount 1 .
141
+
142
+ dsh:Document-description
143
+ a sh:PropertyShape ;
144
+ sh:path dcterms:description ;
145
+ sh:maxCount 1 .
146
+
147
+ # Literal when the provenance derive source is off, agent IRI when it is on —
148
+ # both are valid output, so no nodeKind constraint.
149
+ dsh:Document-creator
150
+ a sh:PropertyShape ;
151
+ sh:path dcterms:creator .
152
+
153
+ dsh:Document-created
154
+ a sh:PropertyShape ;
155
+ sh:path dcterms:created ;
156
+ sh:maxCount 1 .
157
+
158
+ dsh:Document-modified
159
+ a sh:PropertyShape ;
160
+ sh:path dcterms:modified ;
161
+ sh:maxCount 1 .
162
+
163
+ # Pattern-checked for the same reason graph:contentHash is: the value is a
164
+ # partition key, not prose. The grammar is BCP-47's common shape —
165
+ # language(2-3) + optional script(4) + optional region(2 alpha or 3 digit) +
166
+ # variants — which accepts de, de-DE, zh-Hans, zh-Hans-CN, pt-BR, und, and
167
+ # rejects English and de_DE.
168
+ dsh:Document-language
169
+ a sh:PropertyShape ;
170
+ sh:path dcterms:language ;
171
+ sh:datatype xsd:string ;
172
+ sh:pattern "^[A-Za-z]{2,3}(-[A-Za-z]{4})?(-([A-Za-z]{2}|[0-9]{3}))?(-([A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3}))*$" ;
173
+ sh:maxCount 1 .
174
+
175
+ # The two directions of one authored `translation-of` (ADR 01037). No
176
+ # sh:maxCount: a source document has as many translations as the corpus
177
+ # carries, and a translation may itself be the source of another.
178
+ # schema:translationOfWork accepts any IRI because a target outside the corpus
179
+ # is a URL manni graph resolves but does not analyze; schema:workTranslation is only
180
+ # ever minted at a corpus document, so it carries the class constraint.
181
+ dsh:Document-translationOfWork
182
+ a sh:PropertyShape ;
183
+ sh:path schema:translationOfWork ;
184
+ sh:nodeKind sh:IRI .
185
+
186
+ dsh:Document-workTranslation
187
+ a sh:PropertyShape ;
188
+ sh:path schema:workTranslation ;
189
+ sh:nodeKind sh:IRI ;
190
+ sh:class graph:Document .
191
+
192
+ dsh:Document-primaryTopic
193
+ a sh:PropertyShape ;
194
+ sh:path foaf:primaryTopic ;
195
+ sh:nodeKind sh:IRI ;
196
+ sh:class skos:Concept ;
197
+ sh:maxCount 1 .
198
+
199
+ # Warning, not Violation: a dcterms:subject pointing at an untyped node is a
200
+ # half-built concept — worth surfacing, but merged external data may
201
+ # legitimately use other subject vocabularies.
202
+ dsh:Document-subject
203
+ a sh:PropertyShape ;
204
+ sh:path dcterms:subject ;
205
+ sh:nodeKind sh:IRI ;
206
+ sh:class skos:Concept ;
207
+ sh:severity sh:Warning .
208
+
209
+ dsh:Document-hasPart
210
+ a sh:PropertyShape ;
211
+ sh:path dcterms:hasPart ;
212
+ sh:nodeKind sh:IRI ;
213
+ sh:class graph:Section .
214
+
215
+ dsh:Document-references
216
+ a sh:PropertyShape ;
217
+ sh:path dcterms:references ;
218
+ sh:nodeKind sh:IRI .
219
+
220
+ dsh:Document-brokenLink
221
+ a sh:PropertyShape ;
222
+ sh:path graph:brokenLink ;
223
+ sh:datatype xsd:string .
224
+
225
+ # A graph.sections key that named no heading (surfaced by stats, gated by --check).
226
+ dsh:Document-brokenSectionRef
227
+ a sh:PropertyShape ;
228
+ sh:path graph:brokenSectionRef ;
229
+ sh:datatype xsd:string .
230
+
231
+ dsh:Document-image
232
+ a sh:PropertyShape ;
233
+ sh:path schema:image ;
234
+ sh:nodeKind sh:IRI .
235
+
236
+ dsh:Document-codeLanguage
237
+ a sh:PropertyShape ;
238
+ sh:path graph:codeLanguage ;
239
+ sh:datatype xsd:string .
240
+
241
+ # iiRDS Core topic type: exactly the six published Generic* instances.
242
+ dsh:Document-topicType
243
+ a sh:PropertyShape ;
244
+ sh:path iirds:has-topic-type ;
245
+ sh:nodeKind sh:IRI ;
246
+ sh:maxCount 1 ;
247
+ sh:in (
248
+ iirds:GenericTask
249
+ iirds:GenericConcept
250
+ iirds:GenericReference
251
+ iirds:GenericLearning
252
+ iirds:GenericTroubleshooting
253
+ iirds:GenericForm
254
+ ) .
255
+
256
+ # iiRDS product/variant applicability: minted iirds:ProductVariant nodes.
257
+ dsh:Document-appliesToVariant
258
+ a sh:PropertyShape ;
259
+ sh:path iirds:relates-to-product-variant ;
260
+ sh:nodeKind sh:IRI ;
261
+ sh:class iirds:ProductVariant .
262
+
263
+ # iiRDS Software domain — product lifecycle phases (the six published instances).
264
+ dsh:Document-softwareLifecyclePhase
265
+ a sh:PropertyShape ;
266
+ sh:path iirds:relates-to-product-lifecycle-phase ;
267
+ sh:nodeKind sh:IRI ;
268
+ sh:in (
269
+ iirdsSft:Administration
270
+ iirdsSft:Customization
271
+ iirdsSft:Update
272
+ iirdsSft:Deployment
273
+ iirdsSft:Integration
274
+ iirdsSft:Deinstallation
275
+ ) .
276
+
277
+ # iiRDS Software domain — information subjects (the three published instances).
278
+ dsh:Document-softwareSubject
279
+ a sh:PropertyShape ;
280
+ sh:path iirds:has-subject ;
281
+ sh:nodeKind sh:IRI ;
282
+ sh:in (
283
+ iirdsSft:Architecture
284
+ iirdsSft:Interface
285
+ iirdsSft:SystemRequirement
286
+ ) .
287
+
288
+ # Negative scope (ADR 01014): disjoint from the positive relation, so a variant
289
+ # or subject asserted as both applicable and not-applicable on one node fails.
290
+ dsh:Document-notApplicableToVariant
291
+ a sh:PropertyShape ;
292
+ sh:path graph:notApplicableToVariant ;
293
+ sh:nodeKind sh:IRI ;
294
+ sh:class iirds:ProductVariant ;
295
+ sh:disjoint iirds:relates-to-product-variant .
296
+
297
+ dsh:Document-notSoftwareSubject
298
+ a sh:PropertyShape ;
299
+ sh:path graph:notSoftwareSubject ;
300
+ sh:nodeKind sh:IRI ;
301
+ sh:disjoint iirds:has-subject ;
302
+ sh:in (
303
+ iirdsSft:Architecture
304
+ iirdsSft:Interface
305
+ iirdsSft:SystemRequirement
306
+ ) .
307
+
308
+ dsh:Document-wasAttributedTo
309
+ a sh:PropertyShape ;
310
+ sh:path prov:wasAttributedTo ;
311
+ sh:nodeKind sh:IRI .
312
+
313
+ dsh:Document-qualifiedAttribution
314
+ a sh:PropertyShape ;
315
+ sh:path prov:qualifiedAttribution ;
316
+ sh:nodeKind sh:IRI ;
317
+ sh:class prov:Attribution .
318
+
319
+ dsh:Document-generatedAtTime
320
+ a sh:PropertyShape ;
321
+ sh:path prov:generatedAtTime ;
322
+ sh:maxCount 1 .
323
+
324
+ dsh:Document-wasDerivedFrom
325
+ a sh:PropertyShape ;
326
+ sh:path prov:wasDerivedFrom ;
327
+ sh:nodeKind sh:IRI .
328
+
329
+ dsh:Document-wasRevisionOf
330
+ a sh:PropertyShape ;
331
+ sh:path prov:wasRevisionOf ;
332
+ sh:nodeKind sh:IRI .
333
+
334
+ dsh:Document-wasGeneratedBy
335
+ a sh:PropertyShape ;
336
+ sh:path prov:wasGeneratedBy ;
337
+ sh:nodeKind sh:IRI ;
338
+ sh:class prov:Activity .
339
+
340
+ # --- Product variants --------------------------------------------------------
341
+ # Minted from graph.applies-to. manni graph references iiRDS ProductVariant as a class
342
+ # but only labels the node — the iiRDS vocabulary itself is never re-emitted.
343
+
344
+ dsh:ProductVariantShape
345
+ a sh:NodeShape ;
346
+ sh:targetClass iirds:ProductVariant ;
347
+ sh:closed true ;
348
+ sh:ignoredProperties ( rdf:type ) ;
349
+ sh:property dsh:ProductVariant-title .
350
+
351
+ dsh:ProductVariant-title
352
+ a sh:PropertyShape ;
353
+ sh:path dcterms:title ;
354
+ sh:minCount 1 ;
355
+ sh:maxCount 1 .
356
+
357
+ # --- Sections ----------------------------------------------------------------
358
+
359
+ dsh:SectionShape
360
+ a sh:NodeShape ;
361
+ sh:targetClass graph:Section ;
362
+ sh:closed true ;
363
+ sh:ignoredProperties ( rdf:type ) ;
364
+ sh:property
365
+ dsh:Section-title ,
366
+ dsh:Section-level ,
367
+ dsh:Section-order ,
368
+ dsh:Section-hasPart ,
369
+ dsh:Section-subject ,
370
+ dsh:Section-topicType ,
371
+ dsh:Section-appliesToVariant ,
372
+ dsh:Section-softwareLifecyclePhase ,
373
+ dsh:Section-softwareSubject ,
374
+ dsh:Section-notApplicableToVariant ,
375
+ dsh:Section-notSoftwareSubject .
376
+
377
+ dsh:Section-title
378
+ a sh:PropertyShape ;
379
+ sh:path dcterms:title ;
380
+ sh:minCount 1 ;
381
+ sh:maxCount 1 .
382
+
383
+ dsh:Section-level
384
+ a sh:PropertyShape ;
385
+ sh:path graph:level ;
386
+ sh:datatype xsd:integer ;
387
+ sh:minCount 1 ;
388
+ sh:maxCount 1 .
389
+
390
+ dsh:Section-order
391
+ a sh:PropertyShape ;
392
+ sh:path graph:order ;
393
+ sh:datatype xsd:integer ;
394
+ sh:minCount 1 ;
395
+ sh:maxCount 1 .
396
+
397
+ dsh:Section-hasPart
398
+ a sh:PropertyShape ;
399
+ sh:path dcterms:hasPart ;
400
+ sh:nodeKind sh:IRI ;
401
+ sh:class graph:Section .
402
+
403
+ # Section-level iiRDS typing (ADR 01013) — the same constraints the Document
404
+ # shape carries for these predicates.
405
+
406
+ # Warning, not Violation, exactly as Document-subject: a subject pointing at an
407
+ # untyped node is a half-built concept, and merged data may use other schemes.
408
+ dsh:Section-subject
409
+ a sh:PropertyShape ;
410
+ sh:path dcterms:subject ;
411
+ sh:nodeKind sh:IRI ;
412
+ sh:class skos:Concept ;
413
+ sh:severity sh:Warning .
414
+
415
+ dsh:Section-topicType
416
+ a sh:PropertyShape ;
417
+ sh:path iirds:has-topic-type ;
418
+ sh:nodeKind sh:IRI ;
419
+ sh:maxCount 1 ;
420
+ sh:in (
421
+ iirds:GenericTask
422
+ iirds:GenericConcept
423
+ iirds:GenericReference
424
+ iirds:GenericLearning
425
+ iirds:GenericTroubleshooting
426
+ iirds:GenericForm
427
+ ) .
428
+
429
+ dsh:Section-appliesToVariant
430
+ a sh:PropertyShape ;
431
+ sh:path iirds:relates-to-product-variant ;
432
+ sh:nodeKind sh:IRI ;
433
+ sh:class iirds:ProductVariant .
434
+
435
+ dsh:Section-softwareLifecyclePhase
436
+ a sh:PropertyShape ;
437
+ sh:path iirds:relates-to-product-lifecycle-phase ;
438
+ sh:nodeKind sh:IRI ;
439
+ sh:in (
440
+ iirdsSft:Administration
441
+ iirdsSft:Customization
442
+ iirdsSft:Update
443
+ iirdsSft:Deployment
444
+ iirdsSft:Integration
445
+ iirdsSft:Deinstallation
446
+ ) .
447
+
448
+ dsh:Section-softwareSubject
449
+ a sh:PropertyShape ;
450
+ sh:path iirds:has-subject ;
451
+ sh:nodeKind sh:IRI ;
452
+ sh:in (
453
+ iirdsSft:Architecture
454
+ iirdsSft:Interface
455
+ iirdsSft:SystemRequirement
456
+ ) .
457
+
458
+ # Section-level negative scope (ADR 01014), disjoint from the positive relation.
459
+ dsh:Section-notApplicableToVariant
460
+ a sh:PropertyShape ;
461
+ sh:path graph:notApplicableToVariant ;
462
+ sh:nodeKind sh:IRI ;
463
+ sh:class iirds:ProductVariant ;
464
+ sh:disjoint iirds:relates-to-product-variant .
465
+
466
+ dsh:Section-notSoftwareSubject
467
+ a sh:PropertyShape ;
468
+ sh:path graph:notSoftwareSubject ;
469
+ sh:nodeKind sh:IRI ;
470
+ sh:disjoint iirds:has-subject ;
471
+ sh:in (
472
+ iirdsSft:Architecture
473
+ iirdsSft:Interface
474
+ iirdsSft:SystemRequirement
475
+ ) .
476
+
477
+ # --- Concepts ----------------------------------------------------------------
478
+
479
+ dsh:ConceptShape
480
+ a sh:NodeShape ;
481
+ sh:targetClass skos:Concept ;
482
+ sh:closed true ;
483
+ sh:ignoredProperties ( rdf:type ) ;
484
+ sh:property
485
+ dsh:Concept-prefLabel ,
486
+ dsh:Concept-prefLabel-collision ,
487
+ dsh:Concept-inScheme ,
488
+ dsh:Concept-altLabel ,
489
+ dsh:Concept-broader ,
490
+ dsh:Concept-narrower ,
491
+ dsh:Concept-related .
492
+
493
+ dsh:Concept-prefLabel
494
+ a sh:PropertyShape ;
495
+ sh:path skos:prefLabel ;
496
+ sh:minCount 1 .
497
+
498
+ # Warning, not Violation: concept IRIs deliberately converge on slugified
499
+ # labels (manni graph's design), so "Configuration" and "configuration" merge into
500
+ # one concept carrying both spellings. SKOS wants exactly one prefLabel —
501
+ # surface the collision so authors can settle on a spelling, but don't fail
502
+ # the build over the convergence feature working as designed.
503
+ dsh:Concept-prefLabel-collision
504
+ a sh:PropertyShape ;
505
+ sh:path skos:prefLabel ;
506
+ sh:maxCount 1 ;
507
+ sh:severity sh:Warning ;
508
+ sh:message "concept carries multiple prefLabels (same slug, different spellings) — settle on one spelling" .
509
+
510
+ dsh:Concept-inScheme
511
+ a sh:PropertyShape ;
512
+ sh:path skos:inScheme ;
513
+ sh:nodeKind sh:IRI ;
514
+ sh:minCount 1 .
515
+
516
+ dsh:Concept-altLabel
517
+ a sh:PropertyShape ;
518
+ sh:path skos:altLabel .
519
+
520
+ dsh:Concept-broader
521
+ a sh:PropertyShape ;
522
+ sh:path skos:broader ;
523
+ sh:nodeKind sh:IRI ;
524
+ sh:class skos:Concept .
525
+
526
+ dsh:Concept-narrower
527
+ a sh:PropertyShape ;
528
+ sh:path skos:narrower ;
529
+ sh:nodeKind sh:IRI ;
530
+ sh:class skos:Concept .
531
+
532
+ # One-hop related/broader disjointness; the transitive form lives in the
533
+ # check core's TypeScript walk.
534
+ dsh:Concept-related
535
+ a sh:PropertyShape ;
536
+ sh:path skos:related ;
537
+ sh:nodeKind sh:IRI ;
538
+ sh:class skos:Concept ;
539
+ sh:disjoint skos:broader .
540
+
541
+ dsh:SchemeShape
542
+ a sh:NodeShape ;
543
+ sh:targetClass skos:ConceptScheme ;
544
+ sh:closed true ;
545
+ sh:ignoredProperties ( rdf:type ) ;
546
+ sh:property dsh:Scheme-title .
547
+
548
+ dsh:Scheme-title
549
+ a sh:PropertyShape ;
550
+ sh:path dcterms:title ;
551
+ sh:maxCount 1 .
552
+
553
+ # --- Provenance --------------------------------------------------------------
554
+
555
+ dsh:PersonShape
556
+ a sh:NodeShape ;
557
+ sh:targetClass prov:Person ;
558
+ sh:closed true ;
559
+ sh:ignoredProperties ( rdf:type ) ;
560
+ sh:property dsh:Agent-name .
561
+
562
+ dsh:OrganizationShape
563
+ a sh:NodeShape ;
564
+ sh:targetClass prov:Organization ;
565
+ sh:closed true ;
566
+ sh:ignoredProperties ( rdf:type ) ;
567
+ sh:property dsh:Agent-name .
568
+
569
+ dsh:SoftwareAgentShape
570
+ a sh:NodeShape ;
571
+ sh:targetClass prov:SoftwareAgent ;
572
+ sh:closed true ;
573
+ sh:ignoredProperties ( rdf:type ) ;
574
+ sh:property
575
+ dsh:Agent-name ,
576
+ dsh:SoftwareAgent-version .
577
+
578
+ dsh:Agent-name
579
+ a sh:PropertyShape ;
580
+ sh:path foaf:name ;
581
+ sh:minCount 1 .
582
+
583
+ dsh:SoftwareAgent-version
584
+ a sh:PropertyShape ;
585
+ sh:path graph:version ;
586
+ sh:datatype xsd:string ;
587
+ sh:maxCount 1 .
588
+
589
+ dsh:ActivityShape
590
+ a sh:NodeShape ;
591
+ sh:targetClass prov:Activity ;
592
+ sh:closed true ;
593
+ sh:ignoredProperties ( rdf:type ) ;
594
+ sh:property
595
+ dsh:Activity-wasAssociatedWith ,
596
+ dsh:Activity-qualifiedAssociation ,
597
+ dsh:Activity-filledFieldEntry ,
598
+ dsh:Activity-generated ,
599
+ dsh:Activity-used ,
600
+ dsh:Activity-endedAtTime .
601
+
602
+ dsh:Activity-wasAssociatedWith
603
+ a sh:PropertyShape ;
604
+ sh:path prov:wasAssociatedWith ;
605
+ sh:nodeKind sh:IRI .
606
+
607
+ dsh:Activity-qualifiedAssociation
608
+ a sh:PropertyShape ;
609
+ sh:path prov:qualifiedAssociation ;
610
+ sh:nodeKind sh:IRI ;
611
+ sh:class prov:Association .
612
+
613
+ # The fill activity links to one entry node per filled field (ADR 01015).
614
+ dsh:Activity-filledFieldEntry
615
+ a sh:PropertyShape ;
616
+ sh:path graph:filledFieldEntry ;
617
+ sh:nodeKind sh:IRI .
618
+
619
+ # Each filled-field entry carries the field name and (when fill recorded one)
620
+ # the model's confidence. Targeted by object position — the entry nodes are not
621
+ # separately typed, keeping the node vocabulary at two classes.
622
+ dsh:FilledFieldEntryShape
623
+ a sh:NodeShape ;
624
+ sh:targetObjectsOf graph:filledFieldEntry ;
625
+ sh:closed true ;
626
+ sh:ignoredProperties ( rdf:type ) ;
627
+ sh:property
628
+ dsh:FilledFieldEntry-name ,
629
+ dsh:FilledFieldEntry-confidence .
630
+
631
+ dsh:FilledFieldEntry-name
632
+ a sh:PropertyShape ;
633
+ sh:path graph:filledField ;
634
+ sh:datatype xsd:string ;
635
+ sh:minCount 1 ;
636
+ sh:maxCount 1 .
637
+
638
+ dsh:FilledFieldEntry-confidence
639
+ a sh:PropertyShape ;
640
+ sh:path graph:confidence ;
641
+ sh:datatype xsd:decimal ;
642
+ sh:maxCount 1 .
643
+
644
+ dsh:Activity-generated
645
+ a sh:PropertyShape ;
646
+ sh:path prov:generated ;
647
+ sh:nodeKind sh:IRI .
648
+
649
+ dsh:Activity-used
650
+ a sh:PropertyShape ;
651
+ sh:path prov:used ;
652
+ sh:nodeKind sh:IRI .
653
+
654
+ dsh:Activity-endedAtTime
655
+ a sh:PropertyShape ;
656
+ sh:path prov:endedAtTime ;
657
+ sh:datatype xsd:dateTime ;
658
+ sh:maxCount 1 .
659
+
660
+ dsh:AttributionShape
661
+ a sh:NodeShape ;
662
+ sh:targetClass prov:Attribution ;
663
+ sh:closed true ;
664
+ sh:ignoredProperties ( rdf:type ) ;
665
+ sh:property
666
+ dsh:Qualification-agent ,
667
+ dsh:Qualification-hadRole .
668
+
669
+ dsh:AssociationShape
670
+ a sh:NodeShape ;
671
+ sh:targetClass prov:Association ;
672
+ sh:closed true ;
673
+ sh:ignoredProperties ( rdf:type ) ;
674
+ sh:property
675
+ dsh:Qualification-agent ,
676
+ dsh:Qualification-hadRole .
677
+
678
+ dsh:Qualification-agent
679
+ a sh:PropertyShape ;
680
+ sh:path prov:agent ;
681
+ sh:nodeKind sh:IRI ;
682
+ sh:minCount 1 ;
683
+ sh:maxCount 1 .
684
+
685
+ dsh:Qualification-hadRole
686
+ a sh:PropertyShape ;
687
+ sh:path prov:hadRole ;
688
+ sh:nodeKind sh:IRI ;
689
+ sh:maxCount 1 .