@igea/oac_backend 1.0.95 โ†’ 1.0.97

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@igea/oac_backend",
3
- "version": "1.0.95",
3
+ "version": "1.0.97",
4
4
  "description": "Backend service for the OAC project",
5
5
  "main": "src/index.js",
6
6
  "bin": {
@@ -12,6 +12,7 @@ const Fuseki = require('../models/fuseki');
12
12
  const Attachments = require('../models/attachments');
13
13
  const { Parser, transformMode } = require('../models/vocabolaries/parser');
14
14
  const CacheVocabularies = require('../models/vocabolaries/cache');
15
+ const EditLocks = require('../models/editLocks');
15
16
  const VocabParser = Parser.GET_INSTANCE();
16
17
 
17
18
  //---------------------------------------------------------------
@@ -278,8 +279,22 @@ router.get('/get-vocabolary-terms/:key', (req, res) => {
278
279
  }).then(response => {
279
280
  res.setHeader('Content-Type', response.headers['content-type']);
280
281
  res.header('Access-Control-Allow-Origin', '*');
281
- CacheVocabularies.set(key, response.data); // salva come stringa
282
- res.send(response.data);
282
+ const client_uuid = crypto.randomUUID();
283
+ const table = 'vocabulary-cache'
284
+ EditLocks.lockWithRetry(table, key, client_uuid).then( async (success) =>{
285
+ try{
286
+ if(success){
287
+ CacheVocabularies.set(key, response.data); // salva come stringa
288
+ await EditLocks.delete(table, key, client_uuid)
289
+ }
290
+ }catch(ex){
291
+ console.log(ex)
292
+ }
293
+ res.send(response.data);
294
+ }).catch((e)=>{
295
+ console.log(e)
296
+ res.send(response.data);
297
+ })
283
298
  }).catch(err => {
284
299
  res.status(500).json({
285
300
  success: false,
@@ -5,11 +5,49 @@ const expiration_seconds = 180 // 3 minutes
5
5
 
6
6
  class EditLocks {
7
7
 
8
- static lock(table_name, row_id, client_uuid){
8
+ static sleep(delay_ms=100) {
9
+ return new Promise(resolve => setTimeout(resolve, delay_ms));
10
+ }
11
+
12
+ static lockWithRetry(
13
+ table_name,
14
+ row_id,
15
+ client_uuid,
16
+ {
17
+ timeoutMs = 5000, // timeout totale
18
+ expirationMs = 10000, // expiration of the lock
19
+ retryDelayMs = 100 // delay minimo tra i tentativi
20
+ } = {}
21
+ ) {
22
+ return new Promise(async (resolve, reject) => {
23
+ const startTs = (new Date).getTime();
24
+ let continueLocking = true;
25
+ const exp_sec = Math.ceil(expirationMs / 1000)
26
+ while (continueLocking) {
27
+ try {
28
+ console.log("Lock with retry for " + table_name + "@" + row_id)
29
+ const acquired = await EditLocks.lock(table_name, row_id, client_uuid, exp_sec);
30
+ if (acquired === true) {
31
+ resolve(true); // ๐Ÿ” lock acquisito
32
+ return;
33
+ }
34
+ } catch (err) {
35
+ console.log(err)
36
+ }
37
+ await EditLocks.sleep(retryDelayMs);
38
+ const curTs = (new Date).getTime();
39
+ continueLocking = (curTs > startTs + timeoutMs)
40
+ }
41
+ // โ›” timeout raggiunto
42
+ resolve(false)
43
+ })
44
+ }
45
+
46
+ static lock(table_name, row_id, client_uuid, exp_sec = expiration_seconds){
9
47
  return new Promise(async (resolve, reject) => {
10
48
  try{
11
49
  let start_ts = Math.ceil(new Date().getTime()/1000)
12
- let end_ts = start_ts + expiration_seconds
50
+ let end_ts = start_ts + exp_sec
13
51
  let sql = `INSERT INTO ${table}(
14
52
  table_name, row_id, client_uuid,
15
53
  locked_at_ts, expires_at_ts
@@ -63,6 +101,7 @@ class EditLocks {
63
101
 
64
102
  static delete(table_name, row_id, client_uuid){
65
103
  return new Promise(async (resolve, reject) => {
104
+ console.log("Unlock for " + table_name + "@" + row_id)
66
105
  try {
67
106
  await db(table).where(
68
107
  {table_name, row_id, client_uuid}
@@ -1150,7 +1150,7 @@ ex:E39Actor04Shape # AUTORE - REPORT
1150
1150
  sh:targetClass crm:E39_Actor ;
1151
1151
  rdfs:label "Autore report" ;
1152
1152
  sh:property [
1153
- sh:path indagine:autore ;
1153
+ sh:path crm:P1_is_identified_by ;
1154
1154
  sh:node ex:E41Appellation03Shape ;
1155
1155
  sh:name "Autore report" ;
1156
1156
  sh:maxCount 1 ;
@@ -1,5 +1,5 @@
1
1
  @prefix sh: <http://www.w3.org/ns/shacl#> .
2
- @prefix ex: <http://example.org/shapes/> .
2
+ #@prefix ex: <http://example.org/shapes/> .
3
3
  @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
4
4
  @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
5
5
  @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@@ -12,169 +12,203 @@
12
12
  #@prefix volipi: <http://data.sparna.fr/ontologies/volipi#> .
13
13
  #@prefix skos: <http://www.w3.org/2004/02/skos/core> .
14
14
  @prefix indagine: <http://indagine/> .
15
+ @prefix this: <http://data.mydomain.com/sparnatural-page/sparnatural-config/> .
15
16
 
17
+ #@prefix dash: <http://datashapes.org/dash#> .
18
+ #@prefix core: <http://data.sparna.fr/ontologies/sparnatural-config-core#> .
19
+ #
20
+ #this:E7Activity01Shape_label sh:path rdfs:label ;
21
+ # #sh:order "1" ;
22
+ # sh:name "Label" ;
23
+ # #sh:description "Specifies the name of the object."@en, "Spรฉcifie le nom du Sympรดme"@fr ;
24
+ # sh:maxCount 1 ;
25
+ # sh:nodeKind sh:Literal ;
26
+ # sh:datatype rdf:string ;
27
+ # dash:searchWidget core:SearchProperty ;
28
+ # dash:propertyRole dash:LabelRole ;
29
+ # core:enableOptional "false"^^xsd:boolean ;
30
+ # core:enableNegation "false"^^xsd:boolean .
31
+ #
32
+ #this:E42Identifier01Shape_label sh:path rdfs:label ;
33
+ # #sh:order "1" ;
34
+ # sh:name "Label" ;
35
+ # #sh:description "Specifies the name of the object."@en, "Spรฉcifie le nom du Sympรดme"@fr ;
36
+ # sh:maxCount 1 ;
37
+ # sh:nodeKind sh:Literal ;
38
+ # sh:datatype rdf:string ;
39
+ # dash:searchWidget core:SearchProperty ;
40
+ # dash:propertyRole dash:LabelRole ;
41
+ # core:enableOptional "false"^^xsd:boolean ;
42
+ # core:enableNegation "false"^^xsd:boolean .
16
43
 
17
- ex:E7activity01Shape # INDAGINE
44
+ this:E7Activity01Shape # INDAGINE
18
45
  a sh:NodeShape, rdfs:Class ;
19
46
  sh:targetClass crm:E7_Activity ;
20
- rdfs:label "Indagine" ;
47
+ rdfs:label "Indagine" ;
48
+ #sh:description "Indagine" ;
21
49
  sh:property [
22
50
  sh:path crm:P48_has_preferred_identifier ;
23
- sh:node ex:E42Identifier01Shape ;
24
- sh:name "ID indagine" ;
51
+ sh:node this:E42Identifier01Shape ;
52
+ sh:name "ha identificativo" ;
25
53
  sh:maxCount 1 ;
26
54
  ] ;
27
55
  sh:property [
28
56
  sh:path crm:P17_was_motivated_by ;
29
- sh:node ex:I12AdoptedBeliefShape ;
30
- sh:name "Quesito diagnostico" ;
57
+ sh:node this:I12AdoptedBeliefShape ;
58
+ sh:name "รจ motivato da" ;
31
59
  sh:maxCount 1 ;
32
60
  ] ;
33
61
  sh:property [
34
62
  sh:path crm:P14_carried_out_by ;
35
- sh:node ex:E39Actor01Shape ;
36
- sh:name "Attori coinvolti" ;
63
+ sh:node this:E39Actor01Shape ;
64
+ sh:name "eseguito da" ;
37
65
  sh:maxCount 1 ;
38
66
  ] ;
39
67
  sh:property [
40
68
  sh:path crm:P16_used_specific_object ;
41
- sh:node ex:S13Sample01Shape ;
42
- sh:name "Campione" ;
69
+ sh:node this:S13Sample01Shape ;
70
+ sh:name "ha usato un oggetto specifico" ;
43
71
  sh:maxCount 1 ;
44
72
  ] .
73
+ # ] ;
74
+ # sh:property this:E7Activity01Shape_label .
45
75
 
46
- ex:E39Actor01Shape # ATTORI
76
+ this:E39Actor01Shape # ATTORI
47
77
  a sh:NodeShape, rdfs:Class ;
48
78
  sh:targetClass crm:E39_Actor ;
49
79
  rdfs:label "Attori coinvolti" ;
50
80
  sh:property [
51
81
  sh:path crm:P2_has_type ;
52
- sh:node ex:E55Type03Shape ;
53
- sh:name "Attori" ;
82
+ sh:node this:E55Type03Shape ;
83
+ sh:name "ha tipo" ;
54
84
  sh:maxCount 1 ;
55
85
  ] .
56
86
 
57
- ex:S13Sample01Shape # CAMPIONE
87
+ this:S13Sample01Shape # CAMPIONE
58
88
  a sh:NodeShape, rdfs:Class ;
59
89
  sh:targetClass j.0:S13_Sample ;
60
90
  rdfs:label "Campione" ;
61
91
  sh:property [
62
92
  sh:path crm:P2_has_type ;
63
- sh:node ex:E55Type05Shape ;
64
- sh:name "Tipo campione" ;
93
+ sh:node this:E55Type05Shape ;
94
+ sh:name "ha tipo" ;
65
95
  sh:maxCount 1 ;
66
96
  ] ;
67
97
  sh:property [
68
98
  sh:path basecpm:Pc43i_uses ;
69
- sh:node ex:CP2ArchitectureWorkShape ;
70
- sh:name "Bene di riferimento" ;
99
+ sh:node this:CP2ArchitectureWorkShape ;
100
+ sh:name "utilizza" ;
71
101
  sh:maxCount 1 ;
72
102
  ] .
73
103
 
74
- ex:CP2ArchitectureWorkShape # BENE DI RIFERIMENTO
104
+ this:CP2ArchitectureWorkShape # BENE DI RIFERIMENTO
75
105
  a sh:NodeShape, rdfs:Class ;
76
106
  sh:targetClass basecpm:CP2_Architecture_Work ;
77
107
  rdfs:label "Bene di riferimento" ;
78
108
  sh:property [
79
109
  sh:path crm:P1_is_identified_by ;
80
- sh:node ex:E41Appellation02Shape ;
81
- sh:name "Denominazione bene" ;
110
+ sh:node this:E41Appellation02Shape ;
111
+ sh:name "รจ identificato da" ;
82
112
  sh:maxCount 1 ;
83
113
  ] .
84
114
 
85
- ex:E42Identifier01Shape #ID INDAGINE
115
+ this:E42Identifier01Shape #ID INDAGINE
86
116
  a sh:NodeShape, rdfs:Class ;
87
117
  sh:targetClass crm:E42_Identifier ;
88
118
  rdfs:label "ID Indagine" ;
89
119
  sh:property [
90
120
  sh:path indagine:id_indagine ;
91
- sh:name "ID indagine" ;
121
+ sh:name "ID" ;
92
122
  sh:datatype xsd:string ;
93
123
  sh:maxCount 1 ;
94
124
  ] .
125
+ # ] ;
126
+ # sh:property this:E42Identifier01Shape_label .
95
127
 
96
- ex:I12AdoptedBeliefShape # QUESITO DIAGNOSTICO
128
+ this:I12AdoptedBeliefShape # QUESITO DIAGNOSTICO
97
129
  a sh:NodeShape, rdfs:Class ;
98
130
  sh:targetClass base:I12_Adopted_Belief ;
99
131
  rdfs:label "Quesito diagnostico" ;
100
132
  sh:property [
101
133
  sh:path crm:P2_has_type ;
102
- sh:node ex:E55Type02Shape ;
103
- sh:name "Tipo quesito diagnostico" ;
134
+ sh:node this:E55Type02Shape ;
135
+ sh:name "ha tipo" ;
104
136
  sh:maxCount 1 ;
105
137
  ] .
106
138
 
107
- ex:E41Appellation01Shape # ENTE RICHIEDENTE
139
+ this:E41Appellation01Shape # ENTE RICHIEDENTE
108
140
  a sh:NodeShape, rdfs:Class ;
109
141
  sh:targetClass crm:E41_Appellation ;
110
142
  rdfs:label "Ente richiedente - Schedatore" ;
111
143
  sh:property [
112
144
  sh:path indagine:ente_richiedente ;
113
145
  sh:datatype xsd:string ;
114
- sh:name "Ente richiedente" ;
146
+ #sh:nodeKind sh:Literal ;
147
+ sh:name "ente richiedente" ;
115
148
  sh:maxCount 1 ;
116
149
  ] ;
117
150
  sh:property [
118
151
  sh:path indagine:schedatore ;
119
152
  sh:datatype xsd:string ;
120
- sh:name "Schedatore" ;
153
+ #sh:nodeKind sh:Literal ;
154
+ sh:name "schedatore" ;
121
155
  sh:maxCount 1 ;
122
156
  ] .
123
157
 
124
- ex:E41Appellation02Shape # DENOMINAZIONE BENE
158
+ this:E41Appellation02Shape # DENOMINAZIONE BENE
125
159
  a sh:NodeShape, rdfs:Class ;
126
160
  sh:targetClass crm:E41_Appellation ;
127
161
  rdfs:label "Denominazione bene" ;
128
162
  sh:property [
129
163
  sh:path indagine:bene_di_riferimento ;
130
164
  sh:datatype xsd:string ;
131
- sh:name "Denominazione bene" ;
165
+ #sh:nodeKind sh:Literal ;
166
+ sh:name "denominazione" ;
132
167
  sh:maxCount 1 ;
133
168
  ] .
134
169
 
135
- ex:E55Type02Shape # TIPO QUESITO DIAGNOSTICO
170
+ this:E55Type02Shape # TIPO QUESITO DIAGNOSTICO
136
171
  a sh:NodeShape, rdfs:Class ;
137
172
  sh:targetClass crm:E55_Type ;
138
173
  rdfs:label "Tipo quesito diagnostico" ;
139
174
  #volipi:iconName "fa-solid fa-car" ;
140
175
  sh:property [
141
176
  sh:path indagine:tipo_quesito_diagnostico ;
142
- #sh:class owl:Class ; # vocabolario QUESITO DIAGNOSTICO (8) id="quesito-diagnostico"
177
+ #sh:class owl:Class ; # vocabolario QUESITO DIAGNOSTICO (8) id="quesito-diagnostico"
178
+ #owl:imports <https://raw.githubusercontent.com/tibonto/DFG-Fachsystematik-Ontology/refs/heads/main/dfgfo.ttl>;
143
179
  #owl:imports <OAC_EXPOSED_PROTOCOL://OAC_EXPOSED_HOST:OAC_EXPOSED_PORT/backend/fuseki/get-vocabolary-terms/quesito-diagnostico> ;
144
- #sh:nodeKind sh:Literal;
145
- sh:datatype xsd:string;
146
- sh:name "Tipo quesito diagnostico" ;
180
+ sh:datatype xsd:string ;
181
+ sh:name "tipo" ;
147
182
  sh:maxCount 1 ;
148
183
  ] .
149
184
 
150
- ex:E55Type03Shape # TIPOLOGIA ATTORI
185
+ this:E55Type03Shape # TIPOLOGIA ATTORI
151
186
  a sh:NodeShape, rdfs:Class ;
152
187
  sh:targetClass crm:E55_Type ;
153
188
  rdfs:label "Tipo attori" ;
154
189
  sh:property [
155
190
  sh:path crm:P1_is_identified_by ;
156
- sh:node ex:E41Appellation01Shape ;
157
- sh:name "Ente richiedente - Schedatore" ;
191
+ sh:node this:E41Appellation01Shape ;
192
+ sh:name "รจ identificato da" ;
158
193
  sh:maxCount 1 ;
159
194
  #] ;
160
195
  #sh:property [
161
196
  # sh:path [sh:inversePath crm:P1i_identifies] ; # usata proprietร  inversa di P1_is_defined_by ;
162
- # sh:node ex:E41Appellation01bShape ;
197
+ # sh:node this:E41Appellation01bShape ;
163
198
  # sh:name "Schedatore" ;
164
199
  # sh:maxCount 1 ;
165
200
  ] .
166
201
 
167
- ex:E55Type05Shape # TIPO CAMPIONE
202
+ this:E55Type05Shape # TIPO CAMPIONE
168
203
  a sh:NodeShape, rdfs:Class ;
169
204
  sh:targetClass crm:E55_Type ;
170
205
  rdfs:label "Tipo campione" ;
171
206
  sh:property [
172
207
  sh:path indagine:tipo_campione ;
173
208
  #sh:class owl:Class ; # vocabolario TIPO CAMPIONE (21) id="tipo-campione
174
- #sh:in ( "Tipo campione A" "Tipo campione B" ) ;
209
+ #owl:imports <https://raw.githubusercontent.com/tibonto/DFG-Fachsystematik-Ontology/refs/heads/main/dfgfo.ttl>;
175
210
  #owl:imports <OAC_EXPOSED_PROTOCOL://OAC_EXPOSED_HOST:OAC_EXPOSED_PORT/backend/fuseki/get-vocabolary-terms/tipo-campione> ;
176
- #sh:nodeKind sh:Literal;
177
- sh:datatype xsd:string;
178
- sh:name "Tipo campione" ;
211
+ sh:datatype xsd:string ;
212
+ sh:name "tipo" ;
179
213
  sh:maxCount 1 ;
180
214
  ] .
@@ -1,5 +1,5 @@
1
1
  @prefix sh: <http://www.w3.org/ns/shacl#> .
2
- @prefix ex: <http://example.org/shapes/> .
2
+ #@prefix ex: <http://example.org/shapes/> .
3
3
  @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
4
4
  @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
5
5
  @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@@ -12,82 +12,83 @@
12
12
  #@prefix volipi: <http://data.sparna.fr/ontologies/volipi#> .
13
13
  #@prefix skos: <http://www.w3.org/2004/02/skos/core> .
14
14
  @prefix indagine: <http://indagine/> .
15
+ @prefix this: <http://data.mydomain.com/sparnatural-page/sparnatural-config/> .
15
16
 
16
17
 
17
- ex:S13Sample01Shape # CAMPIONE
18
+ this:S13Sample01Shape # CAMPIONE
18
19
  a sh:NodeShape, rdfs:Class ;
19
20
  sh:targetClass j.0:S13_Sample ;
20
21
  rdfs:label "Campione" ;
21
22
  sh:property [
22
23
  sh:path crm:P48_has_preferred_identifier ;
23
- sh:node ex:E42Identifier02Shape ;
24
- sh:name "ID campione" ;
24
+ sh:node this:E42Identifier02Shape ;
25
+ sh:name "ha identificativo" ;
25
26
  sh:maxCount 1 ;
26
27
  ] ;
27
28
  sh:property [
28
29
  sh:path crm:P2_has_type ;
29
- sh:node ex:E55Type04Shape ;
30
- sh:name "Tipo campione" ;
30
+ sh:node this:E55Type04Shape ;
31
+ sh:name "ha tipo" ;
31
32
  sh:maxCount 1 ;
32
33
  ] ;
33
34
  sh:property [
34
35
  sh:path j.0:O25_contains ;
35
- sh:node ex:S10MaterialSubstantial01Shape ;
36
- sh:name "Materiale prevalente" ;
36
+ sh:node this:S10MaterialSubstantial01Shape ;
37
+ sh:name "contiene" ;
37
38
  sh:maxCount 1 ;
38
39
  ] ;
39
40
  sh:property [
40
41
  sh:path basecpm:PC43i_uses ;
41
- sh:node ex:CP2ArchitectureWorkShape ;
42
- sh:name "Bene di riferimento" ;
42
+ sh:node this:CP2ArchitectureWorkShape ;
43
+ sh:name "utilizza" ;
43
44
  sh:maxCount 1 ;
44
45
  ] .
45
46
 
46
- ex:S10MaterialSubstantial01Shape # MATERIALE PREVALENTE - CAMPIONE
47
+ this:S10MaterialSubstantial01Shape # MATERIALE PREVALENTE - CAMPIONE
47
48
  a sh:NodeShape, rdfs:Class ;
48
49
  sh:targetClass j.0:S10_Material_Substantial ;
49
50
  rdfs:label "Materiale" ;
50
51
  sh:property [
51
52
  sh:path crm:P2_has_type ;
52
- sh:node ex:E55Type08Shape ;
53
- sh:name "Materiale" ;
53
+ sh:node this:E55Type08Shape ;
54
+ sh:name "ha tipo" ;
54
55
  sh:maxCount 1 ;
55
56
  ] .
56
57
 
57
- ex:CP2ArchitectureWorkShape # BENE DI RIFERIMENTO
58
+ this:CP2ArchitectureWorkShape # BENE DI RIFERIMENTO
58
59
  a sh:NodeShape, rdfs:Class ;
59
60
  sh:targetClass basecpm:CP2_Architecture_Work ;
60
61
  rdfs:label "Bene di riferimento" ;
61
62
  sh:property [
62
63
  sh:path crm:P1_is_identified_by ;
63
- sh:node ex:E41Appellation02Shape ;
64
- sh:name "Denominazione bene" ;
64
+ sh:node this:E41Appellation02Shape ;
65
+ sh:name "รจ identificato da" ;
65
66
  sh:maxCount 1 ;
66
67
  ] .
67
68
 
68
- ex:E42Identifier02Shape # ID CAMPIONE
69
+ this:E42Identifier02Shape # ID CAMPIONE
69
70
  a sh:NodeShape, rdfs:Class ;
70
71
  sh:targetClass crm:E42_Identifier ;
71
72
  rdfs:label "ID campione" ;
72
73
  sh:property [
73
74
  sh:path indagine:id_campione ;
74
- sh:name "ID campione" ;
75
+ sh:name "ID" ;
75
76
  sh:datatype xsd:string ;
76
77
  sh:maxCount 1 ;
77
78
  ] .
78
79
 
79
- ex:E41Appellation02Shape # DENOMINAZIONE BENE
80
+ this:E41Appellation02Shape # DENOMINAZIONE BENE
80
81
  a sh:NodeShape, rdfs:Class ;
81
82
  sh:targetClass crm:E41_Appellation ;
82
83
  rdfs:label "Denominazione bene" ;
83
84
  sh:property [
84
85
  sh:path indagine:bene_di_riferimento ;
85
86
  sh:datatype xsd:string ;
86
- sh:name "Denominazione bene" ;
87
+ sh:name "denominazione" ;
87
88
  sh:maxCount 1 ;
88
89
  ] .
89
90
 
90
- ex:E55Type04Shape # TIPO CAMPIONE
91
+ this:E55Type04Shape # TIPO CAMPIONE
91
92
  a sh:NodeShape, rdfs:Class ;
92
93
  sh:targetClass crm:E55_Type ;
93
94
  rdfs:label "Tipo campione" ;
@@ -95,13 +96,13 @@ ex:E55Type04Shape # TIPO CAMPIONE
95
96
  sh:path indagine:tipo_campione ;
96
97
  #sh:class owl:Class ; # vocabolario TIPO CAMPIONE (21) id="tipo-campione"
97
98
  #owl:imports <OAC_EXPOSED_PROTOCOL://OAC_EXPOSED_HOST:OAC_EXPOSED_PORT/backend/fuseki/get-vocabolary-terms/tipo-campione> ;
98
- #sh:nodeKind sh:Literal;
99
- sh:datatype xsd:string;
100
- sh:name "Tipo campione" ;
99
+ #sh:nodeKind sh:Literal ;
100
+ sh:datatype xsd:string ;
101
+ sh:name "tipo" ;
101
102
  sh:maxCount 1 ;
102
103
  ] .
103
104
 
104
- ex:E55Type08Shape # TIPO MATERIALE (in CAMPIONE, SOTTOCAMPIONE, ELEMENTO COSTRUTTIVO, ...)
105
+ this:E55Type08Shape # TIPO MATERIALE (in CAMPIONE, SOTTOCAMPIONE, ELEMENTO COSTRUTTIVO, ...)
105
106
  a sh:NodeShape, rdfs:Class ;
106
107
  sh:targetClass crm:E55_Type ;
107
108
  rdfs:label "Tipo materiale" ;
@@ -110,8 +111,8 @@ ex:E55Type08Shape # TIPO MATERIALE (in CAMPIONE, SOTTOCAMPIONE, ELEMENTO COSTRUT
110
111
  #sh:class owl:Class ; # vocabolario TIPO MATERIALE (11) id="materiale"
111
112
  #owl:imports <OAC_EXPOSED_PROTOCOL://OAC_EXPOSED_HOST:OAC_EXPOSED_PORT/backend/fuseki/get-vocabolary-terms/materiale> ;
112
113
  #sh:nodeKind sh:Literal;
113
- sh:datatype xsd:string;
114
- sh:name "Tipo materiale" ;
114
+ sh:datatype xsd:string ;
115
+ sh:name "tipo" ;
115
116
  sh:maxCount 1 ;
116
117
  ] .
117
118