null
ontology.rb revision 28042dd9ac50a328466a3dd0464b6e26a7c8796d
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
c00c7161dbec6be950ca3596969d0a3019bb281bTimo Sirainenclass Ontology < ActiveRecord::Base
c00c7161dbec6be950ca3596969d0a3019bb281bTimo Sirainen
c00c7161dbec6be950ca3596969d0a3019bb281bTimo Sirainen # Ontohub Library Includes
8e7ea029100177d5f4077d4062f18998ca5a1e27Timo Sirainen include Commentable
8e7ea029100177d5f4077d4062f18998ca5a1e27Timo Sirainen include Metadatable
8e7ea029100177d5f4077d4062f18998ca5a1e27Timo Sirainen
8e7ea029100177d5f4077d4062f18998ca5a1e27Timo Sirainen # Ontology Model Includes
8e7ea029100177d5f4077d4062f18998ca5a1e27Timo Sirainen include Ontology::Import
8e7ea029100177d5f4077d4062f18998ca5a1e27Timo Sirainen include Ontology::Scopes
8e7ea029100177d5f4077d4062f18998ca5a1e27Timo Sirainen include Ontology::States
8e7ea029100177d5f4077d4062f18998ca5a1e27Timo Sirainen include Ontology::Versions
8e7ea029100177d5f4077d4062f18998ca5a1e27Timo Sirainen include Ontology::Symbols
8e7ea029100177d5f4077d4062f18998ca5a1e27Timo Sirainen include Ontology::Sentences
8e7ea029100177d5f4077d4062f18998ca5a1e27Timo Sirainen include Ontology::Mappings
8e7ea029100177d5f4077d4062f18998ca5a1e27Timo Sirainen include Ontology::Distributed
8e7ea029100177d5f4077d4062f18998ca5a1e27Timo Sirainen include Ontology::Categories
8e7ea029100177d5f4077d4062f18998ca5a1e27Timo Sirainen include Ontology::Oops
8e7ea029100177d5f4077d4062f18998ca5a1e27Timo Sirainen include Ontology::Projects
574d36db88f15662529fb65da6fc8c5e4c8f12faTimo Sirainen include Ontology::Tools
574d36db88f15662529fb65da6fc8c5e4c8f12faTimo Sirainen include Ontology::Tasks
574d36db88f15662529fb65da6fc8c5e4c8f12faTimo Sirainen include Ontology::LicenseModels
c00c7161dbec6be950ca3596969d0a3019bb281bTimo Sirainen include Ontology::FileExtensions
c3c423426093ffc01fa9967573a9b9e39f42c461Timo Sirainen include Ontology::Searching
c3c423426093ffc01fa9967573a9b9e39f42c461Timo Sirainen include Ontology::OwlClasses
8e7ea029100177d5f4077d4062f18998ca5a1e27Timo Sirainen include IRIUrlBuilder::Includeable
8e7ea029100177d5f4077d4062f18998ca5a1e27Timo Sirainen include GraphStructures::SpecificFetchers::Mappings
8e7ea029100177d5f4077d4062f18998ca5a1e27Timo Sirainen
8e7ea029100177d5f4077d4062f18998ca5a1e27Timo Sirainen # Multiple Class Features
8e7ea029100177d5f4077d4062f18998ca5a1e27Timo Sirainen include Aggregatable
8e7ea029100177d5f4077d4062f18998ca5a1e27Timo Sirainen
8e7ea029100177d5f4077d4062f18998ca5a1e27Timo Sirainen class Ontology::DeleteError < StandardError; end
8e7ea029100177d5f4077d4062f18998ca5a1e27Timo Sirainen
8e7ea029100177d5f4077d4062f18998ca5a1e27Timo Sirainen belongs_to :language
8e7ea029100177d5f4077d4062f18998ca5a1e27Timo Sirainen belongs_to :logic, counter_cache: true
8e7ea029100177d5f4077d4062f18998ca5a1e27Timo Sirainen belongs_to :ontology_type
c00c7161dbec6be950ca3596969d0a3019bb281bTimo Sirainen belongs_to :repository
c00c7161dbec6be950ca3596969d0a3019bb281bTimo Sirainen belongs_to :formality_level
has_many :symbol_groups
has_many :alternative_iris, dependent: :destroy
has_many :source_mappings,
class_name: 'Mapping', foreign_key: 'source_id', dependent: :destroy
has_many :target_mappings,
class_name: 'Mapping', foreign_key: 'target_id', dependent: :destroy
has_and_belongs_to_many :license_models
attr_accessible :iri, :locid
attr_accessible :name, :description, :acronym, :documentation,
:logic_id,
:category_ids,
:acronym,
:file_extension,
:projects,
:present,
:alternative_iris,
:ontology_type_id,
:license_model_ids,
:formality_level_id,
:task_ids,
:project_ids
validates_uniqueness_of :iri, :if => :iri_changed?
validates_format_of :iri, :with => URI::regexp(Settings.allowed_iri_schemes)
validates :documentation,
allow_blank: true,
format: { with: URI::regexp(Settings.allowed_iri_schemes) }
validates_presence_of :basepath
delegate :permission?, to: :repository
strip_attributes :only => [:name, :iri]
scope :list, includes(:logic).
order('ontologies.state asc, ontologies.symbols_count desc')
scope :with_path, ->(path) do
condition = <<-CONDITION
("ontology_versions"."file_extension" = :extname)
OR (("ontology_versions"."file_extension" IS NULL)
AND ("ontologies"."file_extension" = :extname))
CONDITION
with_basepath(File.basepath(path)).
where(condition, extname: File.extname(path)).
readonly(false)
end
scope :with_basepath, ->(path) do
join = <<-JOIN
LEFT JOIN "ontology_versions"
ON "ontologies"."ontology_version_id" = "ontology_versions"."id"
JOIN
condition = <<-CONDITION
("ontology_versions"."basepath" = :path)
OR (("ontology_versions"."basepath" IS NULL)
AND ("ontologies"."basepath" = :path))
CONDITION
joins(join).where(condition, path: path).readonly(false)
end
scope :parents_first,
order('(CASE WHEN ontologies.parent_id IS NULL THEN 1 ELSE 0 END) DESC,'\
' ontologies.parent_id asc')
def generate_name(name)
match = name.match(%r{
\A
.+?
:// # A uri has a separation between schema and hierarchy
.+
(?:/|\#)
(?<filename>[^/]+) # Match filename after a slash/hash
\z
}x)
if match
filename = match[:filename].sub(/\.[\w\d]+\z/, '')
capitalized_name = filename.split(/[_ ]/).map(&:capitalize).join(' ')
else
name
end
end
def iri_for_child(child_name)
child_name = child_name[1..-2] if child_name[0] == '<'
child_name.include?("://") ? child_name : "#{iri}?#{child_name}"
end
def locid_for_child(child_name)
child_name = child_name[1..-2] if child_name[0] == '<'
child_name.include?('://') ? child_name : "#{locid}//#{child_name}"
end
def is?(logic_name)
self.logic ? (self.logic.name == logic_name) : false
end
def owl?
self.is?('OWL') || self.is?('OWL2')
end
def to_s
name? ? name : iri
end
# Title for mappings
def title
name? ? iri : nil
end
def self.find_with_locid(locid, iri = nil)
ontology = where(locid: locid).first
if ontology.nil? && iri
ontology = AlternativeIri.where('iri LIKE ?', '%' << iri).
first.try(:ontology)
end
ontology
end
def self.find_with_iri(iri)
ontology = where('iri LIKE ?', '%' << iri).first
if ontology.nil?
ontology = AlternativeIri.where('iri LIKE ?', '%' << iri).
first.try(:ontology)
end
ontology
end
def is_imported?
import_mappings.present?
end
def is_imported_from_other_repository?
import_mappings_from_other_repositories.present?
end
def imported_by
import_mappings.map(&:source)
end
def destroy_with_parent(user)
if parent
repository.delete_file(parent.path, user,
"Delete #{Settings.OMS} #{parent}") do
parent.destroy
end
else
repository.delete_file(path, user,
"Delete #{Settings.OMS} #{self}") do
destroy
end
end
end
def destroy
raise Ontology::DeleteError unless can_be_deleted?
super
end
def can_be_deleted?
if repository.is_destroying
can_be_deleted_with_whole_repository?
else
can_be_deleted_alone?
end
end
def can_be_deleted_alone?
!is_imported?
end
def can_be_deleted_with_whole_repository?
!is_imported_from_other_repository?
end
def imported_ontologies
fetch_mappings_by_kind(self, 'import')
end
def contains_logic_translations?
query, args = contains_logic_translations_query(self)
pluck_select([query, *args], :logically_translated).size > 1
end
def direct_imported_ontologies
ontology_ids = Mapping.where(target_id: self, kind: 'import').
pluck(:source_id)
Ontology.where(id: ontology_ids)
end
def combined_sentences
affected_ontology_ids = [self.id] + imported_ontologies.pluck(:id)
Sentence.where(ontology_id: affected_ontology_ids)
end
# list all sentences defined on this ontology,
# those who are self defined and those which
# are imported (ImpAxioms)
def all_sentences
Sentence.unscoped.
where(ontology_id: self).
where('imported = ? OR imported = ?', true, false)
end
def imported_sentences
Sentence.unscoped.
where(ontology_id: self).
where('imported = ?', true)
end
def basepath
has_versions? ? current_version.basepath : read_attribute(:basepath)
end
def file_extension
has_versions? ? current_version.file_extension : read_attribute(:file_extension)
end
def path
"#{basepath}#{file_extension}"
end
def has_versions?
current_version.present?
end
def file_in_repository
repository.get_file(path)
end
# Uses where in order to force a Relation as a result
def formality_levels
FormalityLevel.joins(:ontologies).
where(ontologies: {id: self})
end
def versioned_locid
current_version.locid
end
protected
def import_mappings
Mapping.where(source_id: id, kind: 'import')
end
def import_mappings_from_other_repositories
import_mappings.select { |l| l.target.repository != repository }
end
end