-
Notifications
You must be signed in to change notification settings - Fork 2
/
bookHtml012.html
1557 lines (1535 loc) · 332 KB
/
bookHtml012.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="hevea 2.23">
<link rel="stylesheet" type="text/css" href="book.css"><link rel="stylesheet" type="text/css" href="bookHtml.css">
<title>Applications</title>
</head>
<body>
<a href="bookHtml011.html"><img src="previous_motif.gif" alt="Previous"></a>
<a href="index.html"><img src="contents_motif.gif" alt="Up"></a>
<a href="bookHtml013.html"><img src="next_motif.gif" alt="Next"></a>
<hr>
<header>
<a href="http://book.validatingrdf.com">Validating RDF data</a>
<img src="cover.jpg"></img>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-112019120-1"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-112019120-1');
</script>
</header>
<h1 class="chapter" id="sec177">Chapter 6 Applications</h1>
<p>
<a id="ch6"></a>
<a id="ch060Applications"></a></p><p>In this chapter we describe several applications of RDF validation.
We start with the WebIndex, a medium-size linked data portal that was
one of the earliest applications of ShEx.
We describe it using ShEx and SHACL so the reader can see how both formalisms can be applied to describe RDF data.</p><p>In Section <a href="#ch060FHIR">6.2</a>, we present the use of ShEx in HL7 FHIR,
which was one of the main motivations for the development of ShEx.</p><p>Section <a href="#ch070SciGraph">6.3</a> describes Springer Nature SciGraph,
a real-world application of SHACL. Section <a href="#ch070DBpedia">6.4</a>
talks about validation use cases that have emerged in the DBpedia project.</p><p>We end the chapter with two exercises:
the validation of ShEx files, encoded as RDF using ShEx itself
(Section <a href="#ch070ShExForShEx">6.5</a>),
and the validation of SHACL shapes graphs in RDF using SHACL
(Section <a href="#ch070ShaclInShacl">6.6</a>).
These exercises help us understand the expressiveness of both formalisms.</p>
<h2 class="section" id="sec178">6.1 Describing a Linked Data Portal</h2>
<p>
<a id="ch6.sec1"></a></p><p>Linked data portals have emerged as a way to publish data on the Web in accordance with principles that
improve data reuse and integration.
As discussed in Section <a href="bookHtml007.html#LinkedDataPrinciples">1.1</a>, linked data uses RDF
to make statements that establish relationships between arbitrary things.
In this section, we consider one of the earliest practical applications of ShEx,
the description of a real linked data portal, the WebIndex, and its data model.
Some contents of this section have been taken from this paper [<a href="bookHtml018.html#LabraValidatingDescribingDataPortalsArxivVersion2017">58</a>] where
we also compare the performance of two early implementations of ShEx and SHACL.</p><p>The WebIndex is a multi-dimensional measure of the World Wide Web’s contribution to development and human rights globally.
In its latest edition (from 2014), it covers 81 countries and incorporates indicators that assess several areas such as universal access;
freedom and openness; relevant content; and empowerment.
Its first version provided a data portal where the data was obtained by transforming raw observations and precomputed values from Excel sheets into RDF.
The second version added an approach to validation and computation that resulted in a verifiable version of the index data.</p><p>The WebIndex data model is based on the RDF Data Cube vocabulary [<a href="bookHtml018.html#RDFDataCube">24</a>]
and reuses several vocabularies such as Organization ontology [<a href="bookHtml018.html#Organization14">83</a>] and
Dublin Core [<a href="bookHtml018.html#DublinCore">10</a>]. </p><p>Figure <a href="#SimplifiedModel">6.1</a> shows the main concepts of the data model.
The boxes represent the different shapes of nodes that are published in the data portal.</p><blockquote class="figure"><div class="center"><hr class="c021"></div>
<div class="center">
<img src="wiModel.png">
</div>
<a id="SimplifiedModel"></a>
<div class="caption"><table class="c002 cellpading0"><tr><td class="c018">Figure 6.1: Simplified WebIndex data model.</td></tr>
</table></div>
<div class="center"><hr class="c021"></div></blockquote><p>The main concept is an observation of type
<code><span class="c004">wf</span></code><code>:</code><code><span class="c006">Observation</span></code> which has a float value
<code><span class="c004">cex</span></code><code>:</code><code><span class="c006">value</span></code> for a given indicator, as well as the country, year, and dataset.
Observations can be raw observations, which are obtained from an external source, or computed observations,
which are obtained from other observations by computational processes. </p><p>A dataset contains a number of slices, each of which also contains a number of observations.
Indicators are provided by an organization of type
<code><span class="c004">org</span></code><code>:</code><code><span class="c006">Organization</span></code>, which is based on the Organization ontology. </p><p>Datasets are also published by organizations. </p><p>A sample from the DITU dataset provided by ITU (International Telecommunication Union) states
that, in 2011, Spain had a value of 23.78 for the TU-B (<em>Broadband subscribers per 100 population</em>) indicator.
This information is represented in Turtle as:</p><table class="lstframe c014"><tr><td class="lstlisting"><span class="c011">:</span><span class="c011"><span class="c006">obs8165</span></span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c003">a</span></span><span class="c011"> </span><span class="c011"><span class="c004">qb</span></span><span class="c011">:</span><span class="c011"><span class="c006">Observation</span></span><span class="c011">, </span><span class="c011"><span class="c004">wf</span></span><span class="c011">:</span><span class="c011"><span class="c006">Observation</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">rdfs</span></span><span class="c011">:</span><span class="c011"><span class="c006">label</span></span><span class="c011"> </span><span class="c011"><span class="c005"><span class="c011">"ITU B in ESP"</span></span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">dct</span></span><span class="c011">:</span><span class="c011"><span class="c006">issued</span></span><span class="c011"> </span><span class="c011"><span class="c005"><span class="c011">"2013-05-30T09:15:00"</span></span></span><span class="c011">^^</span><span class="c011"><span class="c004">xsd</span></span><span class="c011">:</span><span class="c011"><span class="c006">dateTime</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">cex</span></span><span class="c011">:</span><span class="c011"><span class="c006">indicator</span></span><span class="c011"> :</span><span class="c011"><span class="c006">ITU_B</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">qb</span></span><span class="c011">:</span><span class="c011"><span class="c006">dataSet</span></span><span class="c011"> :</span><span class="c011"><span class="c006">DITU</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">cex</span></span><span class="c011">:</span><span class="c011"><span class="c006">value</span></span><span class="c011"> </span><span class="c011"><span class="c005"><span class="c011">"23.78"</span></span></span><span class="c011">^^</span><span class="c011"><span class="c004">xsd</span></span><span class="c011">:</span><span class="c011"><span class="c006">float</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">cex</span></span><span class="c011">:</span><span class="c011"><span class="c006">ref</span></span><span class="c011">-</span><span class="c011"><span class="c006">area</span></span><span class="c011"> :</span><span class="c011"><span class="c006">Spain</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">cex</span></span><span class="c011">:</span><span class="c011"><span class="c006">ref</span></span><span class="c011">-</span><span class="c011"><span class="c006">year</span></span><span class="c011"> </span><span class="c011"><span class="c005"><span class="c011">"2011"</span></span></span><span class="c011">^^</span><span class="c011"><span class="c004">xsd</span></span><span class="c011">:</span><span class="c011"><span class="c006">gYear</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">cex</span></span><span class="c011">:</span><span class="c011"><span class="c006">computation</span></span><span class="c011"> :</span><span class="c011"><span class="c006">comp234</span></span><span class="c011"> .</span></td></tr>
</table><p>Data following the WebIndex data model is richly interrelated.
Observations are linked to indicators and to datasets.
Datasets contain links to slices. Slices have links both to indicators and back to observations.
Both datasets and indicators are linked to the organizations by which they are published or made available.
Such links are illustrated in the following example:</p><table class="lstframe c014"><tr><td class="lstlisting"><span class="c011">:</span><span class="c011"><span class="c006">DITU</span></span><span class="c011"> </span><span class="c011"><span class="c003">a</span></span><span class="c011"> </span><span class="c011"><span class="c004">qb</span></span><span class="c011">:</span><span class="c011"><span class="c006">DataSet</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">qb</span></span><span class="c011">:</span><span class="c011"><span class="c006">structure</span></span><span class="c011"> </span><span class="c011"><span class="c004">wf</span></span><span class="c011">:</span><span class="c011"><span class="c006">DSD</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">rdfs</span></span><span class="c011">:</span><span class="c011"><span class="c006">label</span></span><span class="c011"> </span><span class="c011"><span class="c005"><span class="c011">"ITU Dataset"</span></span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">dct</span></span><span class="c011">:</span><span class="c011"><span class="c006">publisher</span></span><span class="c011"> :</span><span class="c011"><span class="c006">ITU</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">qb</span></span><span class="c011">:</span><span class="c011"><span class="c006">slice</span></span><span class="c011"> :</span><span class="c011"><span class="c006">ITU09B</span></span><span class="c011"> ,</span><span class="c011">
</span><span class="c011"> :</span><span class="c011"><span class="c006">ITU10B</span></span><span class="c011">,</span><span class="c011">
</span><span class="c011"> ...</span><span class="c011">
</span><span class="c011">:</span><span class="c011"><span class="c006">ITU09B</span></span><span class="c011"> </span><span class="c011"><span class="c003">a</span></span><span class="c011"> </span><span class="c011"><span class="c004">qb</span></span><span class="c011">:</span><span class="c011"><span class="c006">Slice</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">qb</span></span><span class="c011">:</span><span class="c011"><span class="c006">sliceStructure</span></span><span class="c011"> </span><span class="c011"><span class="c004">wf</span></span><span class="c011">:</span><span class="c011"><span class="c006">sliceByArea</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">qb</span></span><span class="c011">:</span><span class="c011"><span class="c006">observation</span></span><span class="c011"> :</span><span class="c011"><span class="c006">obs8165</span></span><span class="c011">,</span><span class="c011">
</span><span class="c011"> :</span><span class="c011"><span class="c006">obs8166</span></span><span class="c011">,</span><span class="c011">
</span><span class="c011"> ...</span><span class="c011">
</span><span class="c011">:</span><span class="c011"><span class="c006">ITU</span></span><span class="c011"> </span><span class="c011"><span class="c003">a</span></span><span class="c011"> </span><span class="c011"><span class="c004">org</span></span><span class="c011">:</span><span class="c011"><span class="c006">Organization</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">rdfs</span></span><span class="c011">:</span><span class="c011"><span class="c006">label</span></span><span class="c011"> </span><span class="c011"><span class="c005"><span class="c011">"ITU"</span></span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">foaf</span></span><span class="c011">:</span><span class="c011"><span class="c006">homepage</span></span><span class="c011"> </span><span class="c011"><span class="c008"><span class="c011"><http://www.itu.int/></span></span></span><span class="c011"> .</span><span class="c011">
</span><span class="c011">
</span><span class="c011">:</span><span class="c011"><span class="c006">Spain</span></span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">wf</span></span><span class="c011">:</span><span class="c011"><span class="c006">iso2</span></span><span class="c011"> </span><span class="c011"><span class="c005"><span class="c011">"ES"</span></span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">rdfs</span></span><span class="c011">:</span><span class="c011"><span class="c006">label</span></span><span class="c011"> </span><span class="c011"><span class="c005"><span class="c011">"Spain"</span></span></span><span class="c011"> .</span><span class="c011">
</span><span class="c011">
</span><span class="c011">:</span><span class="c011"><span class="c006">ITU_B</span></span><span class="c011"> </span><span class="c011"><span class="c003">a</span></span><span class="c011"> </span><span class="c011"><span class="c004">wf</span></span><span class="c011">:</span><span class="c011"><span class="c006">SecondaryIndicator</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">rdfs</span></span><span class="c011">:</span><span class="c011"><span class="c006">label</span></span><span class="c011"> </span><span class="c011"><span class="c005"><span class="c011">"Broadband subscribers percent"</span></span></span><span class="c011">;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">wf</span></span><span class="c011">:</span><span class="c011"><span class="c006">provider</span></span><span class="c011"> :</span><span class="c011"><span class="c006">ITU</span></span><span class="c011"> .</span></td></tr>
</table><p>For verification, the WebIndex data model includes a representation of computations that declare how each observation has been obtained, either from a raw dataset or computed from the observations of other datasets.
The structure of computation descriptions, presented in [<a href="bookHtml018.html#LabraMTSR14">56</a>], is omitted here for simplicity.</p><p>In the next section we formally define the structure of this simplified WebIndex data model using ShEx
and review the main differences with the original.</p>
<h3 class="subsection" id="sec179">6.1.1 WebIndex in ShEx</h3>
<p>
<a id="ch070WebIndexShEx"></a>
<a id="ch6.sec1.1"></a></p><p>The following declaration indicates that a valid
<code>:</code><code><span class="c006">Country</span></code> shape must have exactly one
<code><span class="c004">rdfs</span></code><code>:</code><code><span class="c006">label</span></code> and exactly one
<code><span class="c004">wf</span></code><code>:</code><code><span class="c006">iso2</span></code> both of which must be literals
of type
<code><span class="c004">xsd</span></code><code>:</code><code><span class="c006">string</span></code>. In the case of
<code><span class="c004">wf</span></code><code>:</code><code><span class="c006">iso2</span></code> it must also have length 2.</p><p><a id="ShExCountry"></a>
</p><table class="lstframe c014"><tr><td class="lstlisting"><span class="c011">:</span><span class="c011"><span class="c006">Country</span></span><span class="c011"> {</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">rdfs</span></span><span class="c011">:</span><span class="c011"><span class="c006">label</span></span><span class="c011"> </span><span class="c011"><span class="c004">xsd</span></span><span class="c011">:</span><span class="c011"><span class="c006">string</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">wf</span></span><span class="c011">:</span><span class="c011"><span class="c006">iso2</span></span><span class="c011"> </span><span class="c011"><span class="c004">xsd</span></span><span class="c011">:</span><span class="c011"><span class="c006">string</span></span><span class="c011"> </span><span class="c011"><span class="c003">LENGTH</span></span><span class="c011"> 2</span><span class="c011">
</span><span class="c011">}</span></td></tr>
</table><p>In this example, we deliberately omitted the requirement for a
<code><span class="c004">rdf</span></code><code>:</code><code><span class="c006">type</span></code> declaration.
This means that, in order to satisfy the
<code>:</code><code><span class="c006">Country</span></code> shape,
a node need only have the properties that have been specified and may or may not include
<code><span class="c004">rdf</span></code><code>:</code><code><span class="c006">type</span></code> declarations.</p><p>By default, shape definitions are <em>open</em>
meaning that additional triples with different predicates may be present,
so nodes of shape
<code>:</code><code><span class="c006">Country</span></code> could have other properties beyond those
prescribed by the shape.</p><p>The shape of datasets is described as follows:</p><table class="lstframe c014"><tr><td class="lstlisting"><span class="c011">:</span><span class="c011"><span class="c006">DataSet</span></span><span class="c011"> { </span><span class="c011"><span class="c003">a</span></span><span class="c011"> [ </span><span class="c011"><span class="c004">qb</span></span><span class="c011">:</span><span class="c011"><span class="c006">DataSet</span></span><span class="c011"> ],</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">qb</span></span><span class="c011">:</span><span class="c011"><span class="c006">structure</span></span><span class="c011"> [ </span><span class="c011"><span class="c004">wf</span></span><span class="c011">:</span><span class="c011"><span class="c006">DSD</span></span><span class="c011"> ],</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">rdfs</span></span><span class="c011">:</span><span class="c011"><span class="c006">label</span></span><span class="c011"> </span><span class="c011"><span class="c004">xsd</span></span><span class="c011">:</span><span class="c011"><span class="c006">string</span></span><span class="c011"> ?,</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">qb</span></span><span class="c011">:</span><span class="c011"><span class="c006">slice</span></span><span class="c011"> </span><span class="c011"><span class="c006">@</span></span><span class="c011">:</span><span class="c011"><span class="c006">Slice</span></span><span class="c011"> +,</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">dct</span></span><span class="c011">:</span><span class="c011"><span class="c006">publisher</span></span><span class="c011"> </span><span class="c011"><span class="c006">@</span></span><span class="c011">:</span><span class="c011"><span class="c006">Organization</span></span><span class="c011">
</span><span class="c011">}</span></td></tr>
</table><p>This says that nodes conforming to
<code>:</code><code><span class="c006">DataSet</span></code> shape must have
<code><span class="c004">rdf</span></code><code>:</code><code><span class="c006">type</span></code> with value
<code><span class="c004">qb</span></code><code>:</code><code><span class="c006">DataSet</span></code>,
a
<code><span class="c004">qb</span></code><code>:</code><code><span class="c006">structure</span></code> of
<code><span class="c004">wf</span></code><code>:</code><code><span class="c006">DSD</span></code>,
an optional
<code><span class="c004">rdfs</span></code><code>:</code><code><span class="c006">label</span></code>
of type
<code><span class="c004">xsd</span></code><code>:</code><code><span class="c006">string</span></code>,
one or more
<code><span class="c004">qb</span></code><code>:</code><code><span class="c006">slice</span></code> predicates whose object is the subject of a set of triples
matching the
<code>:</code><code><span class="c006">Slice</span></code> shape definition and exactly one
<code><span class="c004">dct</span></code><code>:</code><code><span class="c006">publisher</span></code>,
whose object is the subject of a set of triples matching the
<code>:</code><code><span class="c006">Organization</span></code> shape.</p><p>The
<code>:</code><code><span class="c006">Slice</span></code> shape is defined in a similar fashion:</p><table class="lstframe c014"><tr><td class="lstlisting"><span class="c011">:</span><span class="c011"><span class="c006">Slice</span></span><span class="c011"> { </span><span class="c011"><span class="c003">a</span></span><span class="c011"> [ </span><span class="c011"><span class="c004">qb</span></span><span class="c011">:</span><span class="c011"><span class="c006">Slice</span></span><span class="c011"> ],</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">qb</span></span><span class="c011">:</span><span class="c011"><span class="c006">sliceStructure</span></span><span class="c011"> [ </span><span class="c011"><span class="c004">wf</span></span><span class="c011">:</span><span class="c011"><span class="c006">sliceByYear</span></span><span class="c011"> ],</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">qb</span></span><span class="c011">:</span><span class="c011"><span class="c006">observation</span></span><span class="c011"> </span><span class="c011"><span class="c006">@</span></span><span class="c011">:</span><span class="c011"><span class="c006">Observation</span></span><span class="c011">+,</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">cex</span></span><span class="c011">:</span><span class="c011"><span class="c006">indicator</span></span><span class="c011"> </span><span class="c011"><span class="c006">@</span></span><span class="c011">:</span><span class="c011"><span class="c006">Indicator</span></span><span class="c011">
</span><span class="c011">}</span></td></tr>
</table><p>The
<code>:</code><code><span class="c006">Observation</span></code> shape in the WebIndex data model has two
<code><span class="c004">rdf</span></code><code>:</code><code><span class="c006">type</span></code> declarations, which indicate that
they must be instances of both the RDF Data Cube class of Observation (
<code><span class="c004">qb</span></code><code>:</code><code><span class="c006">Observation</span></code>) and the
<code><span class="c004">wf</span></code><code>:</code><code><span class="c006">Observation</span></code> class from the Web Foundation ontology.
The property
<code><span class="c004">dct</span></code><code>:</code><code><span class="c006">publisher</span></code> is optional, but if it appears, it must have value
<code><span class="c004">wf</span></code><code>:</code><code><span class="c006">WebFoundation</span></code>.</p><p>Values conforming to
<code>:</code><code><span class="c006">Observation</span></code> shape can either have a
<code><span class="c004">wf</span></code><code>:</code><code><span class="c006">source</span></code> property of type
<code><span class="c003">IRI</span></code> (which, in this context, is used to indicate that it is a raw observation that has been taken from the source represented by the IRI),
or a
<code><span class="c004">cex</span></code><code>:</code><code><span class="c006">computation</span></code> property whose value conforms to the
<code>:</code><code><span class="c006">Computation</span></code> shape.</p><p>It should be noted that shapes do not define the semantics of an RDF graph.
While the designers of the WebIndex dataset model have determined that a raw observation would be indicated using the
<code><span class="c004">wf</span></code><code>:</code><code><span class="c006">source</span></code> predicate and with the object
<code><span class="c003">IRI</span></code> referencing the original source,
ShEx simply states that, in order for a subject to satisfy the
<code>:</code><code><span class="c006">Observation</span></code>, it must include either a
<code><span class="c004">wf</span></code><code>:</code><code><span class="c006">source</span></code> or a
<code><span class="c004">cex</span></code><code>:</code><code><span class="c006">computation</span></code> predicate, period.
Meaning must be found elsewhere.</p><table class="lstframe c014"><tr><td class="lstlisting"><span class="c011">:</span><span class="c011"><span class="c006">Observation</span></span><span class="c011"> {</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c003">a</span></span><span class="c011"> [ </span><span class="c011"><span class="c004">qb</span></span><span class="c011">:</span><span class="c011"><span class="c006">Observation</span></span><span class="c011"> ],</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c003">a</span></span><span class="c011"> [ </span><span class="c011"><span class="c006">wi</span></span><span class="c011">:</span><span class="c011"><span class="c006">Observation</span></span><span class="c011"> ],</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">cex</span></span><span class="c011">:</span><span class="c011"><span class="c006">value</span></span><span class="c011"> </span><span class="c011"><span class="c004">xsd</span></span><span class="c011">:</span><span class="c011"><span class="c006">float</span></span><span class="c011">,</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">dct</span></span><span class="c011">:</span><span class="c011"><span class="c006">issued</span></span><span class="c011"> </span><span class="c011"><span class="c004">xsd</span></span><span class="c011">:</span><span class="c011"><span class="c006">dateTime</span></span><span class="c011">,</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">dct</span></span><span class="c011">:</span><span class="c011"><span class="c006">publisher</span></span><span class="c011"> [</span><span class="c011"><span class="c004">wf</span></span><span class="c011">:</span><span class="c011"><span class="c006">WebFoundation</span></span><span class="c011">]?,</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">qb</span></span><span class="c011">:</span><span class="c011"><span class="c006">dataSet</span></span><span class="c011"> </span><span class="c011"><span class="c006">@</span></span><span class="c011">:</span><span class="c011"><span class="c006">DataSet</span></span><span class="c011">,</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">cex</span></span><span class="c011">:</span><span class="c011"><span class="c006">ref</span></span><span class="c011">-</span><span class="c011"><span class="c006">area</span></span><span class="c011"> </span><span class="c011"><span class="c006">@</span></span><span class="c011">:</span><span class="c011"><span class="c006">Country</span></span><span class="c011">,</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">cex</span></span><span class="c011">:</span><span class="c011"><span class="c006">indicator</span></span><span class="c011"> </span><span class="c011"><span class="c006">@</span></span><span class="c011">:</span><span class="c011"><span class="c006">Indicator</span></span><span class="c011">,</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">cex</span></span><span class="c011">:</span><span class="c011"><span class="c006">ref</span></span><span class="c011">-</span><span class="c011"><span class="c006">year</span></span><span class="c011"> </span><span class="c011"><span class="c004">xsd</span></span><span class="c011">:</span><span class="c011"><span class="c006">gYear</span></span><span class="c011">,</span><span class="c011">
</span><span class="c011"> ( </span><span class="c011"><span class="c004">wf</span></span><span class="c011">:</span><span class="c011"><span class="c006">source</span></span><span class="c011"> </span><span class="c011"><span class="c003">IRI</span></span><span class="c011">
</span><span class="c011"> | </span><span class="c011"><span class="c004">cex</span></span><span class="c011">:</span><span class="c011"><span class="c006">computation</span></span><span class="c011"> </span><span class="c011"><span class="c006">@</span></span><span class="c011">:</span><span class="c011"><span class="c006">Computation</span></span><span class="c011">
</span><span class="c011"> )</span><span class="c011">
</span><span class="c011">}</span></td></tr>
</table><p>A computation is represented as a node with type
<code><span class="c004">cex</span></code><code>:</code><code><span class="c006">Computation</span></code>.</p><table class="lstframe c014"><tr><td class="lstlisting"><span class="c011">:</span><span class="c011"><span class="c006">Computation</span></span><span class="c011"> {</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c003">a</span></span><span class="c011"> [ </span><span class="c011"><span class="c004">cex</span></span><span class="c011">:</span><span class="c011"><span class="c006">Computation</span></span><span class="c011"> ]</span><span class="c011">
</span><span class="c011">}</span></td></tr>
</table><p>The type of indicators must be either
<code><span class="c004">wf</span></code><code>:</code><code><span class="c006">PrimaryIndicator</span></code> or
<code><span class="c004">wf</span></code><code>:</code><code><span class="c006">SecondaryIndicator</span></code>.
They must also contain the property
<code><span class="c004">wf</span></code><code>:</code><code><span class="c006">provider</span></code> with a value conforming to shape
<code>:</code><code><span class="c006">Organization</span></code>.</p><table class="lstframe c014"><tr><td class="lstlisting"><span class="c011">:</span><span class="c011"><span class="c006">Indicator</span></span><span class="c011"> {</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c003">a</span></span><span class="c011"> [ </span><span class="c011"><span class="c004">wf</span></span><span class="c011">:</span><span class="c011"><span class="c006">PrimaryIndicator</span></span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">wf</span></span><span class="c011">:</span><span class="c011"><span class="c006">SecondaryIndicator</span></span><span class="c011">
</span><span class="c011"> ],</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">wf</span></span><span class="c011">:</span><span class="c011"><span class="c006">provider</span></span><span class="c011"> </span><span class="c011"><span class="c006">@</span></span><span class="c011">:</span><span class="c011"><span class="c006">Organization</span></span><span class="c011">
</span><span class="c011">}</span></td></tr>
</table><p>In the case of organizations, we declare these as closed shapes using the
<code><span class="c003">CLOSED</span></code> modifier and only allow the properties
<code><span class="c004">rdfs</span></code><code>:</code><code><span class="c006">label</span></code>,
<code><span class="c004">foaf</span></code><code>:</code><code><span class="c006">homepage</span></code> and
<code><span class="c004">rdf</span></code><code>:</code><code><span class="c006">type</span></code>, which must have the value
<code><span class="c004">org</span></code><code>:</code><code><span class="c006">Organization</span></code>.
The
<code><span class="c003">EXTRA</span></code> modifier is used to declare that we allow other values for the
<code><span class="c004">rdf</span></code><code>:</code><code><span class="c006">type</span></code> property (using the Turtle keyword
<code><span class="c003">a</span></code>).</p><table class="lstframe c014"><tr><td class="lstlisting"><span class="c011">:</span><span class="c011"><span class="c006">Organization</span></span><span class="c011"> </span><span class="c011"><span class="c003">CLOSED</span></span><span class="c011"> </span><span class="c011"><span class="c003">EXTRA</span></span><span class="c011"> </span><span class="c011"><span class="c003">a</span></span><span class="c011"> {</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c003">a</span></span><span class="c011"> [ </span><span class="c011"><span class="c004">org</span></span><span class="c011">:</span><span class="c011"><span class="c006">Organization</span></span><span class="c011"> ],</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">rdfs</span></span><span class="c011">:</span><span class="c011"><span class="c006">label</span></span><span class="c011"> </span><span class="c011"><span class="c004">xsd</span></span><span class="c011">:</span><span class="c011"><span class="c006">string</span></span><span class="c011">,</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">foaf</span></span><span class="c011">:</span><span class="c011"><span class="c006">homepage</span></span><span class="c011"> </span><span class="c011"><span class="c003">IRI</span></span><span class="c011">
</span><span class="c011">}</span></td></tr>
</table><p>Shape Expressions offer an intuitive way to describe the contents of linked data portals.
They have been used to document both the WebIndex<sup><a id="text42" href="#note42">1</a></sup> and
another data portal with a similar model, the Landbook<sup><a id="text43" href="#note43">2</a></sup> data portal.
Their documentation defines templates for the different shapes of resources and for the triples that can be retrieved when dereferencing those resources.
These templates define the dataset structure in a declarative way and can serve as a contract between developers of the data portal contents and designers of the data model.
Having a good data model with a corresponding Shape Expressions specification facilitated the communication between the various stakeholders involved.</p><p>The data model described in this chapter differs from the original one for readability and didactic proposes in the following ways:</p><ul class="itemize"><li class="li-itemize">
We omitted the representation of computations, which are represented as single nodes with type
<code><span class="c004">cex</span></code><code>:</code><code><span class="c006">Computation</span></code>.
A more detailed description of computations was described at [<a href="bookHtml018.html#LabraMTSR14">56</a>].
We have also simplified the representation of the webindex structure,
which was composed of sub-indexes, components and other properties such as labels and provenance information.</li><li class="li-itemize">We defined the shapes of countries to include just two simple properties.
We deliberately omit the mandatory use of
<code><span class="c004">rdf</span></code><code>:</code><code><span class="c006">type</span></code> declaration to show that
it is possible to have nodes without that declaration.
In the original WebIndex data model all countries had a mandatory
<code><span class="c004">rdf</span></code><code>:</code><code><span class="c006">type</span></code> arc but there were several generated nodes
which did not have
<code><span class="c004">rdf</span></code><code>:</code><code><span class="c006">type</span></code> declarations.
As we omitted the representation of computations we decided to offer that possibility for countries as an example. </li></ul><p>Appendix <a href="bookHtml014.html#AppendixWebIndexShEx">A</a> includes the full version of the WebIndex ShEx description used in this book. </p>
<h3 class="subsection" id="sec180">6.1.2 WebIndex in SHACL</h3>
<p>
<a id="ch070WebIndexSHACL"></a>
<a id="ch6.sec1.2"></a></p><p>Although the original data portal was modeled in ShEx,
we undertook the exercise of defining a SHACL description for the same contents so that we could compare the expressiveness of ShEx and SHACL.
In this section we present a possible encoding in SHACL.</p><p>An equivalent description in SHACL of the
<code>:</code><code><span class="c006">Country</span></code> shape defined on
page <a href="#ShExCountry">??</a> would be:</p><table class="lstframe c014"><tr><td class="lstlisting"><span class="c011">:</span><span class="c011"><span class="c006">Country</span></span><span class="c011"> </span><span class="c011"><span class="c003">a</span></span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">NodeShape</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [ </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c004">rdfs</span></span><span class="c011">:</span><span class="c011"><span class="c006">label</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">datatype</span></span><span class="c011"> </span><span class="c011"><span class="c004">xsd</span></span><span class="c011">:</span><span class="c011"><span class="c006">string</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">minCount</span></span><span class="c011"> 1; </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">maxCount</span></span><span class="c011"> 1 ;</span><span class="c011">
</span><span class="c011"> ] ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [ </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c004">wf</span></span><span class="c011">:</span><span class="c011"><span class="c006">iso2</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">datatype</span></span><span class="c011"> </span><span class="c011"><span class="c004">xsd</span></span><span class="c011">:</span><span class="c011"><span class="c006">string</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">length</span></span><span class="c011"> 2 ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">minCount</span></span><span class="c011"> 1; </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">maxCount</span></span><span class="c011"> 1 ;</span><span class="c011">
</span><span class="c011">] .</span></td></tr>
</table><p>As can be seen, the
<code>:</code><code><span class="c006">Country</span></code> shape is defined by two constraints which specify that the datatype of
<code><span class="c004">rdfs</span></code><code>:</code><code><span class="c006">label</span></code> and
<code><span class="c004">wf</span></code><code>:</code><code><span class="c006">iso2</span></code> properties must be
<code><span class="c004">xsd</span></code><code>:</code><code><span class="c006">string</span></code> and that
<code><span class="c004">wf</span></code><code>:</code><code><span class="c006">iso2</span></code> has length 2.</p><p><a id="hevea_default774"></a>
<a id="hevea_default775"></a>
<a id="hevea_default776"></a>
The default SHACL cardinality constraint is
<code>[0..*]</code> meaning that cardinality constraints that are omitted in ShEx grammar must be explicitly stated in SHACL as:</p><table class="lstframe c014"><tr><td class="lstlisting"><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">minCount</span></span><span class="c011"> 1; </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">maxCount</span></span><span class="c011"> 1 ;</span></td></tr>
</table><p>Optionality (
<code>?</code> or
<code>*</code> in ShEx) can be represented either by omitting
<code><span class="c004">sh</span></code><code>:</code><code><span class="c006">minCount</span></code> or by
<code><span class="c004">sh</span></code><code>:</code><code><span class="c006">minCount</span></code><code>=0</code>.
An unbounded maximum cardinality (
<code>*</code> or
<code>+</code> in ShEx) must be represented in SHACL by omitting
<code><span class="c004">sh</span></code><code>:</code><code><span class="c006">maxCount</span></code>.
As an example, the definition of the
<code>:</code><code><span class="c006">DataSet</span></code> shape declares that
<code><span class="c004">rdfs</span></code><code>:</code><code><span class="c006">label</span></code> is optional (by omitting the
<code><span class="c004">sh</span></code><code>:</code><code><span class="c006">minCount</span></code> property) and declares that there must be one or more
<code><span class="c004">qb</span></code><code>:</code><code><span class="c006">slice</span></code> predicates conforming to the
<code><span class="c004">qb</span></code><code>:</code><code><span class="c006">slice</span></code> definition (by omitting the value of
<code><span class="c004">sh</span></code><code>:</code><code><span class="c006">maxCount</span></code>).</p><p><a id="hevea_default777"></a>
The predicate
<code><span class="c004">sh</span></code><code>:</code><code><span class="c006">node</span></code> is used to indicate that the value of a property must have a given shape.
In this way, a shape can refer to another shape.
Note that the WebIndex data model contains cycles—shapes refer to other shapes and those shapes can refer back to the first ones—which can generate recursive shapes.
Nevertheless, the handling of recursion in SHACL is implementation-dependent so it is necessary to circumvent this feature following some of the techniques shown in section <a href="bookHtml011.html#050SHACLRecursion">5.12.1</a>).</p><table class="lstframe c014"><tr><td class="lstlisting"><span class="c011">:</span><span class="c011"><span class="c006">DataSet</span></span><span class="c011"> </span><span class="c011"><span class="c003">a</span></span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">NodeShape</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [ </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c004">rdf</span></span><span class="c011">:</span><span class="c011"><span class="c006">type</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">hasValue</span></span><span class="c011"> </span><span class="c011"><span class="c004">qb</span></span><span class="c011">:</span><span class="c011"><span class="c006">DataSet</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">minCount</span></span><span class="c011"> 1; </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">maxCount</span></span><span class="c011"> 1 ;</span><span class="c011">
</span><span class="c011"> ] ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [ </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c004">qb</span></span><span class="c011">:</span><span class="c011"><span class="c006">structure</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">hasValue</span></span><span class="c011"> </span><span class="c011"><span class="c004">wf</span></span><span class="c011">:</span><span class="c011"><span class="c006">DSD</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">minCount</span></span><span class="c011"> 1; </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">maxCount</span></span><span class="c011"> 1 ;</span><span class="c011">
</span><span class="c011"> ] ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [ </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c004">rdfs</span></span><span class="c011">:</span><span class="c011"><span class="c006">label</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">datatype</span></span><span class="c011"> </span><span class="c011"><span class="c004">xsd</span></span><span class="c011">:</span><span class="c011"><span class="c006">string</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">maxCount</span></span><span class="c011"> 1 ;</span><span class="c011">
</span><span class="c011"> ] ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [ </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c004">qb</span></span><span class="c011">:</span><span class="c011"><span class="c006">slice</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">node</span></span><span class="c011"> :</span><span class="c011"><span class="c006">Slice</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">minCount</span></span><span class="c011"> 1 ;</span><span class="c011">
</span><span class="c011"> ] ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [ </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c004">dct</span></span><span class="c011">:</span><span class="c011"><span class="c006">publisher</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">node</span></span><span class="c011"> :</span><span class="c011"><span class="c006">Organization</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">minCount</span></span><span class="c011"> 1; </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">maxCount</span></span><span class="c011"> 1 ;</span><span class="c011">
</span><span class="c011"> ] .</span></td></tr>
</table><p>The definition of
<code>:</code><code><span class="c006">Slice</span></code> is similar to
<code>:</code><code><span class="c006">DataSet</span></code>, so we can omit it for clarity.
The full version of the SHACL shapes that we used in this section is shown in appendix <a href="bookHtml015.html#AppendixWebIndexSHACL">B</a>.</p><p>There are three items that need more explanation in the SHACL definition of the
<code>:</code><code><span class="c006">Observation</span></code> shape.
The first of these is the repeated appearance of the
<code><span class="c004">rdf</span></code><code>:</code><code><span class="c006">type</span></code> property with two values.
Although we initially represented it using qualified value shapes, we noticed that it could also be
represented as: </p><table class="lstframe c014"><tr><td class="lstlisting"><span class="c011">:</span><span class="c011"><span class="c006">Observation</span></span><span class="c011"> </span><span class="c011"><span class="c003">a</span></span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">NodeShape</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [ </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c004">rdf</span></span><span class="c011">:</span><span class="c011"><span class="c006">type</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">in</span></span><span class="c011"> ( </span><span class="c011"><span class="c004">qb</span></span><span class="c011">:</span><span class="c011"><span class="c006">Observation</span></span><span class="c011"> </span><span class="c011"><span class="c004">wf</span></span><span class="c011">:</span><span class="c011"><span class="c006">Observation</span></span><span class="c011"> )</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [ </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c004">rdf</span></span><span class="c011">:</span><span class="c011"><span class="c006">type</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">minCount</span></span><span class="c011"> 2; </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">maxCount</span></span><span class="c011"> 2</span><span class="c011">
</span><span class="c011">] ;</span><span class="c011">
</span><span class="c011">...</span></td></tr>
</table><p>The definition of observations also contains an optional property with a fixed value. This was defined in ShEx as:</p><table class="lstframe c014"><tr><td class="lstlisting"><span class="c011">:</span><span class="c011"><span class="c006">Observation</span></span><span class="c011"> { ...</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">dct</span></span><span class="c011">:</span><span class="c011"><span class="c006">publisher</span></span><span class="c011"> (</span><span class="c011"><span class="c004">wf</span></span><span class="c011">:</span><span class="c011"><span class="c006">WebFoundation</span></span><span class="c011">)?</span><span class="c011">
</span><span class="c011"> ...</span><span class="c011">
</span><span class="c011">}</span></td></tr>
</table><p>which means that observations can either have a property
<code><span class="c004">dct</span></code><code>:</code><code><span class="c006">publisher</span></code> with the fixed
value
<code><span class="c004">wf</span></code><code>:</code><code><span class="c006">WebFoundation</span></code> or they can not have that property. </p><p>A possible representation in SHACL is to use an
<code><span class="c004">sh</span></code><code>:</code><code><span class="c003">or</span></code> of two shapes:
one in which there is no
<code><span class="c004">dct</span></code><code>:</code><code><span class="c006">publisher</span></code> (
<code><span class="c004">sh</span></code><code>:</code><code><span class="c006">maxCount</span></code>=0) and one with exactly one value for
<code><span class="c004">dct</span></code><code>:</code><code><span class="c006">published</span></code>. </p><table class="lstframe c014"><tr><td class="lstlisting"><span class="c011">:</span><span class="c011"><span class="c006">Observation</span></span><span class="c011"> ...</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">or</span></span><span class="c011"> ( [ </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c004">dct</span></span><span class="c011">:</span><span class="c011"><span class="c006">publisher</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">maxCount</span></span><span class="c011"> 0</span><span class="c011">
</span><span class="c011"> ]</span><span class="c011">
</span><span class="c011"> [ </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c004">dct</span></span><span class="c011">:</span><span class="c011"><span class="c006">publisher</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">hasValue</span></span><span class="c011"> </span><span class="c011"><span class="c004">wf</span></span><span class="c011">:</span><span class="c011"><span class="c006">WebFoundation</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">minCount</span></span><span class="c011"> 1 ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">maxCount</span></span><span class="c011"> 1</span><span class="c011">
</span><span class="c011"> ]</span><span class="c011">
</span><span class="c011"> )</span><span class="c011">
</span><span class="c011"> ...</span></td></tr>
</table><p>The last item requiring additional explanation is the disjunction definition which says that observations
must have either the property
<code><span class="c004">cex</span></code><code>:</code><code><span class="c006">computation</span></code> with a value of shape
<code>:</code><code><span class="c006">Computation</span></code> or the property
<code><span class="c004">wf</span></code><code>:</code><code><span class="c006">source</span></code> with an IRI value, but not both.
In ShEx, it was defined as:</p><table class="lstframe c014"><tr><td class="lstlisting"><span class="c011">:</span><span class="c011"><span class="c006">Observation</span></span><span class="c011"> { ...</span><span class="c011">
</span><span class="c011"> , ( </span><span class="c011"><span class="c004">cex</span></span><span class="c011">:</span><span class="c011"><span class="c006">computation</span></span><span class="c011"> </span><span class="c011"><span class="c006">@</span></span><span class="c011">:</span><span class="c011"><span class="c006">Computation</span></span><span class="c011">
</span><span class="c011"> | </span><span class="c011"><span class="c004">wf</span></span><span class="c011">:</span><span class="c011"><span class="c006">source</span></span><span class="c011"> </span><span class="c011"><span class="c003">IRI</span></span><span class="c011">
</span><span class="c011"> )</span><span class="c011">
</span><span class="c011"> ...</span><span class="c011">
</span><span class="c011">}</span></td></tr>
</table><p>In SHACL, this declaration can be defined using the
<code><span class="c004">sh</span></code><code>:</code><code><span class="c006">xone</span></code> (exactly one) property constraint:</p><p><a id="DisjointOrShacl"></a>
</p><table class="lstframe c014"><tr><td class="lstlisting"><span class="c011">:</span><span class="c011"><span class="c006">Observation</span></span><span class="c011">
</span><span class="c011"> ...</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">xone</span></span><span class="c011"> ( [ </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c004">wf</span></span><span class="c011">:</span><span class="c011"><span class="c006">source</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">nodeKind</span></span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">IRI</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">minCount</span></span><span class="c011"> 1; </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">maxCount</span></span><span class="c011"> 1 ;</span><span class="c011">
</span><span class="c011"> ]</span><span class="c011">
</span><span class="c011"> [ </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c004">cex</span></span><span class="c011">:</span><span class="c011"><span class="c006">computation</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">node</span></span><span class="c011"> :</span><span class="c011"><span class="c006">Computation</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">minCount</span></span><span class="c011"> 1; </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">maxCount</span></span><span class="c011"> 1 ;</span><span class="c011">
</span><span class="c011"> ]</span><span class="c011">
</span><span class="c011"> )</span><span class="c011">
</span><span class="c011">...</span></td></tr>
</table><p>In the case of indicators we can see again the separation between the
<code>:</code><code><span class="c006">Indicator</span></code> shape and
the
<code><span class="c004">wf</span></code><code>:</code><code><span class="c006">PrimaryIndicator</span></code> and
<code><span class="c004">wf</span></code><code>:</code><code><span class="c006">SecondaryIndicator</span></code> classes.</p><table class="lstframe c014"><tr><td class="lstlisting"><span class="c011">:</span><span class="c011"><span class="c006">Indicator</span></span><span class="c011"> </span><span class="c011"><span class="c003">a</span></span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">NodeShape</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [ </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c004">rdf</span></span><span class="c011">:</span><span class="c011"><span class="c006">type</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">in</span></span><span class="c011"> ( </span><span class="c011"><span class="c004">wf</span></span><span class="c011">:</span><span class="c011"><span class="c006">PrimaryIndicator</span></span><span class="c011"> </span><span class="c011"><span class="c004">wf</span></span><span class="c011">:</span><span class="c011"><span class="c006">SecondaryIndicator</span></span><span class="c011"> ) ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">minCount</span></span><span class="c011"> 1; </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">maxCount</span></span><span class="c011"> 1 ;</span><span class="c011">
</span><span class="c011"> ] ;</span><span class="c011">
</span><span class="c011"> ...</span></td></tr>
</table><p>We defined organizations as closed shapes with the possibility that the
<code><span class="c004">rdf</span></code><code>:</code><code><span class="c006">type</span></code> property has some extra values apart from the
<code><span class="c004">org</span></code><code>:</code><code><span class="c006">Organization</span></code>.
This constraint can be expressed in SHACL as:</p><table class="lstframe c014"><tr><td class="lstlisting"><span class="c011">:</span><span class="c011"><span class="c006">Organization</span></span><span class="c011"> </span><span class="c011"><span class="c003">a</span></span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">NodeShape</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">closed</span></span><span class="c011"> </span><span class="c011"><span class="c003">true</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">ignoredProperties</span></span><span class="c011"> ( </span><span class="c011"><span class="c004">rdf</span></span><span class="c011">:</span><span class="c011"><span class="c006">type</span></span><span class="c011"> )</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [ </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c004">rdf</span></span><span class="c011">:</span><span class="c011"><span class="c006">type</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">hasValue</span></span><span class="c011"> </span><span class="c011"><span class="c004">org</span></span><span class="c011">:</span><span class="c011"><span class="c006">Organization</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> ] ;</span><span class="c011">
</span><span class="c011"> ...</span></td></tr>
</table><p>An important aspect that deserves some explanation is the use of recursion to represent cyclic data models.
While ShEx can define cyclic data models in a natural way, the lack of recursion in SHACL needs to be circumvented.</p><p>One possibility is to add a discriminating
<code><span class="c004">rdf</span></code><code>:</code><code><span class="c006">type</span></code> arc to every node so that its shape can be associated to its class.
We opted to add a
<code><span class="c004">sh</span></code><code>:</code><code><span class="c006">targetClass</span></code> declaration to some shapes, such as
<code>:</code><code><span class="c006">Observation</span></code>, conflating that shape
with the class
<code><span class="c004">qb</span></code><code>:</code><code><span class="c006">Observation</span></code>. Any node that contains a
<code><span class="c004">rdf</span></code><code>:</code><code><span class="c006">type</span></code> arc pointing to
<code><span class="c004">qb</span></code><code>:</code><code><span class="c006">Observation</span></code> must conform
to the
<code>:</code><code><span class="c006">Observation</span></code> shape declared by the WebIndex.</p><p>While this approach may be reasonable in closed contexts, it can cause problems in the open semantic web if one combines data from other datasets.
For example, we defined another data model based on RDF data cube for the LandPortal project<sup><a id="text44" href="#note44">3</a></sup>
which also contained values of type
<code><span class="c004">qb</span></code><code>:</code><code><span class="c006">Observation</span></code> but with different structures.
We consider that forcing every node of type
<code><span class="c004">qb</span></code><code>:</code><code><span class="c006">Observation</span></code> to have the same structure is not a good practice and that it may be better to separate the target declarations from the shapes definitions.</p><p><a id="hevea_default778"></a>
</p>
<h2 class="section" id="sec181">6.2 Describing Clinical Records—FHIR</h2>
<p>
<a id="ch060FHIR"></a>
<a id="ch6.sec2"></a></p><p><a id="hevea_default779"></a>
<a id="hevea_default780"></a> <a id="hevea_default781"></a>
<a id="hevea_default782"></a></p><p>Fast Healthcase Interoperability Resources
(FHIR)<sup><a id="text45" href="#note45">4</a></sup> is a framework created by HL7,
a clinical standards organization, to define data formats and APIs for exchanging electronic health records.
FHIR Release 3.0 was published in March 2017 and adds support for RDF.</p><p><a id="hevea_default783"></a> <a id="hevea_default784"></a> <a id="hevea_default785"></a>
FHIR has a resource-oriented architecture that describes the different entities involved in a clinical record.
In a typical example, a patient (
<code><span class="c006">Patient</span></code> resource) visits a clinician (
<code><span class="c006">Practitioner</span></code> resource), who records some observations (
<code><span class="c006">Observation</span></code> resource), reviews some lab results (
<code><span class="c006">Diagnostic</span></code> results probably referencing other observations) and diagnoses a clinical issue (
<code><span class="c006">Condition</span></code> resource).
These resources can be expressed interchangeably in multiple formats:
JSON, XML, and RDF.</p><p><a id="hevea_default786"></a> <a id="hevea_default787"></a> <a id="hevea_default788"></a>
FHIR resources are described by structure definitions in a FHIR-specific
schema language.
This machine-readable language is translated into format-specific schema languages such as XML Schema plus Schematron, JSON Schema, and ShEx.</p><p>The structure of FHIR resources is documented as machine-generated HTML tables.
Figure <a href="#ch070.ObservationFHIR">6.2</a> shows part of the FHIR
<code><span class="c006">Observation</span></code> resource<sup><a id="text46" href="#note46">5</a></sup>.</p><p>FHIR structure definitions have two forms of limited disjunction.
The first, choices of the types of referenced resources, can be seen in
<code><span class="c006">subject</span></code> and
<code><span class="c006">performer</span></code> in Figure <a href="#ch070.ObservationFHIR">6.2</a>.
The second is a choice between a set of datatypes where the name of the datatype is appended to the property name, indicated by the
<code>[</code><code><span class="c006">x</span></code><code>]</code> notation
(see
<code><span class="c006">effective</span></code><code>[</code><code><span class="c006">x</span></code><code>]</code> and
<code><span class="c006">value</span></code><code>[</code><code><span class="c006">x</span></code><code>]</code> in Figure <a href="#ch070.ObservationFHIR">6.2</a>).
These are captured in ShEx using the shape expression ShapeOr (’
<code><span class="c003">OR</span></code>’) and the triple expression OneOf (’
<code>|</code>’) respectively:</p><div class="example"><div class="theorem"><span class="c013">Example 156</span> <em>FHIR Observation representation in ShEx</em><em>
</em><em>
</em><table class="lstframe c014"><tr><td class="lstlisting"><em><span class="c011"><span class="c008"><em><span class="c011"><Observation></span></em></span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c003">CLOSED</span></span></em><em><span class="c011"> { </span></em><em><span class="c011"><span class="c003">a</span></span></em><em><span class="c011"> [</span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">Observation</span></span></em><em><span class="c011">];</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">obs</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">status</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><code></span></em></span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">AND</span></span></em><em><span class="c011"> {</span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">value</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@fhirvs</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">observation</span></span></em><em><span class="c011">-</span></em><em><span class="c011"><span class="c006">status</span></span></em><em><span class="c011">};</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">obs</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">code</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><CodeableConcept></span></em></span></span></em><em><span class="c011">;</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">obs</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">subject</span></span></em><em><span class="c011">
</span></em><em><span class="c011"> ( </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><PatientReference></span></em></span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c003">OR</span></span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><GroupReference></span></em></span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c003">OR</span></span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><DeviceReference></span></em></span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c003">OR</span></span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><LocationReference></span></em></span></span></em><em><span class="c011">
</span></em><em><span class="c011"> )?;</span></em><em><span class="c011">
</span></em><em><span class="c011"> ( </span></em><em><span class="c011"><span class="c006">obs</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">effectiveDateTime</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><dateTime></span></em></span></span></em><em><span class="c011">
</span></em><em><span class="c011"> | </span></em><em><span class="c011"><span class="c006">obs</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">effectiveTiming</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><Timing></span></em></span></span></em><em><span class="c011">
</span></em><em><span class="c011"> )?;</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">obs</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">issued</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><instant></span></em></span></span></em><em><span class="c011">?;</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">obs</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">performer</span></span></em><em><span class="c011">
</span></em><em><span class="c011"> ( </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><PractitionerReference></span></em></span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c003">OR</span></span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><OrganizationReference></span></em></span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c003">OR</span></span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><PatientReference></span></em></span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c003">OR</span></span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><RelatedPersonReference></span></em></span></span></em><em><span class="c011">
</span></em><em><span class="c011"> )*;</span></em><em><span class="c011">
</span></em><em><span class="c011"> ( </span></em><em><span class="c011"><span class="c006">obs</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">valueQuantity</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><Quantity></span></em></span></span></em><em><span class="c011">
</span></em><em><span class="c011"> | </span></em><em><span class="c011"><span class="c006">obs</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">valueCodeableConcept</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><CodeableConcept></span></em></span></span></em><em><span class="c011">
</span></em><em><span class="c011"> | </span></em><em><span class="c011"><span class="c006">obs</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">valueDateTime</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><dateTime></span></em></span></span></em><em><span class="c011">
</span></em><em><span class="c011"> | </span></em><em><span class="c011"><span class="c006">obs</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">valuePeriod</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><Period></span></em></span></span></em><em><span class="c011">
</span></em><em><span class="c011"> )?;</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">obs</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">bodySite</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><CodeableConcept></span></em></span></span></em><em><span class="c011">?;</span></em><em><span class="c011">
</span></em><em><span class="c011">}</span></em><em><span class="c011">
</span></em><em><span class="c011">
</span></em><em><span class="c011"><span class="c006">fhirvs</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">observation</span></span></em><em><span class="c011">-</span></em><em><span class="c011"><span class="c006">status</span></span></em><em><span class="c011"> [</span></em><em><span class="c011"><span class="c005"><em><span class="c011">"registered"</span></em></span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c005"><em><span class="c011">"preliminary"</span></em></span></span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c005"><em><span class="c011">"final"</span></em></span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c005"><em><span class="c011">"amended"</span></em></span></span></em><em><span class="c011"> ]</span></em></td></tr>
</table></div></div><blockquote class="figure"><div class="center"><hr class="c021"></div>
<div class="center">
<img src="Observation-cut3.eps.png">
</div>
<a id="ch070.ObservationFHIR"></a>
<div class="caption"><table class="c002 cellpading0"><tr><td class="c018">Figure 6.2: Part of Observation resource in FHIR.</td></tr>
</table></div>
<div class="center"><hr class="c021"></div></blockquote>
<h3 class="subsection" id="sec182">6.2.1 FHIR as Linked Data</h3>
<p>
<a id="ch6.sec2.2"></a></p><p>The definition of the RDF representation of FHIR was greatly simplified because FHIR was designed to be resource-oriented.
While clinical records are not expected to end up on the web,
the REST architecture was an easy way to implement addressability and separation of concerns.</p><p>This means that FHIR resources are interlinked in a fashion that is already familiar to users of Linked Data.
For example, the
<code><span class="c006">Observation</span></code> excerpt includes references for the
<code><span class="c006">subject</span></code> and
<code><span class="c006">performer</span></code>.
The
<code><span class="c006">subject</span></code> may be a resource of type
<code><span class="c006">Patient</span></code>,
<code><span class="c006">Group</span></code>,
<code><span class="c006">Device</span></code> or
<code><span class="c006">Location</span></code>, and the
<code><span class="c006">performer</span></code> may be a
<code><span class="c006">Practitioner</span></code>,
<code><span class="c006">Organization</span></code>,
<code><span class="c006">Patient</span></code>, or a
<code><span class="c006">RelatedPerson</span></code> (see Figure <a href="#ch070.ObservationFHIR">6.2</a>).
While Linked Data is most commonly associated with RDF, these constraints apply equally to the XML and JSON representations of FHIR.
However, of the four schema languages used to validate FHIR, only ShEx validation spans resources.</p><p>There are several reasons why one might want to limit validation to a single document:
other resources might not be available or relevant and
it may be impractical either computationally or procedurally to test conformance of many resources at once.
However, a common use case for Linked Data is that all related data is addressable and available.
Extending our schema to include verification of external referents allows us to ensure that a resource is coherent not only on its own but also when used in the context of the resources to which it is linked. </p>
<h3 class="subsection" id="sec183">6.2.2 Consistency constraints</h3>
<p>
<a id="ch6.sec2.1"></a></p><p><a id="hevea_default789"></a> <a id="hevea_default790"></a>
The FHIR-specific schemas are expressed as combinations of structure definitions describing types and containership, and constraints.
Most constraints are co-existence constraints, e.g.,
if there is a
<code><span class="c006">duration</span></code> there must be a
<code><span class="c006">durationUnits</span></code>.
For XML, structure definitions are expressed as XML Schema, and co-existence constraints are expressed, where possible, in Schematron.
For RDF, structure definitions and coexistence constraints are both expressed in ShEx.</p><p>An example with co-existence constraints is the representation of the
<code><span class="c006">Timing</span></code> datatype, which represents an event that may occur multiple times.
A Timing schedule can be a list of events and/or criteria for when the event happens,
which can be expressed in a structured form and/or as a code. Figure <a href="#ch070.TimingFHIRDSL">6.2.2</a> shows the HTML representation of
<code><span class="c006">Timing</span></code>.</p><blockquote class="figure"><div class="center"><hr class="c021"></div>
<div class="center">
<img src="ch06-02.png">
</div>
<a id="ch070.TimingFHIRDSL"></a>
<div class="caption"><table class="c002 cellpading0"><tr><td class="c018">Figure 6.3: Complete Timing datatype in FHIR.</td></tr>
</table></div>
<div class="center"><hr class="c021"></div></blockquote><p><a id="hevea_default791"></a> <a id="hevea_default792"></a> <a id="hevea_default793"></a> <a id="hevea_default794"></a>
While these human-friendly HTML representations are generated from the FHIR schema,
they could easily be generated from representations in other schema languages such as XML Schema, ShEx or SHACL.
Schemas using more expressivity may be difficult to convey graphically to users.
For instance, these property trees do not have a way to assert co-existence constraints, e.g. that certain properties are mutually exclusive.
<a id="hevea_default795"></a> <a id="hevea_default796"></a>
In a UML stack, these sorts of constraints would be expressed using OCL (see section <a href="bookHtml009.html#ch3.sec1.1">3.1.1</a>).</p><div class="example"><div class="theorem"><span class="c013">Example 157</span> <em>Timing representation in ShEx</em><sup><a id="text47" href="#note47"><em>6</em></a></sup><p><em>The ShEx representation of </em><em>
</em><code><em><span class="c006">Timing</span></em></code><em> is defined as:</em></p><table class="lstframe c014"><tr><td class="lstlisting"><em><span class="c011"><span class="c003">PREFIX</span></span></em><em><span class="c011"> : </span></em><em><span class="c011"><span class="c008"><em><span class="c011"><http://hl7.org/fhir/Timing.></span></em></span></span></em><em><span class="c011">
</span></em><em><span class="c011"><span class="c003">PREFIX</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhirvs</span></span></em><em><span class="c011">: </span></em><em><span class="c011"><span class="c008"><em><span class="c011"><http://hl7.org/fhir/ValueSet/></span></em></span></span></em><em><span class="c011">
</span></em><em><span class="c011"><span class="c003">BASE</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c008"><em><span class="c011"><http://hl7.org/fhir/shape/></span></em></span></span></em><em><span class="c011">
</span></em><em><span class="c011">
</span></em><em><span class="c011"><span class="c008"><em><span class="c011"><Timing></span></em></span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c003">CLOSED</span></span></em><em><span class="c011"> {</span></em><em><span class="c011">
</span></em><em><span class="c011"> :</span></em><em><span class="c011"><span class="c006">event</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><dateTime></span></em></span></span></em><em><span class="c011">*;</span></em><em><span class="c011">
</span></em><em><span class="c011"> :</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><Timing.repeat></span></em></span></span></em><em><span class="c011">?;</span></em><em><span class="c011">
</span></em><em><span class="c011"> :</span></em><em><span class="c011"><span class="c006">code</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><CodeableConcept></span></em></span></span></em><em><span class="c011">?;</span></em><em><span class="c011">
</span></em><em><span class="c011">}</span></em></td></tr>
</table><p><em>where </em><em>
</em><code><em><span class="c006">Timing</span></em></code><code><em>.</em></code><code><em><span class="c006">repeat</span></em></code><em> shape contains two parts: a structure definition (lines 1–24) and several co-existence constraints (lines 25–35) which can be expressed in natural language as:</em></p><ul class="itemize"><li class="li-itemize"><em>
</em><em>If there is a </em><em>
</em><code><em><span class="c006">duration</span></em></code><em>, there needs to be </em><em>
</em><code><em><span class="c006">durationUnits</span></em></code><em>.
</em></li><li class="li-itemize"><em>If there’s a </em><em>
</em><code><em><span class="c006">period</span></em></code><em>, there needs to be </em><em>
</em><code><em><span class="c006">periodUnits</span></em></code><em>.
</em></li><li class="li-itemize"><em>
</em><code><em><span class="c006">duration</span></em></code><em> shall be a non-negative value.
</em></li><li class="li-itemize"><em>
</em><code><em><span class="c006">period</span></em></code><em> shall be a non-negative value.
</em></li><li class="li-itemize"><em>If there is a </em><em>
</em><code><em><span class="c006">periodMax</span></em></code><em>, there must be a </em><em>
</em><code><em><span class="c006">period</span></em></code><em>.
</em></li><li class="li-itemize"><em>If there is a </em><em>
</em><code><em><span class="c006">durationMax</span></em></code><em>, there must be a </em><em>
</em><code><em><span class="c006">duration</span></em></code><em>.
</em></li><li class="li-itemize"><em>If there is a </em><em>
</em><code><em><span class="c006">countMax</span></em></code><em>, there must be a </em><em>
</em><code><em><span class="c006">count</span></em></code><em>.
</em></li><li class="li-itemize"><em>If there is an </em><em>
</em><code><em><span class="c006">offset</span></em></code><em>, there must be a </em><em>
</em><code><em><span class="c006">when</span></em></code><em> (and not </em><em>
</em><code><em><span class="c006">C</span></em></code><em>, </em><em>
</em><code><em><span class="c006">CM</span></em></code><em>, </em><em>
</em><code><em><span class="c006">CD</span></em></code><em>, </em><em>
</em><code><em><span class="c006">CV</span></em></code><em>).
</em></li><li class="li-itemize"><em>If there is a </em><em>
</em><code><em><span class="c006">timeOfDay</span></em></code><em>, there cannot be a when, or vice versa.
</em></li></ul><table class="lstframe c014"><tr><td class="lstlisting"><em><span class="c011"><span class="c008"><em><span class="c011"><Timing.repeat></span></em></span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c003">CLOSED</span></span></em><em><span class="c011"> {</span></em><em><span class="c011">
</span></em><em><span class="c011"> ( :</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">boundsDuration</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><Duration></span></em></span></span></em><em><span class="c011"> |</span></em><em><span class="c011">
</span></em><em><span class="c011"> :</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">boundsRange</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><Range></span></em></span></span></em><em><span class="c011"> |</span></em><em><span class="c011">
</span></em><em><span class="c011"> :</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">boundsPeriod</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><Period></span></em></span></span></em><em><span class="c011">
</span></em><em><span class="c011"> )?;</span></em><em><span class="c011">
</span></em><em><span class="c011"> :</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">count</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><integer></span></em></span></span></em><em><span class="c011">?;</span></em><em><span class="c011">
</span></em><em><span class="c011"> :</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">countMax</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><integer></span></em></span></span></em><em><span class="c011">?;</span></em><em><span class="c011">
</span></em><em><span class="c011"> :</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">duration</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><decimal></span></em></span></span></em><em><span class="c011">?;</span></em><em><span class="c011">
</span></em><em><span class="c011"> :</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">durationMax</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><decimal></span></em></span></span></em><em><span class="c011">?;</span></em><em><span class="c011">
</span></em><em><span class="c011"> :</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">durationUnit</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><code></span></em></span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">AND</span></span></em><em><span class="c011">
</span></em><em><span class="c011"> { </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">value</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@fhirvs</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">units</span></span></em><em><span class="c011">-</span></em><em><span class="c011"><span class="c006">of</span></span></em><em><span class="c011">-</span></em><em><span class="c011"><span class="c006">time</span></span></em><em><span class="c011"> }?;</span></em><em><span class="c011">
</span></em><em><span class="c011"> :</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">frequency</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><integer></span></em></span></span></em><em><span class="c011">?;</span></em><em><span class="c011">
</span></em><em><span class="c011"> :</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">frequencyMax</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><integer></span></em></span></span></em><em><span class="c011">?;</span></em><em><span class="c011">
</span></em><em><span class="c011"> :</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">period</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><decimal></span></em></span></span></em><em><span class="c011">?;</span></em><em><span class="c011">
</span></em><em><span class="c011"> :</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">periodMax</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><decimal></span></em></span></span></em><em><span class="c011">?;</span></em><em><span class="c011">
</span></em><em><span class="c011"> :</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">periodUnit</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><code></span></em></span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">AND</span></span></em><em><span class="c011">
</span></em><em><span class="c011"> { </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">value</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@fhirvs</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">units</span></span></em><em><span class="c011">-</span></em><em><span class="c011"><span class="c006">of</span></span></em><em><span class="c011">-</span></em><em><span class="c011"><span class="c006">time</span></span></em><em><span class="c011"> }?;</span></em><em><span class="c011">
</span></em><em><span class="c011"> :</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">dayOfWeek</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><code></span></em></span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">AND</span></span></em><em><span class="c011">
</span></em><em><span class="c011"> { </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">value</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@fhirvs</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">days</span></span></em><em><span class="c011">-</span></em><em><span class="c011"><span class="c006">of</span></span></em><em><span class="c011">-</span></em><em><span class="c011"><span class="c006">week</span></span></em><em><span class="c011"> }*;</span></em><em><span class="c011">
</span></em><em><span class="c011"> :</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">timeOfDay</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><time></span></em></span></span></em><em><span class="c011">*;</span></em><em><span class="c011">
</span></em><em><span class="c011"> :</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">when</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><code></span></em></span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">AND</span></span></em><em><span class="c011">
</span></em><em><span class="c011"> { </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">value</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@fhirvs</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">event</span></span></em><em><span class="c011">-</span></em><em><span class="c011"><span class="c006">timing</span></span></em><em><span class="c011"> }*;</span></em><em><span class="c011">
</span></em><em><span class="c011"> :</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">offset</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><unsignedInt></span></em></span></span></em><em><span class="c011">?;</span></em><em><span class="c011">
</span></em><em><span class="c011">}</span></em><em><span class="c011">
</span></em><em><span class="c011"><span class="c006">AND</span></span></em><em><span class="c011"> {(:</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">duration</span></span></em><em><span class="c011"> .; :</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">durationUnits</span></span></em><em><span class="c011"> .)? }</span></em><em><span class="c011">
</span></em><em><span class="c011"><span class="c006">AND</span></span></em><em><span class="c011"> {(:</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">period</span></span></em><em><span class="c011"> . ; :</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">periodUnits</span></span></em><em><span class="c011"> .)? }</span></em><em><span class="c011">
</span></em><em><span class="c011"><span class="c006">AND</span></span></em><em><span class="c011"> {:</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">duration</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c003">MinInclusive</span></span></em><em><span class="c011"> 0 ? }</span></em><em><span class="c011">
</span></em><em><span class="c011"><span class="c006">AND</span></span></em><em><span class="c011"> {:</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">period</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c003">MinInclusive</span></span></em><em><span class="c011"> 0 ? }</span></em><em><span class="c011">
</span></em><em><span class="c011"><span class="c006">AND</span></span></em><em><span class="c011"> {(:</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">periodMax</span></span></em><em><span class="c011"> . ; :</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">period</span></span></em><em><span class="c011"> . )? }</span></em><em><span class="c011">
</span></em><em><span class="c011"><span class="c006">AND</span></span></em><em><span class="c011"> {(:</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">durationMax</span></span></em><em><span class="c011"> . ; :</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">duration</span></span></em><em><span class="c011"> .)? }</span></em><em><span class="c011">
</span></em><em><span class="c011"><span class="c006">AND</span></span></em><em><span class="c011"> {(:</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">countMax</span></span></em><em><span class="c011"> . ; :</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">count</span></span></em><em><span class="c011"> .)? }</span></em><em><span class="c011">
</span></em><em><span class="c011"><span class="c006">AND</span></span></em><em><span class="c011"> { :</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">offset</span></span></em><em><span class="c011"> . ; :</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">when</span></span></em><em><span class="c011"> [. - </span></em><em><span class="c011"><span class="c005"><em><span class="c011">"C"</span></em></span></span></em><em><span class="c011"> - </span></em><em><span class="c011"><span class="c005"><em><span class="c011">"CM"</span></em></span></span></em><em><span class="c011"> - </span></em><em><span class="c011"><span class="c005"><em><span class="c011">"CD"</span></em></span></span></em><em><span class="c011"> - </span></em><em><span class="c011"><span class="c005"><em><span class="c011">"CV"</span></em></span></span></em><em><span class="c011">]</span></em><em><span class="c011">
</span></em><em><span class="c011"> | :</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">when</span></span></em><em><span class="c011"> . ? </span></em><em><span class="c011"><span class="c008"><em><span class="c011"># if there is no offset there can still be a when</span></em></span></span></em><em><span class="c011">
</span></em><em><span class="c011"> }</span></em><em><span class="c011">
</span></em><em><span class="c011"><span class="c006">AND</span></span></em><em><span class="c011"> {:</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">timeOfDay</span></span></em><em><span class="c011"> . | :</span></em><em><span class="c011"><span class="c006">repeat</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">when</span></span></em><em><span class="c011"> . }</span></em></td></tr>
</table></div></div><p>The value set idiom of specifying a value type and a value set (e.g.,
<code><</code><code><span class="c006">code</span></code><code>></code> and
<code><span class="c006">fhirvs</span></code><code>:</code><code><span class="c006">units</span></code><code>-</code><code><span class="c006">of</span></code><code>-</code><code><span class="c006">time</span></code>) allows one to specify the structure and also to specify values within that structure.</p>
<h3 class="subsection" id="sec184">6.2.3 FHIR/RDF Development</h3>
<p>
<a id="ch6.sec2.3"></a>
<a id="ch070.FHIRRDFDevelopment"></a></p><p>The FHIR/RDF group, a joint undertaking of W3C and HL7, used ShEx not only to define the final product but also to describe intermediate ideas and test them against example data.
To this end, members of the group learned ShEx to streamline the process with concrete, testable proposals.
During the development and deployment of version 3 of FHIR, Harold Solbrig (Mayo Clinic) implemented a pipeline to test shapes against FHIR example data, catching errors in both the examples and the ShEx schema. </p><p>Because the agile FHIR standardization process is centered around the maintenance of FHIR resource structure definitions,
the ShEx for FHIR is generated from these definitions.
The easy way to do this is to generate ShExJ (the JSON representation) but because the FHIR group wanted these to be appealing to readers,
they were transformed into ShExC, making specific white space decisions in the process.
These ShExC representations could then be parsed to the abstract syntax to be tested against the reference ShExJ schemas.
The latter transformation was simpler and less error prone as it is involved only with the direct semantics.</p>
<h3 class="subsection" id="sec185">6.2.4 Generic Properties</h3>
<p>
<a id="ch6.sec2.4"></a>
<a id="ch070.FHIRGenericProperties"></a></p><p>Because electronic medical records use a consistent template to represent most clinical data, they rely heavily on generic properties.
These properties may be used multiple times with different constraints.
A simple example of this is a blood pressure, which actually consists of two measurements: systolic (pressure during heart beat) and diastolic (pressure between heart beats).
Both of these measurements are connected to the blood pressure measurement by a
<code><span class="c006">fhir</span></code><code>:</code><code><span class="c006">Observation</span></code><code>.</code><code><span class="c006">component</span></code>
property.</p><div class="example"><div class="theorem"><span class="c013">Example 158</span> <em>FHIR blood pressure</em><sup><a id="text48" href="#note48"><em>7</em></a></sup><p><em>A </em><em>
</em><code><em><</em></code><code><em><span class="c006">blood</span></em></code><code><em>-</em></code><code><em><span class="c006">pressure</span></em></code><code><em>></em></code><em> shape can be defined in ShEx as:</em></p><table class="lstframe c014"><tr><td class="lstlisting"><em><span class="c011"><span class="c008"><em><span class="c011"><blood-pressure></span></em></span></span></em><em><span class="c011"> {</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c003">a</span></span></em><em><span class="c011"> [</span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">Observation</span></span></em><em><span class="c011">];</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">Observation</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">component</span></span></em><em><span class="c011"> {</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">Observation</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">component</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">code</span></span></em><em><span class="c011"> {</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">CodeableConcept</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">coding</span></span></em><em><span class="c011"> {</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c003">a</span></span></em><em><span class="c011"> [</span></em><em><span class="c011"><span class="c006">loinc</span></span></em><em><span class="c011">:8480-6] ; </span></em><em><span class="c011"><span class="c008"><em><span class="c011"># systolic</span></em></span></span></em><em><span class="c011">
</span></em><em><span class="c011"> }</span></em><em><span class="c011">
</span></em><em><span class="c011"> } ;</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">Observation</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">component</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">valueQuantity</span></span></em><em><span class="c011"> {</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">Quantity</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">value</span></span></em><em><span class="c011"> { </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">value</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c004">xsd</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">decimal</span></span></em><em><span class="c011"> };</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">Quantity</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">unit</span></span></em><em><span class="c011"> { </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">value</span></span></em><em><span class="c011"> [</span></em><em><span class="c011"><span class="c005"><em><span class="c011">"mmHg"</span></em></span></span></em><em><span class="c011">] };</span></em><em><span class="c011">
</span></em><em><span class="c011"> }</span></em><em><span class="c011">
</span></em><em><span class="c011"> } ;</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">Observation</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">component</span></span></em><em><span class="c011"> {</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">Observation</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">component</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">code</span></span></em><em><span class="c011"> {</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">CodeableConcept</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">coding</span></span></em><em><span class="c011"> {</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c003">a</span></span></em><em><span class="c011"> [</span></em><em><span class="c011"><span class="c006">loinc</span></span></em><em><span class="c011">:8462-4] ; </span></em><em><span class="c011"><span class="c008"><em><span class="c011"># diastolic</span></em></span></span></em><em><span class="c011">
</span></em><em><span class="c011"> }</span></em><em><span class="c011">
</span></em><em><span class="c011"> };</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">Observation</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">component</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">valueQuantity</span></span></em><em><span class="c011"> {</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">Quantity</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">value</span></span></em><em><span class="c011"> { </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">value</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c004">xsd</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">decimal</span></span></em><em><span class="c011"> };</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">Quantity</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">unit</span></span></em><em><span class="c011"> { </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">value</span></span></em><em><span class="c011"> [</span></em><em><span class="c011"><span class="c005"><em><span class="c011">"mmHg"</span></em></span></span></em><em><span class="c011">] };</span></em><em><span class="c011">
</span></em><em><span class="c011"> }</span></em><em><span class="c011">
</span></em><em><span class="c011"> }</span></em><em><span class="c011">
</span></em><em><span class="c011">}</span></em></td></tr>
</table><p><em>and an example data conforming to that shape can be:</em></p><table class="lstframe c014"><tr><td class="lstlisting"><em><span class="c011"><span class="c008"><em><span class="c011"><http://hl7.org/fhir/Observation/blood-pressure></span></em></span></span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c003">a</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">Observation</span></span></em><em><span class="c011">; </span></em><em><span class="c011"><span class="c008"><em><span class="c011"># Passes as a <blood-pressure></span></em></span></span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">Observation</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">component</span></span></em><em><span class="c011"> [</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">Observation</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">component</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">code</span></span></em><em><span class="c011"> [</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">CodeableConcept</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">coding</span></span></em><em><span class="c011"> [</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c003">a</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">loinc</span></span></em><em><span class="c011">:8480-6; </span></em><em><span class="c011"><span class="c008"><em><span class="c011"># systolic</span></em></span></span></em><em><span class="c011">
</span></em><em><span class="c011"> ]</span></em><em><span class="c011">
</span></em><em><span class="c011"> ];</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">Observation</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">component</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">valueQuantity</span></span></em><em><span class="c011"> [</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">Quantity</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">value</span></span></em><em><span class="c011"> [ </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">value</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c005"><em><span class="c011">"107"</span></em></span></span></em><em><span class="c011">^^</span></em><em><span class="c011"><span class="c004">xsd</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">decimal</span></span></em><em><span class="c011"> ];</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">Quantity</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">unit</span></span></em><em><span class="c011"> [ </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">value</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c005"><em><span class="c011">"mmHg"</span></em></span></span></em><em><span class="c011"> ];</span></em><em><span class="c011">
</span></em><em><span class="c011"> ]</span></em><em><span class="c011">
</span></em><em><span class="c011"> ], [</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">Observation</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">component</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">code</span></span></em><em><span class="c011"> [</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">CodeableConcept</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">coding</span></span></em><em><span class="c011"> [</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c003">a</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">loinc</span></span></em><em><span class="c011">:8462-4; </span></em><em><span class="c011"><span class="c008"><em><span class="c011"># diastolic</span></em></span></span></em><em><span class="c011">
</span></em><em><span class="c011"> ]</span></em><em><span class="c011">
</span></em><em><span class="c011"> ];</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">Observation</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">component</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">valueQuantity</span></span></em><em><span class="c011"> [</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">Quantity</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">value</span></span></em><em><span class="c011"> [ </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">value</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c005"><em><span class="c011">"60"</span></em></span></span></em><em><span class="c011">^^</span></em><em><span class="c011"><span class="c004">xsd</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">decimal</span></span></em><em><span class="c011"> ];</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">Quantity</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">unit</span></span></em><em><span class="c011"> [ </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">value</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c005"><em><span class="c011">"mmHg"</span></em></span></span></em><em><span class="c011"> ];</span></em><em><span class="c011">
</span></em><em><span class="c011"> ]</span></em><em><span class="c011">
</span></em><em><span class="c011"> ] .</span></em></td></tr>
</table></div></div><p>This example is long, but it is taken directly from a use case.
In fact, its length encourages us to do a bit of factoring.
While we want to keep constraints on the codes for systolic and diastolic, we can create a separate
<code><</code><code><span class="c006">valueObs</span></code><code>></code> shape to capture the quantity measurement.</p><div class="example"><div class="theorem"><span class="c013">Example 159</span> <em>Factored FHIR blood pressure</em><table class="lstframe c014"><tr><td class="lstlisting"><em><span class="c011"><span class="c003">PREFIX</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">: </span></em><em><span class="c011"><span class="c008"><em><span class="c011"><http://hl7.org/fhir/></span></em></span></span></em><em><span class="c011">
</span></em><em><span class="c011"><span class="c003">PREFIX</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">loinc</span></span></em><em><span class="c011">: </span></em><em><span class="c011"><span class="c008"><em><span class="c011"><http://loinc.org/owl#></span></em></span></span></em><em><span class="c011">
</span></em><em><span class="c011"><span class="c003">PREFIX</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c004">owl</span></span></em><em><span class="c011">: </span></em><em><span class="c011"><span class="c008"><em><span class="c011"><http://www.w3.org/2002/07/owl#></span></em></span></span></em><em><span class="c011">
</span></em><em><span class="c011"><span class="c003">PREFIX</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c004">rdfs</span></span></em><em><span class="c011">: </span></em><em><span class="c011"><span class="c008"><em><span class="c011"><http://www.w3.org/2000/01/rdf-schema#></span></em></span></span></em><em><span class="c011">
</span></em><em><span class="c011"><span class="c003">PREFIX</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">sct</span></span></em><em><span class="c011">: </span></em><em><span class="c011"><span class="c008"><em><span class="c011"><http://snomed.info/id/></span></em></span></span></em><em><span class="c011">
</span></em><em><span class="c011"><span class="c003">PREFIX</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c004">xsd</span></span></em><em><span class="c011">: </span></em><em><span class="c011"><span class="c008"><em><span class="c011"><http://www.w3.org/2001/XMLSchema#></span></em></span></span></em><em><span class="c011">
</span></em><em><span class="c011"><span class="c003">BASE</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c008"><em><span class="c011"><http://hl7.org/fhir/shape/></span></em></span></span></em><em><span class="c011">
</span></em><em><span class="c011">
</span></em><em><span class="c011"><span class="c008"><em><span class="c011"><blood-pressure></span></em></span></span></em><em><span class="c011"> {</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c003">a</span></span></em><em><span class="c011"> [</span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">Observation</span></span></em><em><span class="c011">];</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">Observation</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">component</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><valueObs></span></em></span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">AND</span></span></em><em><span class="c011"> {</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">Observation</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">component</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">code</span></span></em><em><span class="c011"> {</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">CodeableConcept</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">coding</span></span></em><em><span class="c011"> {</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c003">a</span></span></em><em><span class="c011"> [</span></em><em><span class="c011"><span class="c006">loinc</span></span></em><em><span class="c011">:8480-6] ; </span></em><em><span class="c011"><span class="c008"><em><span class="c011"># systolic</span></em></span></span></em><em><span class="c011">
</span></em><em><span class="c011"> }</span></em><em><span class="c011">
</span></em><em><span class="c011"> }</span></em><em><span class="c011">
</span></em><em><span class="c011"> } ;</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">Observation</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">component</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">@</span></span></em><em><span class="c011"><span class="c008"><em><span class="c011"><valueObs></span></em></span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">AND</span></span></em><em><span class="c011"> {</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">Observation</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">component</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">code</span></span></em><em><span class="c011"> {</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">CodeableConcept</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">coding</span></span></em><em><span class="c011"> {</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c003">a</span></span></em><em><span class="c011"> [</span></em><em><span class="c011"><span class="c006">loinc</span></span></em><em><span class="c011">:8462-4] ; </span></em><em><span class="c011"><span class="c008"><em><span class="c011"># diastolic</span></em></span></span></em><em><span class="c011">
</span></em><em><span class="c011"> }</span></em><em><span class="c011">
</span></em><em><span class="c011"> }</span></em><em><span class="c011">
</span></em><em><span class="c011"> }</span></em><em><span class="c011">
</span></em><em><span class="c011">}</span></em><em><span class="c011">
</span></em><em><span class="c011">
</span></em><em><span class="c011"><span class="c008"><em><span class="c011"><valueObs></span></em></span></span></em><em><span class="c011"> {</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">Observation</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">component</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">valueQuantity</span></span></em><em><span class="c011"> {</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">Quantity</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">value</span></span></em><em><span class="c011"> { </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">value</span></span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c004">xsd</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">decimal</span></span></em><em><span class="c011"> };</span></em><em><span class="c011">
</span></em><em><span class="c011"> </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">Quantity</span></span></em><em><span class="c011">.</span></em><em><span class="c011"><span class="c006">unit</span></span></em><em><span class="c011"> { </span></em><em><span class="c011"><span class="c006">fhir</span></span></em><em><span class="c011">:</span></em><em><span class="c011"><span class="c006">value</span></span></em><em><span class="c011"> [</span></em><em><span class="c011"><span class="c005"><em><span class="c011">"mmHg"</span></em></span></span></em><em><span class="c011">] };</span></em><em><span class="c011">
</span></em><em><span class="c011"> }</span></em><em><span class="c011">
</span></em><em><span class="c011">}</span></em></td></tr>
</table></div></div><p>This schema has two repeated properties:
<code><span class="c006">fhir</span></code><code>:</code><code><span class="c006">Observation</span></code><code>.</code><code><span class="c006">component</span></code> with different constraints (one for systolic and the other for diastolic). It takes advantage of ShEx’s intuitive <em>additive semantics</em> where requirements for repeated properties
are simply expressed as additional triple patterns (see section <a href="bookHtml010.html#ch040.RepeatedPropertiesSection">4.6.7</a>).</p>
<h2 class="section" id="sec186">6.3 Springer Nature SciGraph</h2>
<p>
<a id="ch070SciGraph"></a>
<a id="ch6.sec3"></a></p><p>Springer Nature SciGraph<sup><a id="text49" href="#note49">8</a></sup> is a new Linked Open Data platform aggregating data sources from Springer Nature and key partners from the scholarly domain.
The platform currently collates information from across the research landscape,
such as funders, research projects, conferences, affiliations, and publications (books and journals).
This high-quality data from trusted and reliable sources provides a rich semantic description of how information is related,
as well as enabling innovative visualizations of the scholarly domain.</p><p>Data quality is a key component in SciGraph.
In earlier work, SPIN was used in various validation scenarios.
However, SPIN was hard to maintain and to read by non-experts and SHACL was chosen instead.
SHACL is now used to validate data before the data enters the main triplestore.
SHACL is also used to specify which classes and properties can be published from the triplestore.</p><p>All of the SHACL shapes used in building public datasets of Springer Nature SciGraph are published in a Github
repository.<sup><a id="text50" href="#note50">9</a></sup>
There are shapes that define the RDF structure of all SciGraph entity types such as articles, grants, and journals. </p><p>The following snippet of the
<code><span class="c006">Article</span></code> shape says that all SHACL instances of
<code><span class="c006">sg</span></code><code>:</code><code><span class="c006">Article</span></code> must have
exactly one
<code><span class="c006">sg</span></code><code>:</code><code><span class="c006">scigraphId</span></code> that is a string,
at most one value for
<code><span class="c006">sg</span></code><code>:</code><code><span class="c006">doi</span></code>,
a string following a specific pattern and at most one value for
<code><span class="c006">sg</span></code><code>:</code><code><span class="c006">role</span></code> that can be one of:<em>author</em>, <em>editor</em> or <em>principal investigator</em>.</p><table class="lstframe c014"><tr><td class="lstlisting"><span class="c011">:</span><span class="c011"><span class="c006">Article</span></span><span class="c011"> </span><span class="c011"><span class="c003">a</span></span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">NodeShape</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">targetClass</span></span><span class="c011"> </span><span class="c011"><span class="c006">sg</span></span><span class="c011">:</span><span class="c011"><span class="c006">Article</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">rdfs</span></span><span class="c011">:</span><span class="c011"><span class="c006">label</span></span><span class="c011"> </span><span class="c011"><span class="c005"><span class="c011">"RDF shape for the sg:Article model"</span></span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c008"><span class="c011"># Identity</span></span></span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c006">sg</span></span><span class="c011">:</span><span class="c011"><span class="c006">scigraphId</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">datatype</span></span><span class="c011"> </span><span class="c011"><span class="c004">xsd</span></span><span class="c011">:</span><span class="c011"><span class="c006">string</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">minCount</span></span><span class="c011"> 1 ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">maxCount</span></span><span class="c011"> 1 ;</span><span class="c011">
</span><span class="c011"> ] ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c006">sg</span></span><span class="c011">:</span><span class="c011"><span class="c006">doi</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">datatype</span></span><span class="c011"> </span><span class="c011"><span class="c004">xsd</span></span><span class="c011">:</span><span class="c011"><span class="c006">string</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">pattern</span></span><span class="c011"> </span><span class="c011"><span class="c005"><span class="c011">"^10\\.\\d{4,5}\\/\\S+$"</span></span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">maxCount</span></span><span class="c011"> 1 ;</span><span class="c011">
</span><span class="c011"> ] ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c008"><span class="c011"># ...</span></span></span><span class="c011">
</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c006">sg</span></span><span class="c011">:</span><span class="c011"><span class="c006">role</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">in</span></span><span class="c011"> ( </span><span class="c011"><span class="c005"><span class="c011">"author"</span></span></span><span class="c011"> </span><span class="c011"><span class="c005"><span class="c011">"editor"</span></span></span><span class="c011"> </span><span class="c011"><span class="c005"><span class="c011">"principal investigator"</span></span></span><span class="c011"> ) ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">maxCount</span></span><span class="c011"> 1 ;</span><span class="c011">
</span><span class="c011"> ] ;</span></td></tr>
</table>
<h2 class="section" id="sec187">6.4 DBpedia Validation Use Cases</h2>
<p>
<a id="ch070DBpedia"></a>
<a id="ch6.sec4"></a></p><p>DBpedia<sup><a id="text51" href="#note51">10</a></sup>
([<a href="bookHtml018.html#dbpedia-swj">60</a>]) is a crowdsourced community effort to extract structured information from Wikipedia and make this information available on the Web.
DBpedia data is available as RDF dumps, through a linked data interface and a SPARQL endpoint.
The current DBpedia release (version 2016-04<sup><a id="text52" href="#note52">11</a></sup>) provides circa 9.5 billion RDF triples.</p><p>Validating such large amounts of RDF data is a challenging task, and various methods have been applied.
At the time of writing, the core validation of DBpedia is performed with neither ShEx nor SHACL.
However, it is worth mentioning some approaches that work on large and noisy datasets.</p>
<h3 class="subsection" id="sec188">6.4.1 Ontology-based Validation</h3>
<p>
<a id="ch6.sec4.1"></a></p><p>One of the core sources of validation for DBpedia is the DBpedia ontology.
The DBpedia ontology is crowdsourced and maintained by the community on the
<a href="http://mappings.dbpedia.org"><span class="c010">http://mappings.dbpedia.org</span></a> wiki.
At the time of writing, the ontology consists of circa 750 classes, organized in a hierarchy, and 2,600 properties.
The community can define class disjoint statements and for properties, axioms such as domain, range, literal datatypes, and functional properties.
The DBpedia ontology both drives the correct extraction of RDF triples from Wikipedia pages and is used in post-processing steps to remove data violations.</p><p>The DBpedia extraction framework has many extractors that parse different parts of a Wikipedia page and generate RDF triples.
The Mapping-based extractor is a special extractor that focuses on high-quality extraction from Wikipedia infoboxes.
To achieve this it uses the DBpedia ontology and the community-maintained infobox-to-ontology mappings.
Each infobox mapping maps a Wikipedia infobox template to a DBpedia class and each infobox template parameter to a property mapping (see [<a href="bookHtml018.html#dbpedia-swj">60, sec. 2.4</a>]) .
At extraction time, each property mapping is associated with a different parser, according to the
<code><span class="c004">rdfs</span></code><code>:</code><code><span class="c006">range</span></code> of the DBpedia property of each property mapping.
For example, if the range of a property is defined as an
<code><span class="c004">xsd</span></code><code>:</code><code><span class="c006">date</span></code> (e.g.
<code><span class="c004">dbo</span></code><code>:</code><code><span class="c006">birthDate</span></code>), property mappings with this property generate a value only if the value can be parsed as a date.</p><p>As a post-processing step, the RDFS and OWL axioms defined in the DBpedia ontology are used to further clean up the extracted data.
A common approach is to run RDFUnit on the data and get back detailed violation reports.
These reports are used to identify common sources of error that can be planned for fixing.
Another approach is a set of scripts that parse facts and, depending on the conformance of a fact to a set of axioms (e.g.,
<code><span class="c004">rdfs</span></code><code>:</code><code><span class="c006">domain</span></code>,
<code><span class="c004">rdfs</span></code><code>:</code><code><span class="c006">range</span></code>,
<code><span class="c004">owl</span></code><code>:</code><code><span class="c006">disjointWith</span></code>, etc)
dispatches the facts to different dataset buckets before publishing.</p>
<h3 class="subsection" id="sec189">6.4.2 RDF Mappings Validation</h3>
<p>
<a id="ch6.sec4.2"></a></p><p>A very common way to generate RDF data is through a mapping document.
In a general case, a mapping document contains rules that can be used to transform input data to RDF.
The mapping rules can be encoded in a script (e.g., using XSLT), in code, or formulated in mapping languages such as R2RML [<a href="bookHtml018.html#R2RML">28</a>] and RML [<a href="bookHtml018.html#RML">30</a>].</p><p>A single error in the mapping document can, in many cases, be propagated to many errors on the generated instance data,
and the number of errors is usually proportional to the input size.
Consider for example a mapping document that generates person data and represents the age of a person with the property
<code><span class="c004">foaf</span></code><code>:</code><code><span class="c006">age</span></code> and the value as
<code><span class="c004">xsd</span></code><code>:</code><code><span class="c006">double</span></code> instead of
<code><span class="c004">xsd</span></code><code>:</code><code><span class="c006">integer</span></code>.
Every person instance in the generated RDF will have a violation for the datatype of
<code><span class="c004">foaf</span></code><code>:</code><code><span class="c006">age</span></code>.
Fixing such errors in the mapping document is an easy task, but
once the data is generated the task becomes harder, especially on big datasets.</p><p>Dimou et al. [<a href="bookHtml018.html#iswc15_rml_rdfunit">31</a>] propose a workflow for including quality assessment of the mappings in the general dataset quality assessment workflow.
The authors use the dataset schema information (i.e., ontologies) to identify schema errors of the dataset directly from an RML mapping document.
The results illustrate that violations such as domain and range, mistyped datatypes, class and property disjointness, and the like can be identified directly from the mapping document.
Evaluation of this work indicates that fixing errors directly in the mapping document is more efficient.
For example, in the case of DBpedia, an automatic quality assessment of the mappings took less than a minute while the complete dataset validation took more than 16 hours.</p><p>However, the mapping quality assessment of the mappings cannot identify all possible schema errors in the target dataset.
Some constraints, such as cardinality, can only be identified on the target dataset.</p><p><a id="hevea_default797"></a> <a id="hevea_default798"></a>
Even though this approach currently works with OWL and RDFS, it would be an easy exercise to extend it to SHACL or ShEx.
Given a set of mappings and a set of Shapes, one could identify incompatibilities directly from the mapping document.</p>
<h3 class="subsection" id="sec190">6.4.3 Validating Link Contributions with SHACL</h3>
<p>
<a id="ch6.sec4.3"></a></p><p><a id="hevea_default799"></a> <a id="hevea_default800"></a>
DBpedia promotes Github for accepting link contributions from the DBpedia
community<sup><a id="text53" href="#note53">12</a></sup>
and, recently, there has been an effort to automate the link verification process
(see [<a href="bookHtml018.html#DojchinovskiDBpediaLinks">32, Section 3.3</a>]).
<a id="hevea_default801"></a> <a id="hevea_default802"></a> <a id="hevea_default803"></a>
This has put into place a set of quality checks that validate various aspects of the link submission and is integrated with common continuous integration services, such as Travis CI.</p><p>This approach enables instant checks on pull requests and reports problems to the submitter.
In addition to scripts that check for instance valid RDF files,
there is a script that checks if the link manifest file conforms to the following SHACL schema.<sup><a id="text54" href="#note54">13</a></sup></p><table class="lstframe c014"><tr><td class="lstlisting"><span class="c011"><span class="c006">dbp</span></span><span class="c011">:</span><span class="c011"><span class="c006">LinkManifest</span></span><span class="c011"> </span><span class="c011"><span class="c003">a</span></span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">NodeShape</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">targetClass</span></span><span class="c011"> </span><span class="c011"><span class="c004">void</span></span><span class="c011">:</span><span class="c011"><span class="c006">Linkset</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c004">dc</span></span><span class="c011">:</span><span class="c011"><span class="c006">author</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">minCount</span></span><span class="c011"> 1;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">nodeKind</span></span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">IRI</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> ] ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c004">dct</span></span><span class="c011">:</span><span class="c011"><span class="c006">description</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">minCount</span></span><span class="c011"> 1;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">nodeKind</span></span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">Literal</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">datatype</span></span><span class="c011"> </span><span class="c011"><span class="c004">xsd</span></span><span class="c011">:</span><span class="c011"><span class="c006">string</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> ] ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c004">dct</span></span><span class="c011">:</span><span class="c011"><span class="c006">license</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">minCount</span></span><span class="c011"> 1;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">nodeKind</span></span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">IRI</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> ] ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c006">dbp</span></span><span class="c011">:</span><span class="c011"><span class="c006">script</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">maxCount</span></span><span class="c011"> 1;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">nodeKind</span></span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">IRI</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> ] ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c006">dbp</span></span><span class="c011">:</span><span class="c011"><span class="c006">linkConf</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">maxCount</span></span><span class="c011"> 1;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">nodeKind</span></span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">IRI</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> ] ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c006">dbp</span></span><span class="c011">:</span><span class="c011"><span class="c006">ntriplefilelocation</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">maxCount</span></span><span class="c011"> 1;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">nodeKind</span></span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">IRI</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> ] ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c006">dbp</span></span><span class="c011">:</span><span class="c011"><span class="c006">endpoint</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">maxCount</span></span><span class="c011"> 1;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">nodeKind</span></span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">IRI</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> ] ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c006">dbp</span></span><span class="c011">:</span><span class="c011"><span class="c006">constructQuery</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">maxCount</span></span><span class="c011"> 1;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">nodeKind</span></span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">Literal</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">datatype</span></span><span class="c011"> </span><span class="c011"><span class="c004">xsd</span></span><span class="c011">:</span><span class="c011"><span class="c006">string</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> ] ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c006">dbp</span></span><span class="c011">:</span><span class="c011"><span class="c006">approvedPatch</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">nodeKind</span></span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">IRI</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> ] ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c006">dbp</span></span><span class="c011">:</span><span class="c011"><span class="c006">optionalPatch</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">nodeKind</span></span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">IRI</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> ] ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c006">dbp</span></span><span class="c011">:</span><span class="c011"><span class="c006">updateFrequencyInDays</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">maxCount</span></span><span class="c011"> 1;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">nodeKind</span></span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">Literal</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">datatype</span></span><span class="c011"> </span><span class="c011"><span class="c004">xsd</span></span><span class="c011">:</span><span class="c011"><span class="c006">integer</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> ] ;</span></td></tr>
</table><p>The defined quality checks cannot capture all possible errors in a link submission process.
However, they can
(a) provide a very useful feedback to the link submitter, and
(b) enable DBpedia to automatically pre-process some steps in the link generation pipeline.</p>
<h3 class="subsection" id="sec191">6.4.4 Ontology Validation with SHACL</h3>
<p>
<a id="ch6.sec4.4"></a></p><p>The DBpedia ontology has been maintained by the DBpedia community in a crowdsourced manner at the <a href="http://mappings.dbpedia.org"><span class="c010">http://mappings.dbpedia.org</span></a> wiki.
There is an ongoing effort to move ontology development onto Github for easier collaboration and for the sake of more control over the ontology structure.
<sup><a id="text55" href="#note55">14</a></sup>
At the time of writing, the following constraints are defined to ensure that each DBpedia class and each DBpedia property conform to DBpedia community requirements:</p><ul class="itemize"><li class="li-itemize">
Each DBpedia class and property must have at least one
<code><span class="c004">rdfs</span></code><code>:</code><code><span class="c006">label</span></code> and at least one
<code><span class="c004">rdfs</span></code><code>:</code><code><span class="c006">comment</span></code> that are of
<code><span class="c004">rdf</span></code><code>:</code><code><span class="c006">langString</span></code> datatype with unique language.
</li><li class="li-itemize">Each DBpedia class can have at most one direct super class.
</li><li class="li-itemize">Each DBpedia property can have at most one direct super property.
</li><li class="li-itemize">Each DBpedia property can have at most one
<code><span class="c004">rdfs</span></code><code>:</code><code><span class="c006">domain</span></code>.
</li><li class="li-itemize">Each DBpedia property can have at most one
<code><span class="c004">rdfs</span></code><code>:</code><code><span class="c006">range</span></code>.
</li><li class="li-itemize">The domain and range of each property must be defined as an
<code><span class="c004">owl</span></code><code>:</code><code><span class="c006">Class</span></code>.
</li><li class="li-itemize">Top-level DBpedia classes must be discussed before defined.
</li></ul><p>These constraints are implemented with the following SHACL definitions.
RDFUnit is used to perform the validation as well as integrate with Travis CI and automate the checks on each commit and pull request.</p><table class="lstframe c014"><tr><td class="lstlisting"><span class="c011"><span class="c004">dbo</span></span><span class="c011">-</span><span class="c011"><span class="c006">shape</span></span><span class="c011">:</span><span class="c011"><span class="c006">ClassShape</span></span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c003">a</span></span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">Shape</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">targetClass</span></span><span class="c011"> </span><span class="c011"><span class="c004">owl</span></span><span class="c011">:</span><span class="c011"><span class="c006">Class</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">targetSubjectsOf</span></span><span class="c011"> </span><span class="c011"><span class="c004">rdfs</span></span><span class="c011">:</span><span class="c011"><span class="c006">subClassOf</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">severity</span></span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">Error</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">message</span></span><span class="c011"> </span><span class="c011"><span class="c005"><span class="c011">"Each owl:Class should have at least one rdfs:label"</span></span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c004">rdfs</span></span><span class="c011">:</span><span class="c011"><span class="c006">label</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">minCount</span></span><span class="c011"> 1;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">dataType</span></span><span class="c011"> </span><span class="c011"><span class="c004">rdf</span></span><span class="c011">:</span><span class="c011"><span class="c006">langString</span></span><span class="c011">;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">uniqueLang</span></span><span class="c011"> </span><span class="c011"><span class="c003">true</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> ] ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">message</span></span><span class="c011"> </span><span class="c011"><span class="c005"><span class="c011">"Each owl:Class should have at least one rdfs:comment"</span></span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c004">rdfs</span></span><span class="c011">:</span><span class="c011"><span class="c006">comment</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">minCount</span></span><span class="c011"> 1;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">dataType</span></span><span class="c011"> </span><span class="c011"><span class="c004">rdf</span></span><span class="c011">:</span><span class="c011"><span class="c006">langString</span></span><span class="c011">;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">uniqueLang</span></span><span class="c011"> </span><span class="c011"><span class="c003">true</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> ] ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">message</span></span><span class="c011"> </span><span class="c011"><span class="c005"><span class="c011">"Each owl:Class should have at most one superclass"</span></span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c004">rdfs</span></span><span class="c011">:</span><span class="c011"><span class="c006">subClassOf</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">maxCount</span></span><span class="c011"> 1;</span><span class="c011">
</span><span class="c011"> ] ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">sparql</span></span><span class="c011"> [</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">message</span></span><span class="c011"> </span><span class="c011"><span class="c005"><span class="c011">"DBpedia Ontology only allows 9 top level classes, any new top level classes need to be discussed"</span></span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">severity</span></span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">Warning</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">select</span></span><span class="c011"> </span><span class="c011"><span class="c005"><span class="c011">""</span></span></span><span class="c011"><span class="c005"><span class="c011">"</span><span class="c011">
</span><span class="c011"> PREFIX owl: <http://www.w3.org/2002/07/owl#></span><span class="c011">
</span><span class="c011"> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#></span><span class="c011">
</span><span class="c011"> SELECT DISTINCT $this ?otherClass</span><span class="c011">
</span><span class="c011"> WHERE {</span><span class="c011">
</span><span class="c011"> $this rdfs:subClassOf owl:Thing .</span><span class="c011">
</span><span class="c011"> FILTER($this NOT IN (</span><span class="c011">
</span><span class="c011"> <http://dbpedia.org/ontology/Activity>,</span><span class="c011">
</span><span class="c011"> <http://dbpedia.org/ontology/Agent>,</span><span class="c011">
</span><span class="c011"> <http://dbpedia.org/ontology/Concept>,</span><span class="c011">
</span><span class="c011"> <http://dbpedia.org/ontology/CommunicationSystem>,</span><span class="c011">
</span><span class="c011"> <http://dbpedia.org/ontology/Condition>,</span><span class="c011">
</span><span class="c011"> <http://dbpedia.org/ontology/Event>,</span><span class="c011">
</span><span class="c011"> <http://dbpedia.org/ontology/PhysicalThing>,</span><span class="c011">
</span><span class="c011"> <http://dbpedia.org/ontology/Place>,</span><span class="c011">
</span><span class="c011"> <http://dbpedia.org/ontology/TimePeriod>)</span><span class="c011">
</span><span class="c011"> ).</span><span class="c011">
</span><span class="c011"> } "</span></span></span><span class="c011"><span class="c005"><span class="c011">""</span></span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> ] .</span><span class="c011">
</span><span class="c011">
</span><span class="c011"><span class="c004">dbo</span></span><span class="c011">-</span><span class="c011"><span class="c006">shape</span></span><span class="c011">:</span><span class="c011"><span class="c006">PropertyShape</span></span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c003">a</span></span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">Shape</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">targetClass</span></span><span class="c011"> </span><span class="c011"><span class="c004">rdf</span></span><span class="c011">:</span><span class="c011"><span class="c006">Property</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">targetClass</span></span><span class="c011"> </span><span class="c011"><span class="c004">owl</span></span><span class="c011">:</span><span class="c011"><span class="c006">DatatypeProperty</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">targetClass</span></span><span class="c011"> </span><span class="c011"><span class="c004">owl</span></span><span class="c011">:</span><span class="c011"><span class="c006">ObjectProperty</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">targetSubjectsOf</span></span><span class="c011"> </span><span class="c011"><span class="c004">rdfs</span></span><span class="c011">:</span><span class="c011"><span class="c006">subPropertyOf</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">message</span></span><span class="c011"> </span><span class="c011"><span class="c005"><span class="c011">"Each property should have at least one rdfs:label"</span></span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c004">rdfs</span></span><span class="c011">:</span><span class="c011"><span class="c006">label</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">minCount</span></span><span class="c011"> 1;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">dataType</span></span><span class="c011"> </span><span class="c011"><span class="c004">rdf</span></span><span class="c011">:</span><span class="c011"><span class="c006">langString</span></span><span class="c011">;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">uniqueLang</span></span><span class="c011"> </span><span class="c011"><span class="c003">true</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> ] ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">message</span></span><span class="c011"> </span><span class="c011"><span class="c005"><span class="c011">"Each property should have at least one rdfs:comment"</span></span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c004">rdfs</span></span><span class="c011">:</span><span class="c011"><span class="c006">comment</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">minCount</span></span><span class="c011"> 1;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">dataType</span></span><span class="c011"> </span><span class="c011"><span class="c004">rdf</span></span><span class="c011">:</span><span class="c011"><span class="c006">langString</span></span><span class="c011">;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">uniqueLang</span></span><span class="c011"> </span><span class="c011"><span class="c003">true</span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> ] ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">property</span></span><span class="c011"> [</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">message</span></span><span class="c011"> </span><span class="c011"><span class="c005"><span class="c011">"Each property should have at most one rdfs:domain"</span></span></span><span class="c011"> ;</span><span class="c011">
</span><span class="c011"> </span><span class="c011"><span class="c004">sh</span></span><span class="c011">:</span><span class="c011"><span class="c006">path</span></span><span class="c011"> </span><span class="c011"><span class="c004">rdfs</span></span><span class="c011">:</span><span class="c011"><span class="c006">domain</span></span><span class="c011"> ;</span><span class="c011">