9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncioclass Ontology
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio module Symbols
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio extend ActiveSupport::Concern
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio module Methods
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio def update_or_create_from_hash(hash, timestamp = Time.now)
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio raise ArgumentError, 'No hash given.' unless hash.is_a? Hash
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio e = where(text: hash['text']).first_or_initialize
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio e.ontology = @association.owner
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio e.range = hash['range']
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio e.updated_at = timestamp
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio unless hash['name'] || hash['kind']
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio Rails.logger.warn(
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio "Using work-around to determine symbol name and kind: #{e.inspect}")
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio if e2 = Symbol.where(text: hash['text']).first
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio e.name = e2.name
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio e.kind = e2.kind
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio else
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio e.name = e.text
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio e.kind = 'Undefined'
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio end
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio else
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio e.name = hash['name']
21909d3b620d97e81dd946b959a47efe88d2b7d8Fabiano Fidêncio e.kind = hash['kind']
21909d3b620d97e81dd946b959a47efe88d2b7d8Fabiano Fidêncio end
21909d3b620d97e81dd946b959a47efe88d2b7d8Fabiano Fidêncio
21909d3b620d97e81dd946b959a47efe88d2b7d8Fabiano Fidêncio e.iri = hash['iri']
21909d3b620d97e81dd946b959a47efe88d2b7d8Fabiano Fidêncio e.label = hash['label']
21909d3b620d97e81dd946b959a47efe88d2b7d8Fabiano Fidêncio
21909d3b620d97e81dd946b959a47efe88d2b7d8Fabiano Fidêncio if e.range.to_s.include?(':')
21909d3b620d97e81dd946b959a47efe88d2b7d8Fabiano Fidêncio # remove path from range
21909d3b620d97e81dd946b959a47efe88d2b7d8Fabiano Fidêncio # Examples/Reichel:28.9 -> 28.9
21909d3b620d97e81dd946b959a47efe88d2b7d8Fabiano Fidêncio e.range = e.range.split(':', 2).last
21909d3b620d97e81dd946b959a47efe88d2b7d8Fabiano Fidêncio end
21909d3b620d97e81dd946b959a47efe88d2b7d8Fabiano Fidêncio
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio e.ontology.symbols << e if e.id.nil?
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio e.save!
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio e
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio end
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio end
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio def delete_edges
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio %i[parent_id child_id].each do |key|
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio EEdge.where(key => symbols.where(kind: 'Class')).delete_all
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio end
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio end
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio def create_symbol_tree
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio raise StandardError.new('Ontology is not OWL') unless owl?
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio # Delete previous set of categories
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio delete_edges
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio subclasses =
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio sentences.where("text LIKE '%SubClassOf%'").select do |sentence|
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio sentence.text.split(' ').size == 4
e17e37cd0e2109e7f1bd4ae48edfc8cca85b3f93Fabiano Fidêncio end
9a18f78f38e274f4906af6ef8e1a82d844fde4ccFabiano Fidêncio transaction requires_new: true do
subclasses.each do |s|
c1, c2 = s.hierarchical_class_names
unless c1 == 'Thing' || c2 == 'Thing'
child_id = symbols.where('name = ? OR iri = ?', c1, c1).first.id
parent_id = symbols.where('name = ? OR iri = ?', c2, c2).first.id
EEdge.create! child_id: child_id, parent_id: parent_id
if EEdge.where(child_id: child_id, parent_id: parent_id).first.nil?
raise StandardError.new('Circle detected')
end
end
end
end
end
end
end