wontomedia 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/Rakefile +9 -5
  2. data/VERSION.yml +2 -2
  3. data/app/controllers/admin_controller.rb +34 -11
  4. data/app/controllers/connections_controller.rb +8 -2
  5. data/app/controllers/items_controller.rb +213 -68
  6. data/app/helpers/format_helper.rb +22 -1
  7. data/app/helpers/items_helper.rb +43 -0
  8. data/app/models/connection.rb +128 -100
  9. data/app/models/item.rb +96 -0
  10. data/app/views/connections/_spo_select_controls.html.erb +65 -31
  11. data/app/views/connections/edit.html.erb +7 -2
  12. data/app/views/connections/index.html.erb +11 -4
  13. data/app/views/connections/show.html.erb +13 -5
  14. data/app/views/items/_class_select.html.erb +41 -0
  15. data/app/views/items/_content_examples.html.erb +21 -18
  16. data/app/views/items/_core_tasks.html.erb +40 -5
  17. data/app/views/items/_form_fields.html.erb +4 -4
  18. data/app/views/items/_inline_item_add_form.html.erb +48 -0
  19. data/app/views/items/_inline_scalar_add_form.html.erb +36 -0
  20. data/app/views/items/_most_populous_classes.html.erb +42 -0
  21. data/app/views/items/_type_select.html.erb +28 -26
  22. data/app/views/items/edit.html.erb +8 -2
  23. data/app/views/items/index.html.erb +5 -1
  24. data/app/views/items/new.html.erb +69 -54
  25. data/app/views/items/newpop.html.erb +18 -3
  26. data/app/views/items/show.html.erb +110 -7
  27. data/app/views/layouts/application.html.erb +2 -2
  28. data/app/views/layouts/base.html.erb +4 -2
  29. data/app/views/layouts/home.html.erb +2 -2
  30. data/assets/wontomedia-sample.rb +2 -0
  31. data/config/asset_packages.yml +1 -0
  32. data/config/cucumber.yml +11 -13
  33. data/db/fixtures/connections.yml +85 -4
  34. data/db/fixtures/items.yml +140 -8
  35. data/db/migrate/20100315135952_provide_scalar_objects.rb +32 -0
  36. data/db/migrate/20100321042343_add_timestamp_columns.rb +33 -0
  37. data/db/schema.rb +17 -11
  38. data/default-custom/app/views/items/home.html.erb +1 -1
  39. data/default-custom/public/stylesheets/wm.css +21 -4
  40. data/lib/helpers/connection_helper.rb +84 -1
  41. data/lib/helpers/item_helper.rb +16 -3
  42. data/lib/tasks/cucumber.rake +0 -2
  43. data/public/images/transparent_ltblue_background.png +0 -0
  44. data/public/images/{alert_background.png → transparent_white_background.png} +0 -0
  45. data/public/javascripts/forConnectionsForms.js +182 -41
  46. data/public/javascripts/forItemsForms.js +40 -5
  47. data/public/javascripts/forItemsShow.js +27 -0
  48. data/public/javascripts/itemCreatePopup.js +10 -3
  49. metadata +13 -5
@@ -20,7 +20,7 @@
20
20
 
21
21
  <% content_for :page_body do %>
22
22
  <% if @title_text %>
23
- <div id="page-title" style="position: absolute; top: 0; left: 15.5%; height: 8ex; width: 69.7%; overflow: hidden;">
23
+ <div id="page-title" class="page-title-text">
24
24
  <h1 style="white-space: nowrap;"><%= @title_text -%></h1>
25
25
  </div>
26
26
  <% end %>
@@ -49,7 +49,7 @@
49
49
  <%= render :partial => "layouts/search_box" %>
50
50
  </div>
51
51
  <div id="page-top-controls"
52
- style="position: absolute; top: 0; right: 16.9%;">
52
+ style="position: absolute; top: 0; right: 15.6%;">
53
53
  <%= render :partial => "layouts/master_help" %>
54
54
  <%= render :partial => "layouts/language_select" %>
55
55
  <%= render :partial => "layouts/login_controls" %>
@@ -25,7 +25,9 @@
25
25
  <head>
26
26
  <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
27
27
  <% if @title_text %>
28
- <title><%= @title_text + " &mdash; " + WontoMedia.site_title -%></title>
28
+ <title><%= @title_text +
29
+ (@window_title_addendum.nil? ? '' : @window_title_addendum) +
30
+ " &mdash; " + WontoMedia.site_title -%></title>
29
31
  <% else %>
30
32
  <title><%= WontoMedia.site_title -%></title>
31
33
  <% end %>
@@ -89,7 +91,7 @@
89
91
  <% end %>
90
92
  <% end %>
91
93
  <%= yield(:last_bottom_page_js) %>
92
- <script>
94
+ <script type="text/javascript">
93
95
  moveAndDisplayDelayedDivs();
94
96
  </script>
95
97
  </body>
@@ -19,7 +19,7 @@
19
19
 
20
20
 
21
21
  <% content_for :page_body do %>
22
- <div id="tag-line" style="position: absolute; top: 0; left: 15.5%;">
22
+ <div id="tag-line" class="page-title-text">
23
23
  <h1><%= WontoMedia.site_tagline -%></h1>
24
24
  </div>
25
25
  <div id="float-center-right"
@@ -56,7 +56,7 @@
56
56
  <%= render :partial => "layouts/login_controls" %>
57
57
  </div>
58
58
  </div>
59
- <div id="column-left" style="width: 98%">
59
+ <div id="column-left">
60
60
  <%= logo_image %>
61
61
  <%= allpages_alert %>
62
62
  <%= yield( :left_column ) %>
@@ -21,6 +21,8 @@ require "ostruct"
21
21
  WontoMedia = OpenStruct.new({
22
22
  :site_title => "", # last element in page <title>
23
23
  :site_tagline => "", # top of home page
24
+ # this is optional, if you don't use it, don't define the constant
25
+ # :site_logo_title => "this is displayed above the logo",
24
26
 
25
27
  # change these if you use a local wiki, but will work to use public
26
28
  :help_url_prefix => "http://wiki.wontology.org/wiki/help.php?title=",
@@ -36,6 +36,7 @@ javascripts:
36
36
  - itemCreatePopup
37
37
  - itemTitleToName
38
38
  - forItemsForms
39
+ - forItemsShow
39
40
  - event.simulate
40
41
  - modalbox
41
42
  stylesheets:
@@ -26,19 +26,17 @@
26
26
  dynamic_only = "--exclude=static features "
27
27
  %>
28
28
 
29
- default: <%= uber_common + dynamic %>
30
- <%= tags_common + " " +
31
- tags_rake + " --tags ~@not_for_selenium" %>
32
- --format pretty features
33
-
34
- selenium: <%= common + dynamic %>
35
- <%= tags_common + " " +
36
- tags_rake + " --tags ~@not_for_selenium" %>
37
- features
38
-
39
- manual: <%= uber_common + dynamic %>
40
- <%= tags_common + " --tags ~@not_for_selenium" %>
41
- --format pretty
29
+
30
+ manual:
31
+ <%= uber_common + dynamic %> <%= tags_common + " --tags ~@not_for_selenium" %> --format pretty
32
+
33
+ default:
34
+ <%= uber_common + dynamic %> <%= tags_common + " " + tags_rake +
35
+ " --tags ~@not_for_selenium" %> --format pretty features
36
+
37
+ selenium:
38
+ <%= common + dynamic %> <%= tags_common + " " + tags_rake +
39
+ " --tags ~@not_for_selenium" %> features
42
40
 
43
41
 
44
42
  # profiles to be used from rake
@@ -20,215 +20,296 @@ define_Item_Class:
20
20
  subject: Item_Class
21
21
  predicate: sub_class_of
22
22
  obj: Item_Class
23
+ kind_of_obj: item
23
24
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
24
25
 
25
26
  define_Property_Item:
26
27
  subject: Property_Item
27
28
  predicate: sub_class_of
28
29
  obj: Item_Class
30
+ kind_of_obj: item
29
31
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
30
32
 
31
33
  define_Type_Item:
32
34
  subject: Type_Item
33
35
  predicate: sub_class_of
34
36
  obj: Item_Class
37
+ kind_of_obj: item
35
38
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
36
39
 
37
40
  define_String_Value:
38
41
  subject: String_Value
39
42
  predicate: sub_class_of
40
43
  obj: Type_Item
44
+ kind_of_obj: item
41
45
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
42
46
 
43
47
  define_Integer_Value:
44
48
  subject: Integer_Value
45
49
  predicate: sub_class_of
46
50
  obj: Type_Item
51
+ kind_of_obj: item
47
52
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
48
53
 
49
54
  define_Number_Value:
50
55
  subject: Number_Value
51
56
  predicate: sub_class_of
52
57
  obj: Type_Item
58
+ kind_of_obj: item
53
59
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
54
60
 
55
61
  define_Boolean_Value:
56
62
  subject: Boolean_Value
57
63
  predicate: sub_class_of
58
64
  obj: Type_Item
65
+ kind_of_obj: item
59
66
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
60
67
 
61
68
  define_Value_True:
62
69
  subject: Value_True
63
70
  predicate: is_instance_of
64
71
  obj: Boolean_Value
72
+ kind_of_obj: item
65
73
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
66
74
 
67
75
  define_Value_False:
68
76
  subject: Value_False
69
77
  predicate: is_instance_of
70
78
  obj: Boolean_Value
79
+ kind_of_obj: item
71
80
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
72
81
 
73
82
  define_URL_Value:
74
83
  subject: URL_Value
75
84
  predicate: sub_class_of
76
85
  obj: String_Value
86
+ kind_of_obj: item
87
+ flags: <%= Connection::DATA_IS_UNALTERABLE %>
88
+
89
+ define_Value_ItemType_Category:
90
+ subject: Value_ItemType_Category
91
+ predicate: is_instance_of
92
+ obj: ItemType_Item
93
+ kind_of_obj: item
94
+ flags: <%= Connection::DATA_IS_UNALTERABLE %>
95
+
96
+ define_Value_ItemType_Individual:
97
+ subject: Value_ItemType_Individual
98
+ predicate: is_instance_of
99
+ obj: ItemType_Item
100
+ kind_of_obj: item
101
+ flags: <%= Connection::DATA_IS_UNALTERABLE %>
102
+
103
+ define_Value_ItemType_Property:
104
+ subject: Value_ItemType_Property
105
+ predicate: is_instance_of
106
+ obj: ItemType_Item
107
+ kind_of_obj: item
77
108
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
78
109
 
79
110
  set_ordered_class:
80
111
  subject: ordered_relationship
81
112
  predicate: sub_class_of
82
113
  obj: Property_Item
114
+ kind_of_obj: item
83
115
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
84
116
 
85
117
  set_hierarchical_class:
86
118
  subject: hierarchical_relationship
87
119
  predicate: sub_class_of
88
120
  obj: Property_Item
121
+ kind_of_obj: item
89
122
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
90
123
 
91
124
  set_value_class:
92
125
  subject: value_relationship
93
126
  predicate: sub_class_of
94
127
  obj: Property_Item
128
+ kind_of_obj: item
95
129
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
96
130
 
97
131
  set_symmetric_class:
98
132
  subject: symmetric_relationship
99
133
  predicate: sub_class_of
100
134
  obj: Property_Item
135
+ kind_of_obj: item
101
136
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
102
137
 
103
138
  define_sub_property_of:
104
139
  subject: sub_property_of
105
140
  predicate: sub_property_of
106
141
  obj: hierarchical_relationship
142
+ kind_of_obj: item
107
143
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
108
144
 
109
145
  define_sub_class_of:
110
146
  subject: sub_class_of
111
147
  predicate: sub_property_of
112
148
  obj: hierarchical_relationship
149
+ kind_of_obj: item
113
150
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
114
151
 
115
152
  define_is_instance_of:
116
153
  subject: is_instance_of
117
154
  predicate: sub_property_of
118
155
  obj: hierarchical_relationship
156
+ kind_of_obj: item
119
157
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
120
158
 
121
159
  define_inverse_relationship:
122
160
  subject: inverse_relationship
123
161
  predicate: sub_property_of
124
162
  obj: symmetric_relationship
163
+ kind_of_obj: item
125
164
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
126
165
 
127
166
  define_parent_of:
128
167
  subject: parent_of
129
168
  predicate: sub_property_of
130
169
  obj: hierarchical_relationship
170
+ kind_of_obj: item
131
171
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
132
172
 
133
173
  define_child_of:
134
174
  subject: child_of
135
175
  predicate: sub_property_of
136
176
  obj: hierarchical_relationship
177
+ kind_of_obj: item
137
178
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
138
179
 
139
180
  define_parent_to_child_symmetry:
140
181
  subject: parent_of
141
182
  predicate: inverse_relationship
142
183
  obj: child_of
184
+ kind_of_obj: item
143
185
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
144
186
 
145
187
  define_child_to_parent_symmetry:
146
188
  subject: child_of
147
189
  predicate: inverse_relationship
148
190
  obj: parent_of
191
+ kind_of_obj: item
149
192
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
150
193
 
151
194
  define_property_subject_is:
152
195
  subject: property_subject_is
153
196
  predicate: sub_property_of
154
- obj: symmetric_relationship
197
+ obj: value_relationship
198
+ kind_of_obj: item
155
199
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
156
200
 
157
201
  define_property_object_is:
158
202
  subject: property_object_is
159
203
  predicate: sub_property_of
160
- obj: symmetric_relationship
204
+ obj: value_relationship
205
+ kind_of_obj: item
161
206
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
162
207
 
163
208
  define_applies_to_class:
164
209
  subject: applies_to_class
165
210
  predicate: sub_property_of
166
- obj: symmetric_relationship
211
+ obj: value_relationship
212
+ kind_of_obj: item
213
+ flags: <%= Connection::DATA_IS_UNALTERABLE %>
214
+
215
+ define_class_item_type_is:
216
+ subject: applies_to_class
217
+ predicate: sub_property_of
218
+ obj: value_relationship
219
+ kind_of_obj: item
167
220
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
168
221
 
169
222
  define_has_scalar_object:
170
223
  subject: has_scalar_object
171
224
  predicate: sub_property_of
172
225
  obj: value_relationship
226
+ kind_of_obj: item
173
227
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
174
228
 
175
229
  define_has_item_object:
176
230
  subject: has_item_object
177
231
  predicate: sub_property_of
178
232
  obj: value_relationship
233
+ kind_of_obj: item
179
234
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
180
235
 
181
236
  define_max_uses_per_item:
182
237
  subject: max_uses_per_item
183
238
  predicate: sub_property_of
184
239
  obj: value_relationship
240
+ kind_of_obj: item
185
241
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
186
242
 
187
243
  mupi_is_scalar:
188
244
  subject: max_uses_per_item
189
245
  predicate: has_scalar_object
190
246
  obj: Value_True
247
+ kind_of_obj: item
191
248
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
192
249
 
193
250
  define_peer_of:
194
251
  subject: peer_of
195
252
  predicate: sub_property_of
196
253
  obj: symmetric_relationship
254
+ kind_of_obj: item
197
255
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
198
256
 
199
257
  define_one_of:
200
258
  subject: one_of
201
259
  predicate: sub_property_of
202
260
  obj: child_of
261
+ kind_of_obj: item
262
+ flags: <%= Connection::DATA_IS_UNALTERABLE %>
263
+
264
+ define_part_of:
265
+ subject: part_of
266
+ predicate: sub_property_of
267
+ obj: child_of
203
268
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
204
269
 
205
270
  define_contains:
206
271
  subject: contains
207
272
  predicate: sub_property_of
208
273
  obj: parent_of
274
+ kind_of_obj: item
275
+ flags: <%= Connection::DATA_IS_UNALTERABLE %>
276
+
277
+ define_part_of_to_contains_symmetry:
278
+ subject: part_of
279
+ predicate: inverse_relationship
280
+ obj: contains
281
+ flags: <%= Connection::DATA_IS_UNALTERABLE %>
282
+
283
+ define_contains_to_part_of_symmetry:
284
+ subject: contains
285
+ predicate: inverse_relationship
286
+ obj: part_of
209
287
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
210
288
 
211
289
  define_predecessor_to_successor_symmetry:
212
290
  subject: predecessor_of
213
291
  predicate: inverse_relationship
214
292
  obj: successor_of
293
+ kind_of_obj: item
215
294
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
216
295
 
217
296
  define_successor_to_predecessor_symmetry:
218
297
  subject: successor_of
219
298
  predicate: inverse_relationship
220
299
  obj: predecessor_of
300
+ kind_of_obj: item
221
301
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
222
302
 
223
303
  define_predecessor_of:
224
304
  subject: predecessor_of
225
305
  predicate: sub_property_of
226
306
  obj: ordered_relationship
307
+ kind_of_obj: item
227
308
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
228
309
 
229
310
  define_successor_of:
230
311
  subject: successor_of
231
312
  predicate: sub_property_of
232
313
  obj: ordered_relationship
314
+ kind_of_obj: item
233
315
  flags: <%= Connection::DATA_IS_UNALTERABLE %>
234
-
@@ -81,6 +81,20 @@ Type_Item:
81
81
  "String_Value" type.)
82
82
 
83
83
 
84
+ ItemType_Item:
85
+ name: ItemType_Item
86
+ sti_type: CategoryItem
87
+ flags: <%= Item::DATA_IS_UNALTERABLE %>
88
+ title: Group of items representing possible Item Types (foundation class)
89
+ description: >-
90
+ This category item is part of the representation of the system's
91
+ basic classification scheme for items (Category, Individual,
92
+ Property) within the database of connections and items itself.
93
+ Having items representing the available Item Types allows
94
+ connections to be created that make statements about the types of
95
+ items that are acceptable as members of a class.
96
+
97
+
84
98
  String_Value:
85
99
  name: String_Value
86
100
  sti_type: CategoryItem
@@ -127,6 +141,28 @@ Number_Value:
127
141
  figures.
128
142
 
129
143
 
144
+ Date_Value:
145
+ name: Date_Value
146
+ sti_type: CategoryItem
147
+ flags: <%= Item::DATA_IS_UNALTERABLE %>
148
+ title: A Date (optionally with time, scalar type)
149
+ description: >-
150
+ This item represents a particular date (and time). It is a
151
+ relatively free-form field, allowingg a mix of letters, numbers,
152
+ and punctuation to allow easily human-readable dates to be
153
+ entered. The date/time can be as accurate as the information you
154
+ have allows. Depending on the context, it could be as general as
155
+ a single year or even a century, or it could be a date and time
156
+ down to the second: "March 24, 2010 at 12:15:22pm (Pacific)".
157
+ But it cannot be ambiguous. For example, if you spell out the
158
+ month when entering a birth date, then both "4 January 1955" and
159
+ "Jan 4, 1955" are acceptable. However, you should not type
160
+ something like "1/4/55" because of both the month/day ambiguity
161
+ (difference between U.S. and European common ordering) and because
162
+ of the century ambiguity (probably 1955, but what if it was
163
+ 1855?).
164
+
165
+
130
166
  Boolean_Value:
131
167
  name: Boolean_Value
132
168
  sti_type: CategoryItem
@@ -192,6 +228,36 @@ URL_Value:
192
228
  the actual web address.
193
229
 
194
230
 
231
+ Value_ItemType_Category:
232
+ name: Value_ItemType_Category
233
+ sti_type: IndividualItem
234
+ flags: <%= Item::DATA_IS_UNALTERABLE %>
235
+ title: Item Type 'Category' (a constant value)
236
+ description: >-
237
+ This item represents the "Category" type of system items. See
238
+ the description of ItemType_Item.
239
+
240
+
241
+ Value_ItemType_Individual:
242
+ name: Value_ItemType_Individual
243
+ sti_type: IndividualItem
244
+ flags: <%= Item::DATA_IS_UNALTERABLE %>
245
+ title: Item Type 'Individual' (a constant value)
246
+ description: >-
247
+ This item represents the "Individual" type of system items. See
248
+ the description of ItemType_Item.
249
+
250
+
251
+ Value_ItemType_Property:
252
+ name: Value_ItemType_Property
253
+ sti_type: IndividualItem
254
+ flags: <%= Item::DATA_IS_UNALTERABLE %>
255
+ title: Item Type 'Property' (a constant value)
256
+ description: >-
257
+ This item represents the "Property" type of system items. See
258
+ the description of ItemType_Item.
259
+
260
+
195
261
  #### Minimal set of types (predicates) for connections
196
262
  #### this is WontoMedia's native "schema", and represents the minimal
197
263
  #### typing information used by the UI
@@ -255,6 +321,35 @@ applies_to_class:
255
321
  fill in.
256
322
 
257
323
 
324
+ class_item_type_is:
325
+ name: class_item_type_is
326
+ sti_type: PropertyItem
327
+ flags: <%= Item::DATA_IS_UNALTERABLE %>
328
+ title: Class' Item-Type is (defining relationship)
329
+ description: >-
330
+ This property is used to constrain the type (Individual, Category,
331
+ or Property) of item that is acceptable for items that are to be
332
+ instances of the subject class. For example, assume that
333
+ ChemicalElement is a class. It is reasonable to require that all
334
+ items which are instances of this class be "individual" items,
335
+ since it is unlikely to be appropriate to represent a single
336
+ chemical element as a "category". (What would go into the "Carbon
337
+ category"?) So, the connection "ChemicalElement
338
+ class_item_type_is Value_ItemType_Individual" states that all of
339
+ ChemicalElement' instance items are (must be Individual-type
340
+ items). With this connection in place, the system will only
341
+ permit the creation of new items whose class is ChemicalElement to
342
+ be of type Individual. (Note that this connection is provided to
343
+ be an aid to data entry and editing, and is not enforced as a
344
+ completely strict prohibition. For example, since class
345
+ membership is represented by the presence of "is_instance_of"
346
+ connections, like "Carbon is_instance_of ChemicalElement",
347
+ explicitly editing the connection that establishes an items class
348
+ after that item is created will circumvent the class/type checking
349
+ and can produce a wontology containing contradictory
350
+ statements&mdash<em>caveat editor</em>.)
351
+
352
+
258
353
  has_scalar_object:
259
354
  name: has_scalar_object
260
355
  sti_type: PropertyItem
@@ -365,7 +460,43 @@ one_of:
365
460
  'Contains' are approximate opposites of each other. However,
366
461
  making a 'One Of' relationship between two items will not
367
462
  automatically cause the symmetric 'Contains' relationship to be
368
- created.
463
+ created/assumed.
464
+
465
+
466
+ part_of:
467
+ name: part_of
468
+ sti_type: PropertyItem
469
+ flags: <%= Item::DATA_IS_UNALTERABLE %>
470
+ title: Part Of (basic relationship)
471
+ description: >-
472
+ A relationship of this type between two items is hierarchical.
473
+ This relationship states that the subject (left-hand side) of the
474
+ relationship ("A" in the relationship "A is Part-Of B", and like
475
+ "SoftwareTesting" in "SoftwareTesting is Part-Of ComputerSoftware"
476
+ in a categorization of engineering disciplines) is assumed to be
477
+ more specific/narrow than, and contained within, what corresponds
478
+ to the object of the relationship ("B" and "ComputerSoftware").
479
+ When showing a graph of connections between items, the system will
480
+ attempt to indicate 'Part-Of' relationships as primarily vertical,
481
+ with the object-item drawn nearer "the root" of the graph and the
482
+ subject-item toward "the leaves".
483
+
484
+ 'Part Of' is most appropriate for showing relationships that would
485
+ be indicated by complete inclusion when drawing a Ven Diagram.
486
+ That is, if drawing a Ven Diagram of how categories relate to each
487
+ other, the category corresponding to the subject item of this
488
+ relationship would be drawn entirely within the category
489
+ corresponding to the object item. In this way, it is more
490
+ restrictive than the 'One Of' relationship, which indicates
491
+ membership without implying complete overlap.
492
+
493
+ 'Part Of' is the opposite of 'Contains'. Creating a relationship
494
+ that states one category is 'Part Of' another is exactly the same
495
+ as creating a 'Contains' relationship with the subject and object
496
+ reversed, and the system will list the relationship between them
497
+ using both relationship names. 'Part Of' is itself a child of
498
+ 'Child Of'. (And 'Child Of' is the opposite of 'Parent Of', and
499
+ finally 'Contains' is a child of 'Parent Of'.)
369
500
 
370
501
 
371
502
  contains:
@@ -389,13 +520,14 @@ contains:
389
520
  are better indicated with 'Parent Of', as in "vehicle Contains
390
521
  spacecraft" (assuming, of course, that both are categories).
391
522
 
392
- 'Contains' is actually Child-Of 'Parent Of'. 'Parent Of' and
393
- 'Child Of' are opposites of each other, and 'One Of' is a child of
394
- 'Child Of'. But this does not make 'Contains' and 'Child Of'
395
- opposites of each other, though an approximation of opposite-ness
396
- could be inferred. The system will not automatically cause a
397
- 'Child Of' relationship to be created when a 'Contains'
398
- relationship is.
523
+ 'Contains' is the opposite of 'Part Of'. Creating a relationship
524
+ that states one category 'Contains' another is exactly the same as
525
+ creating a 'Part Of' relationship with the subject and object
526
+ revesed, and the system will list the relationship between them
527
+ using both relationship names.'Contains' is also Child-Of 'Parent
528
+ Of'. (And 'Parent Of' and 'Child Of' are opposites of each other,
529
+ and 'One Of' is another child of 'Child Of'. But this does not
530
+ make 'Contains' and 'Child Of' opposites of each other.)
399
531
 
400
532
 
401
533
  parent_of: