solis 0.71.0 → 0.73.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 16ed244eaf62cd747c1e2c2ea369066dcd6a03e529d3932916b4f7791a29b956
4
- data.tar.gz: ef2a72fd541967ccf54ae75ca4f18abb21727cf9398c4da38b9aff3a8b9b5ca7
3
+ metadata.gz: a91e5038f9e0a152b51ad35d25c6bdd99ef383bfb0da8fb7baf1d08baddbf49a
4
+ data.tar.gz: b4b1a434aae6a337358815e8b0dc5ff37edea7e0ffb56d85a9d7d1590677ea92
5
5
  SHA512:
6
- metadata.gz: b955562d76f6ca7942d634098b430c4e19c21c64323c8c676fcacbc494949b9d38aaf6d271c197fd3e8ed49bf200534c1ab473fd56aa883d3bbeda9136482427
7
- data.tar.gz: f80157b099693522c7afa1a0ce607d174ab164a76ad94a69f359a8331588a858710b3a98ee2360cc6d10ef8e7c1299383eb7a129eac7c94773295bc95604fae1
6
+ metadata.gz: 35f713d36e731ac83203fec6f3d82bd6ad5f321c68ccf1424fd8f0c6b82183392e2c76d62cdd7eac6542318810c62940d9a4e1badb5dd817177509bf65753c9e
7
+ data.tar.gz: 5a9efc223d46e01936aed52e649e856344c7847307f6a39d7b094b48d2b553542a8059ce846bd483634cfb7046f9ab9646ed2130bab81de5c196b43af48b95c2
data/lib/solis/model.rb CHANGED
@@ -71,9 +71,9 @@ module Solis
71
71
  def query
72
72
  raise "I need a SPARQL endpoint" if self.class.sparql_endpoint.nil?
73
73
 
74
- #before_read_proc&.call(self)
74
+ # before_read_proc&.call(self)
75
75
  result = Solis::Query.new(self)
76
- #after_read_proc&.call(result)
76
+ # after_read_proc&.call(result)
77
77
  result
78
78
  end
79
79
 
@@ -108,30 +108,49 @@ module Solis
108
108
 
109
109
  def destroy
110
110
  raise "I need a SPARQL endpoint" if self.class.sparql_endpoint.nil?
111
- before_delete_proc&.call(self)
112
-
113
111
  sparql = SPARQL::Client.new(self.class.sparql_endpoint)
114
- graph = as_graph(klass = self, resolve_all = false)
115
- Solis::LOGGER.info graph.dump(:ttl) if ConfigFile[:debug]
116
112
 
117
- result = sparql.delete_data(graph, graph: graph.name)
113
+ raise Solis::Error::QueryError, "#{self.id} is still referenced, refusing to delete" if is_referenced?(sparql)
114
+ # sparql.query('delete{}')
115
+ before_delete_proc&.call(self)
116
+ # graph = as_graph(self, false)
117
+ # Solis::LOGGER.info graph.dump(:ttl) if ConfigFile[:debug]
118
+
119
+ query = %(
120
+ with <#{self.class.graph_name}>
121
+ delete {?s ?p ?o}
122
+ where {
123
+ values ?s {<#{self.graph_id}>}
124
+ ?s ?p ?o }
125
+ )
126
+ result = sparql.query(query)
127
+
128
+ # result = sparql.delete_data(graph, graph: graph.name)
118
129
  after_delete_proc&.call(result)
119
130
  result
120
131
  end
121
132
 
122
133
  def save(validate_dependencies = true)
123
134
  raise "I need a SPARQL endpoint" if self.class.sparql_endpoint.nil?
135
+ sparql = SPARQL::Client.new(self.class.sparql_endpoint)
124
136
 
125
137
  before_create_proc&.call(self)
126
- sparql = SPARQL::Client.new(self.class.sparql_endpoint)
127
- graph = as_graph(self, validate_dependencies)
128
138
 
129
- # File.open('/Users/mehmetc/Dropbox/AllSources/LP/graphiti-api/save.ttl', 'wb') do |file|
130
- # file.puts graph.dump(:ttl)
131
- # end
132
- Solis::LOGGER.info SPARQL::Client::Update::InsertData.new(graph, graph: graph.name).to_s if ConfigFile[:debug]
139
+ if self.exists?(sparql)
140
+ data = properties_to_hash(self)
141
+
142
+ result = update(data)
143
+ else
144
+ graph = as_graph(self, validate_dependencies)
145
+
146
+ # File.open('/Users/mehmetc/Dropbox/AllSources/LP/graphiti-api/save.ttl', 'wb') do |file|
147
+ # file.puts graph.dump(:ttl)
148
+ # end
149
+ Solis::LOGGER.info SPARQL::Client::Update::InsertData.new(graph, graph: graph.name).to_s if ConfigFile[:debug]
150
+
151
+ result = sparql.insert_data(graph, graph: graph.name)
152
+ end
133
153
 
134
- result = sparql.insert_data(graph, graph: graph.name)
135
154
  after_create_proc&.call(result)
136
155
  result
137
156
  rescue StandardError => e
@@ -144,7 +163,7 @@ module Solis
144
163
  raise Solis::Error::GeneralError, "I need a SPARQL endpoint" if self.class.sparql_endpoint.nil?
145
164
 
146
165
  attributes = data.include?('attributes') ? data['attributes'] : data
147
- raise "id is mandatory in attributes" unless attributes.keys.include?('id')
166
+ raise "id is mandatory when updating" unless attributes.keys.include?('id')
148
167
 
149
168
  id = attributes.delete('id')
150
169
 
@@ -155,48 +174,139 @@ module Solis
155
174
  updated_klass = original_klass.deep_dup
156
175
 
157
176
  attributes.each_pair do |key, value|
158
- updated_klass.send(:"#{key}=", value)
177
+ if value.is_a?(Hash)
178
+ embedded = self.class.graph.shape_as_model(original_klass.class.metadata[:attributes][key][:datatype].to_s).new(value)
179
+ if embedded.exists?(sparql)
180
+ embedded_data = properties_to_hash(embedded)
181
+ embedded.update(embedded_data)
182
+ else
183
+ embedded.save
184
+ end
185
+ end
186
+
187
+ updated_klass.instance_variable_set("@#{key}", value)
159
188
  end
160
189
 
190
+ # attributes.each_pair do |key, value|
191
+ # updated_klass.instance_variable_set("@#{key}", value)
192
+ # end
193
+ # properties_original_klass=Model.properties_to_hash(original_klass)
194
+ # properties_updated_klass = Model.properties_to_hash(updated_klass)
195
+ # changes = Hashdiff.diff(properties_original_klass, properties_updated_klass)
196
+ # pp changes
197
+ #
198
+ # #a=self.class.graph.shape_as_model('Identificatienummer').new
199
+ # changes.each do |change|
200
+ # change_type = change[0]
201
+ # original_change_entity = change[1]
202
+ # change_entity = original_change_entity.split('.').last
203
+ # change[1] = change_object
204
+ # data = change[2]
205
+ #
206
+ # case change_type
207
+ # when '+' # new
208
+ # new_entity_hash = {} #self.class.graph.shape_as_model(change_object.classify).new
209
+ # Hashdiff.patch!(new_entity_hash, [change])
210
+ #
211
+ # new_entity = self.class.graph.shape_as_model(change_entity.classify).new(new_entity_hash[change_entity])
212
+ # new_entity.save
213
+ # when '-' # delete
214
+ # when '~' # change
215
+ # else
216
+ # raise RuntimeError, "Unknown change type(#{change_type}) for #{change[1]}"
217
+ # end
218
+ #
219
+ # end
220
+
221
+ # attributes.each_pair do |key, value|
222
+ # updated_klass.instance_variable_set("@#{key}", value)
223
+ # unless original_klass.class.metadata[:attributes][key][:node_kind].nil?
224
+ # inner_model = self.class.graph.shape_as_model(original_klass.class.metadata[:attributes][key][:datatype].to_s)
225
+ # if value.is_a?(Hash)
226
+ # value.each_pair do |inner_key, inner_value|
227
+ # next unless inner_model.metadata[:attributes][inner_key][:node_kind].is_a?(RDF::URI)
228
+ # inner_inner_model = self.class.graph.shape_as_model(inner_model.metadata[:attributes][inner_key][:datatype].to_s)
229
+ # # if inner_inner_model.class.ancestors.include?(Codetabel) && inner_value.key?('id')
230
+ # # inner_data = inner_inner_model.query.filter({ language: nil, filters: { id: [inner_value['id']] } }).find_all.map { |m| m }&.first
231
+ # # else
232
+ # inner_value = inner_value.first if inner_value.is_a?(Array)
233
+ # inner_data = inner_inner_model.new(inner_value)
234
+ # inner_data.save
235
+ # # end
236
+ # end
237
+ # elsif value.is_a?(Array)
238
+ # data = value.map do |m|
239
+ # if m.is_a?(Hash)
240
+ # m.each do |inner_key, inner_value|
241
+ # #next if inner_model.metadata[:attributes][inner_key][:class].nil?
242
+ # next unless inner_model.metadata[:attributes][inner_key][:node_kind].is_a?(RDF::URI)
243
+ # inner_inner_model = self.class.graph.shape_as_model(inner_model.class.metadata[:attributes][inner_key][:datatype].to_s)
244
+ # # if inner_inner_model.class.ancestors.include?(Codetabel) && inner_value.key?('id')
245
+ # # inner_data = inner_inner_model.query.filter({ language: nil, filters: { id: [inner_value['id']] } }).find_all.map { |m| m }&.first
246
+ # # else
247
+ # inner_value = inner_value.first if inner_value.is_a?(Array)
248
+ # inner_data = inner_inner_model.new(inner_value)
249
+ # inner_data.save
250
+ # # end
251
+ #
252
+ # inner_data
253
+ # end
254
+ # else
255
+ # m
256
+ # end
257
+ # end
258
+ # elsif value.is_a?(Object)
259
+ # value.save
260
+ # end
261
+ # end
262
+ # end
263
+
161
264
  before_update_proc&.call(original_klass, updated_klass)
162
265
 
163
- delete_graph = as_graph(original_klass, false)
164
- # where_graph = RDF::Graph.new
165
- # where_graph.name = RDF::URI(self.class.graph_name)
266
+ properties_orignal_klass = properties_to_hash(original_klass)
267
+ properties_updated_klsss = properties_to_hash(updated_klass)
268
+
269
+ if Hashdiff.best_diff(properties_orignal_klass, properties_updated_klsss).empty?
270
+ Solis::LOGGER.info("#{original_klass.class.name} unchanged, skipping")
271
+ data = self.query.filter({ filters: { id: [id] } }).find_all.map { |m| m }&.first
272
+ else
273
+
274
+ delete_graph = as_graph(original_klass, false)
166
275
 
167
- where_graph = RDF::Graph.new(graph_name: RDF::URI("#{self.class.graph_name}#{self.name.tableize}/#{id}"), data: RDF::Repository.new)
276
+ where_graph = RDF::Graph.new(graph_name: RDF::URI("#{self.class.graph_name}#{self.name.tableize}/#{id}"), data: RDF::Repository.new)
168
277
 
169
- if id.is_a?(Array)
170
- id.each do |i|
171
- where_graph << [RDF::URI("#{self.class.graph_name}#{self.name.tableize}/#{i}"), :p, :o]
278
+ if id.is_a?(Array)
279
+ id.each do |i|
280
+ where_graph << [RDF::URI("#{self.class.graph_name}#{self.name.tableize}/#{i}"), :p, :o]
281
+ end
282
+ else
283
+ where_graph << [RDF::URI("#{self.class.graph_name}#{self.name.tableize}/#{id}"), :p, :o]
172
284
  end
173
- else
174
- where_graph << [RDF::URI("#{self.class.graph_name}#{self.name.tableize}/#{id}"), :p, :o]
175
- end
176
285
 
177
- insert_graph = as_graph(updated_klass, true)
286
+ insert_graph = as_graph(updated_klass, true)
178
287
 
179
- #Solis::LOGGER.info delete_graph.dump(:ttl) if ConfigFile[:debug]
180
- #Solis::LOGGER.info insert_graph.dump(:ttl) if ConfigFile[:debug]
181
- #Solis::LOGGER.info where_graph.dump(:ttl) if ConfigFile[:debug]
288
+ # puts delete_graph.dump(:ttl) #if ConfigFile[:debug]
289
+ # puts insert_graph.dump(:ttl) #if ConfigFile[:debug]
290
+ # puts where_graph.dump(:ttl) #if ConfigFile[:debug]
182
291
 
183
- #if ConfigFile[:debug]
184
- delete_insert_query = SPARQL::Client::Update::DeleteInsert.new(delete_graph, insert_graph, where_graph, graph: insert_graph.name).to_s
185
- delete_insert_query.gsub!('_:p', '?p')
186
- Solis::LOGGER.info delete_insert_query
187
- data = sparql.query(delete_insert_query)
188
- pp data
189
- #end
292
+ # if ConfigFile[:debug]
293
+ delete_insert_query = SPARQL::Client::Update::DeleteInsert.new(delete_graph, insert_graph, where_graph, graph: insert_graph.name).to_s
294
+ delete_insert_query.gsub!('_:p', '?p')
295
+ # puts delete_insert_query
296
+ data = sparql.query(delete_insert_query)
297
+ # pp data
298
+ # end
190
299
 
191
- # sparql.delete_insert(delete_graph, insert_graph, where_graph, graph: insert_graph.name)
300
+ # sparql.delete_insert(delete_graph, insert_graph, where_graph, graph: insert_graph.name)
192
301
 
193
- data = self.query.filter({ filters: { id: [id] } }).find_all.map { |m| m }&.first
194
- if data.nil?
195
- sparql.insert_data(insert_graph, graph: insert_graph.name)
196
302
  data = self.query.filter({ filters: { id: [id] } }).find_all.map { |m| m }&.first
303
+ if data.nil?
304
+ sparql.insert_data(insert_graph, graph: insert_graph.name)
305
+ data = self.query.filter({ filters: { id: [id] } }).find_all.map { |m| m }&.first
306
+ end
197
307
  end
198
-
199
308
  after_update_proc&.call(updated_klass, data)
309
+
200
310
  data
201
311
  rescue StandardError => e
202
312
  original_graph = as_graph(original_klass, false)
@@ -207,10 +317,23 @@ module Solis
207
317
  raise e
208
318
  end
209
319
 
320
+ def graph_id
321
+ "#{self.class.graph_name}#{self.name.tableize}/#{self.id}"
322
+ end
323
+
324
+ def is_referenced?(sparql)
325
+ sparql.query("ASK WHERE { ?s ?p <#{self.graph_id}>. filter (!contains(str(?p), '_audit'))}")
326
+ end
327
+
328
+ def exists?(sparql)
329
+ sparql.query("ASK WHERE { <#{self.graph_id}> ?p ?o }")
330
+ end
331
+
210
332
  def self.make_id_for(model)
211
333
  id = model.instance_variable_get("@id")
212
334
  if id.nil? || (id.is_a?(String) && id&.empty?)
213
- model.instance_variable_set("@id", SecureRandom.uuid)
335
+ id = SecureRandom.uuid
336
+ model.instance_variable_set("@id", id)
214
337
  end
215
338
  model
216
339
  end
@@ -356,7 +479,7 @@ module Solis
356
479
 
357
480
  graph << [id, RDF::RDFV.type, klass_metadata[:target_class]]
358
481
 
359
- #load existing object and overwrite
482
+ # load existing object and overwrite
360
483
  original_klass = klass.query.filter({ filters: { id: [uuid] } }).find_all { |f| f.id == uuid }.first || nil
361
484
 
362
485
  if original_klass.nil?
@@ -381,11 +504,9 @@ module Solis
381
504
  def make_graph(graph, hierarchy, id, klass, klass_metadata, resolve_all)
382
505
  klass_metadata[:attributes].each do |attribute, metadata|
383
506
  data = klass.instance_variable_get("@#{attribute}")
384
-
385
- raise Solis::Error::InvalidAttributeError,
386
- "#{hierarchy.join('.')}.#{attribute} min=#{metadata[:mincount]} and max=#{metadata[:maxcount]}" if data.nil? &&
387
- metadata[:mincount] > 0 &&
388
- graph.query(RDF::Query.new({ attribute.to_sym => { RDF.type => metadata[:node] } })).size == 0
507
+ if data.nil? && metadata[:mincount] > 0 && graph.query(RDF::Query.new({ attribute.to_sym => { RDF.type => metadata[:node] } })).size == 0
508
+ raise Solis::Error::InvalidAttributeError, "#{hierarchy.join('.')}.#{attribute} min=#{metadata[:mincount]} and max=#{metadata[:maxcount]}"
509
+ end
389
510
 
390
511
  # skip if nil or an object that is empty
391
512
  next if data.nil? || ([Hash, Array, String].include?(data.class) && data&.empty?)
@@ -397,7 +518,7 @@ module Solis
397
518
  data = data.to_json
398
519
  end
399
520
 
400
- #make it an object
521
+ # make it an object
401
522
  unless metadata[:node_kind].nil?
402
523
  model = self.class.graph.shape_as_model(metadata[:datatype].to_s)
403
524
  if data.is_a?(Hash)
@@ -410,7 +531,7 @@ module Solis
410
531
  data = [data] unless data.is_a?(Array)
411
532
 
412
533
  data.each do |d|
413
- if defined?(d.name) && self.class.graph.shape?(d.name)
534
+ if defined?(d.name) && self.class.graph.shape?(d.name) && resolve_all
414
535
  if self.class.graph.shape_as_model(d.name.to_s).metadata[:attributes].select { |_, v| v[:node_kind].is_a?(RDF::URI) }.size > 0 &&
415
536
  hierarchy.select { |s| s =~ /^#{d.name.to_s}/ }.size == 0
416
537
  internal_resolve = false
@@ -419,9 +540,11 @@ module Solis
419
540
  internal_resolve = false
420
541
  d = build_ttl_objekt2(graph, d, hierarchy, internal_resolve)
421
542
  else
422
- #d = "#{klass.class.graph_name}#{attribute.tableize}/#{d.id}"
543
+ # d = "#{klass.class.graph_name}#{attribute.tableize}/#{d.id}"
423
544
  d = "#{klass.class.graph_name}#{d.name.tableize}/#{d.id}"
424
545
  end
546
+ elsif defined?(d.name) && self.class.graph.shape?(d.name)
547
+ d = "#{klass.class.graph_name}#{d.name.tableize}/#{d.id}"
425
548
  end
426
549
 
427
550
  if d.is_a?(Array) && d.length == 1
@@ -522,7 +645,7 @@ module Solis
522
645
  end
523
646
 
524
647
  if model && d.is_a?(Hash)
525
- #TODO: figure out in what use case we need the parent_model
648
+ # TODO: figure out in what use case we need the parent_model
526
649
  # model_instance = if parent_model
527
650
  # parent_model.new(d)
528
651
  # else
@@ -573,5 +696,21 @@ module Solis
573
696
  hierarchy.pop
574
697
  id
575
698
  end
699
+
700
+ def properties_to_hash(model)
701
+ n = {}
702
+ model.class.metadata[:attributes].each_key do |m|
703
+ if model.instance_variable_get("@#{m}").is_a?(Array)
704
+ n[m] = model.instance_variable_get("@#{m}").map { |iv| iv.class.ancestors.include?(Solis::Model) ? properties_to_hash(iv) : iv }
705
+ elsif model.instance_variable_get("@#{m}").class.ancestors.include?(Solis::Model)
706
+ n[m] = properties_to_hash(model.instance_variable_get("@#{m}"))
707
+ else
708
+ n[m] = model.instance_variable_get("@#{m}")
709
+ end
710
+ end
711
+
712
+ n.compact!
713
+ n
714
+ end
576
715
  end
577
716
  end
@@ -101,8 +101,13 @@ module Solis
101
101
  value[:value].each do |v|
102
102
  if metadata[:datatype_rdf].eql?('http://www.w3.org/1999/02/22-rdf-syntax-ns#langString')
103
103
  filter = "?concept <#{metadata[:path]}> ?__search#{i} "
104
- filter += "FILTER(langMatches( lang(?__search#{i}), \"#{v[:"@language"]}\" )). "
105
- search_for = v[:"@value"].is_a?(Array) ? v[:"@value"].first : v[:"@value"]
104
+ if v.is_a?(Hash)
105
+ filter += "FILTER(langMatches( lang(?__search#{i}), \"#{v[:"@language"]}\" )). "
106
+ search_for = v[:"@value"].is_a?(Array) ? v[:"@value"].first : v[:"@value"]
107
+ else
108
+ search_for = v
109
+ end
110
+
106
111
  search_for = normalize_string(search_for)
107
112
  filter += "FILTER(str(?__search#{i}) #{not_operator}#{value[:operator]} \"#{search_for}\"#{datatype}) .\n"
108
113
  else
data/lib/solis/query.rb CHANGED
@@ -43,8 +43,8 @@ module Solis
43
43
  end
44
44
  ids = ids.join(" ")
45
45
 
46
-
47
- q = query.gsub(/{ ?{ ?VALUES ?} ?}/, "VALUES ?#{id_name} { #{ids} }")
46
+ language = Graphiti.context[:object]&.language || Solis::Options.instance.get[:language] || 'en'
47
+ q = query.gsub(/{ ?{ ?VALUES ?} ?}/, "VALUES ?#{id_name} { #{ids} }").gsub(/{ ?{ ?LANGUAGE ?} ?}/, "bind(\"#{language}\" as ?filter_language).")
48
48
 
49
49
  result = Solis::Query.run(entity, q)
50
50
  end
@@ -156,7 +156,7 @@ module Solis
156
156
  datatype: p['datatype'],
157
157
  path: "#{graph_prefix}:#{property_name.to_s.classify}",
158
158
  cardinality: { min: min_max['min'], max: min_max['max'] },
159
- same_as: p['sameAs'],
159
+ same_as: p['sameas'],
160
160
  description: p['description']
161
161
  }
162
162
 
@@ -337,50 +337,50 @@ hide empty members
337
337
  datas.first[:ontologies][:all].each { |k, v| all_prefixes[k] = v[:uri] }
338
338
 
339
339
  datas.each do |data|
340
- data[:entities].each do |entity_name, metadata|
341
- classes[entity_name] = {
342
- comment: metadata[:description],
343
- label: entity_name.to_s,
344
- type: 'owl:Class',
345
- subClassOf: metadata[:sub_class_of]
346
- }
347
-
348
- metadata[:properties].each do |property, property_metadata|
349
- attribute = property.to_s.strip
350
- description = property_metadata[:description]
351
- path = "#{graph_name}#{attribute}"
352
- datatype = property_metadata[:datatype]
353
-
354
- schema_data = datatype_properties[attribute] || {}
355
- domain = schema_data[:domain] || []
356
- domain << "#{graph_name}#{entity_name}"
357
- datatype_properties[attribute] = {
358
- domain: domain,
359
- comment: description,
360
- label: attribute.to_s,
361
- range: datatype,
362
- type: 'rdf:Property'
340
+ data[:entities].each do |entity_name, metadata|
341
+ classes[entity_name] = {
342
+ comment: metadata[:description],
343
+ label: entity_name.to_s,
344
+ type: 'owl:Class',
345
+ subClassOf: metadata[:sub_class_of]
363
346
  }
364
- unless property_metadata[:same_as].nil? || property_metadata[:same_as].empty?
365
- datatype_properties[attribute]['owl:sameAs'] =
366
- property_metadata[:same_as]
367
- end
368
347
 
369
- subclass_data = data[:entities][entity_name][:sub_class_of] || []
370
- unless property_metadata[:cardinality][:min].empty?
371
- subclass_data << RDF::Vocabulary.term(type: 'owl:Restriction',
372
- onProperty: path,
373
- minCardinality: property_metadata[:cardinality][:min])
374
- end
375
- unless property_metadata[:cardinality][:max].empty?
376
- subclass_data << RDF::Vocabulary.term(type: 'owl:Restriction',
377
- onProperty: path,
378
- maxCardinality: property_metadata[:cardinality][:max])
348
+ metadata[:properties].each do |property, property_metadata|
349
+ attribute = property.to_s.strip
350
+ description = property_metadata[:description]
351
+ path = "#{graph_name}#{attribute}"
352
+ datatype = property_metadata[:datatype]
353
+
354
+ schema_data = datatype_properties[attribute] || {}
355
+ domain = schema_data[:domain] || []
356
+ domain << "#{graph_name}#{entity_name}"
357
+ datatype_properties[attribute] = {
358
+ domain: domain,
359
+ comment: description,
360
+ label: attribute.to_s,
361
+ range: datatype,
362
+ type: 'rdf:Property'
363
+ }
364
+ unless property_metadata[:same_as].nil? || property_metadata[:same_as].empty?
365
+ datatype_properties[attribute]['owl:sameAs'] =
366
+ property_metadata[:same_as]
367
+ end
368
+
369
+ subclass_data = data[:entities][entity_name][:sub_class_of] || []
370
+ unless property_metadata[:cardinality][:min].empty?
371
+ subclass_data << RDF::Vocabulary.term(type: 'owl:Restriction',
372
+ onProperty: path,
373
+ minCardinality: property_metadata[:cardinality][:min])
374
+ end
375
+ unless property_metadata[:cardinality][:max].empty?
376
+ subclass_data << RDF::Vocabulary.term(type: 'owl:Restriction',
377
+ onProperty: path,
378
+ maxCardinality: property_metadata[:cardinality][:max])
379
+ end
380
+ data[:entities][entity_name][:sub_class_of] = subclass_data
379
381
  end
380
- data[:entities][entity_name][:sub_class_of] = subclass_data
381
382
  end
382
383
  end
383
- end
384
384
 
385
385
  lp = RDF::StrictVocabulary(graph_name)
386
386
  o = ::Class.new(lp) do
data/lib/solis/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Solis
2
- VERSION = "0.71.0"
2
+ VERSION = "0.73.0"
3
3
  end
data/solis.gemspec CHANGED
@@ -40,6 +40,7 @@ Gem::Specification.new do |spec|
40
40
  spec.add_runtime_dependency 'uuidtools', '~> 2.2.0'
41
41
  spec.add_runtime_dependency 'dry-struct', '~> 1.6'
42
42
  spec.add_runtime_dependency 'psych', '~> 5.1'
43
+ #spec.add_runtime_dependency 'hashdiff', '~> 1.1'
43
44
 
44
45
  spec.add_development_dependency 'rake', '~> 13.0'
45
46
  spec.add_development_dependency 'minitest', '~> 5.19'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solis
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.71.0
4
+ version: 0.73.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mehmet Celik
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-09-22 00:00:00.000000000 Z
11
+ date: 2024-03-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -295,7 +295,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
295
295
  - !ruby/object:Gem::Version
296
296
  version: '0'
297
297
  requirements: []
298
- rubygems_version: 3.4.19
298
+ rubygems_version: 3.5.6
299
299
  signing_key:
300
300
  specification_version: 4
301
301
  summary: Turn any SHACL file into an API, ORM, documentation, ...