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