ricgraph 3.1__tar.gz → 3.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ricgraph
3
- Version: 3.1
3
+ Version: 3.2
4
4
  Summary: Ricgraph - Research in context graph
5
5
  Author: Rik D.T. Janssen
6
6
  License-Expression: MIT
@@ -57,6 +57,33 @@ adapted to new application areas.
57
57
  Throughout this documentation, we illustrate how Ricgraph works by applying
58
58
  it to the application area research information.
59
59
 
60
+ ## Ricgraph introduction videos
61
+
62
+ You may want to watch the following videos about Ricgraph. The left one is a
63
+ short video, only including the Ricgraph use cases. The right one is a more
64
+ extensive one (also including the use cases).
65
+
66
+ <table>
67
+ <tr>
68
+ <td style="width:50%;"><b>Ricgraph use cases video (1m30s)</b></td>
69
+ <td style="width:50%;"><b>Ricgraph introduction video including use cases (2m28s)</b></td>
70
+ </tr>
71
+ <tr>
72
+ <td><video src="docs/videos/ricgraph_usecases.mp4" controls width="90%">Ricgraph use cases video (1m30s)</video></td>
73
+ <td><video src="docs/videos/ricgraph_intro_usecases.mp4" controls width="90%">Ricgraph introduction video including use cases (2m28s)</video></td>
74
+ </tr>
75
+ <tr>
76
+ <td>
77
+ <a href="https://docs.ricgraph.eu/docs/videos/ricgraph_usecases.mp4" target="_blank">
78
+ Click to play or download the Ricgraph use cases video</a>.
79
+ </td>
80
+ <td>
81
+ <a href="https://docs.ricgraph.eu/docs/videos/ricgraph_intro_usecases.mp4" target="_blank">
82
+ Click to play or download the Ricgraph introduction video</a>.
83
+ </td>
84
+ </tr>
85
+ </table>
86
+
60
87
  ## Ricgraph news
61
88
 
62
89
  Read my recent preprint:
@@ -321,6 +348,8 @@ The following figure shows how three persons have contributed to one research ou
321
348
 
322
349
  * Explore the full documentation of Ricgraph on
323
350
  [https://docs.ricgraph.eu](https://docs.ricgraph.eu).
351
+ * Play the [Ricgraph use cases video](docs/videos/ricgraph_usecases.mp4), or the
352
+ [Ricgraph introduction video](docs/videos/ricgraph_intro_usecases.mp4).
324
353
  * For a gentle introduction in Ricgraph, read the reference publication:
325
354
  Rik D.T. Janssen (2024). *Ricgraph: A flexible and extensible graph to explore research in
326
355
  context from various systems*. SoftwareX, 26(101736).
@@ -420,4 +449,4 @@ please let me know by creating a GitHub *Issue* at the top left of that page.
420
449
  <!-- Do not change the lines below. The version number will be
421
450
  modified by script maintenance/update_version.bash -->
422
451
  This README.md file is part of the
423
- documentation for version 3.1 of Ricgraph - Research in context graph.
452
+ documentation for version 3.2 of Ricgraph - Research in context graph.
@@ -7,7 +7,7 @@ packages = ["ricgraph"]
7
7
 
8
8
  [project]
9
9
  name = "ricgraph"
10
- version = "3.1"
10
+ version = "3.2"
11
11
  authors = [
12
12
  { name="Rik D.T. Janssen" },
13
13
  ]
@@ -6,7 +6,7 @@
6
6
  #
7
7
  # MIT License
8
8
  #
9
- # Copyright (c) 2023, 2024, 2025 Rik D.T. Janssen
9
+ # Copyright (c) 2023 - 2026 Rik D.T. Janssen
10
10
  #
11
11
  # Permission is hereby granted, free of charge, to any person obtaining a copy
12
12
  # of this software and associated documentation files (the "Software"), to deal
@@ -101,14 +101,18 @@ In the default configuration of Ricgraph, the following properties are included:
101
101
  from numpy import nan
102
102
  from pandas import DataFrame, concat, set_option
103
103
  from typing import Union
104
- from .ricgraph_utils import timestamp
104
+
105
+ from .ricgraph_utils import (timestamp, timestamp_posix,
106
+ print_records_per_minute,
107
+ print_progress)
105
108
  from .ricgraph_graphdb import (create_update_node, create_two_nodes_and_edge,
106
- RICGRAPH_NODEADD_MODE,
107
- RICGRAPH_PROPERTIES_STANDARD, RICGRAPH_PROPERTIES_ADDITIONAL)
109
+ get_ricgraph_nodeadd_mode,
110
+ get_ricgraph_properties_standard,
111
+ get_ricgraph_properties_additional)
108
112
 
109
113
 
110
114
  __author__ = 'Rik D.T. Janssen'
111
- __copyright__ = 'Copyright (c) 2023, 2024, 2025 Rik D.T. Janssen'
115
+ __copyright__ = 'Copyright (c) 2023 - 2026 Rik D.T. Janssen'
112
116
  __email__ = ''
113
117
  __license__ = 'MIT License'
114
118
  __package__ = 'Ricgraph'
@@ -116,7 +120,7 @@ __package__ = 'Ricgraph'
116
120
  # __version__ should be placed here instead of in __init__.py.
117
121
  # If not here, it cannot be found when executing something like
118
122
  # PYTHONPATH=../ricgraph ../bin/python ricgraph_explorer.py
119
- __version__ = '3.1'
123
+ __version__ = '3.2'
120
124
 
121
125
 
122
126
  # ##############################################################################
@@ -148,18 +152,14 @@ def update_nodes_df(nodes: DataFrame) -> None:
148
152
  nodes_clean.drop_duplicates(keep='first', inplace=True, ignore_index=True)
149
153
 
150
154
  print('There are ' + str(len(nodes_clean)) + ' nodes ('
151
- + timestamp() + '), updating node: 0 ', end='')
155
+ + timestamp() + '), updating node:')
152
156
  count = 0
157
+ start_ts = timestamp_posix()
153
158
  columns = nodes_clean.columns
154
159
  for row in nodes_clean.itertuples():
155
- count += 1
156
- if count % 250 == 0:
157
- print(count, ' ', end='', flush=True)
158
- if count % 2500 == 0:
159
- print('(' + timestamp() + ')\n', end='', flush=True)
160
-
160
+ count = print_progress(count=count, interval=250)
161
161
  node_properties = {}
162
- for prop_name in RICGRAPH_PROPERTIES_ADDITIONAL:
162
+ for prop_name in get_ricgraph_properties_additional():
163
163
  for other_name in columns:
164
164
  if prop_name == other_name:
165
165
  node_properties[prop_name] = getattr(row, other_name)
@@ -167,7 +167,11 @@ def update_nodes_df(nodes: DataFrame) -> None:
167
167
  create_update_node(name=row.name, category=row.category, value=row.value,
168
168
  other_properties=node_properties)
169
169
 
170
- print(count, '(' + timestamp() + ')\n', end='', flush=True)
170
+ print_progress(count=count, now=True)
171
+ end_ts = timestamp_posix()
172
+ print_records_per_minute(start_ts=start_ts, end_ts=end_ts,
173
+ nr_records=count,
174
+ what='Updated')
171
175
  return
172
176
 
173
177
 
@@ -184,18 +188,14 @@ def create_nodepairs_and_edges_df(left_and_right_nodepairs: DataFrame) -> None:
184
188
  :return: None.
185
189
  """
186
190
  print('There are ' + str(len(left_and_right_nodepairs)) + ' rows ('
187
- + timestamp() + '), creating nodes and edges for row: 0 ', end='')
191
+ + timestamp() + '), creating nodes and edges for row:')
188
192
  count = 0
193
+ start_ts = timestamp_posix()
189
194
  columns = left_and_right_nodepairs.columns
190
195
  for row in left_and_right_nodepairs.itertuples():
191
- count += 1
192
- if count % 250 == 0:
193
- print(count, ' ', end='', flush=True)
194
- if count % 2500 == 0:
195
- print('(' + timestamp() + ')\n', end='', flush=True)
196
-
196
+ count = print_progress(count=count, interval=250)
197
197
  node_properties = {}
198
- for prop_name in RICGRAPH_PROPERTIES_ADDITIONAL:
198
+ for prop_name in get_ricgraph_properties_additional():
199
199
  for other_name in columns:
200
200
  if prop_name + '1' == other_name:
201
201
  node_properties[prop_name + '1'] = getattr(row, other_name)
@@ -206,7 +206,11 @@ def create_nodepairs_and_edges_df(left_and_right_nodepairs: DataFrame) -> None:
206
206
  create_two_nodes_and_edge(name1=row.name1, category1=row.category1, value1=row.value1,
207
207
  name2=row.name2, category2=row.category2, value2=row.value2,
208
208
  **node_properties)
209
- print(count, '(' + timestamp() + ')\n', end='', flush=True)
209
+ print_progress(count=count, now=True)
210
+ end_ts = timestamp_posix()
211
+ print_records_per_minute(start_ts=start_ts, end_ts=end_ts,
212
+ nr_records=count,
213
+ what='Created')
210
214
  return
211
215
 
212
216
 
@@ -242,7 +246,7 @@ def create_nodepairs_and_edges_params(name1: Union[dict, str], category1: Union[
242
246
  left_and_right_nodepairs.rename(columns={value1.name: 'value1'}, inplace=True)
243
247
 
244
248
  # This makes programming more efficient
245
- allowed_properties = RICGRAPH_PROPERTIES_ADDITIONAL + RICGRAPH_PROPERTIES_STANDARD
249
+ allowed_properties = get_ricgraph_properties_additional() + get_ricgraph_properties_standard()
246
250
  ext_other_properties = other_properties.copy()
247
251
  ext_other_properties['name1'] = name1
248
252
  ext_other_properties['name2'] = name2
@@ -310,7 +314,7 @@ def unify_personal_identifiers(personal_identifiers: DataFrame,
310
314
  identifiers.dropna(axis=0, how='any', inplace=True)
311
315
  identifiers.drop_duplicates(keep='first', inplace=True, ignore_index=True)
312
316
 
313
- if RICGRAPH_NODEADD_MODE == 'strict':
317
+ if get_ricgraph_nodeadd_mode() == 'strict':
314
318
  # Remove rows which have a cell value that occurs more than once.
315
319
  # There are two situations: (1) nodes with unique value; (2) nodes with non-unique value.
316
320
  # (1) We assume that in one source system, always the same ID is used to connect to
@@ -46,7 +46,7 @@ from sys import getsizeof
46
46
  from typing import Optional
47
47
  from pymemcache.client.base import Client
48
48
  from .ricgraph_constants import MAX_NODES_CACHE_KEY_ID
49
- from .ricgraph_utils import (get_configfile_key,
49
+ from .ricgraph_utils import (get_configfile_key_memcached_parameters,
50
50
  serialize_value, deserialize_value)
51
51
 
52
52
 
@@ -70,19 +70,21 @@ def memcached_open_connection() -> None:
70
70
  If Memcached is not available, then return None.
71
71
  Set the Memcached client in a global variable.
72
72
  """
73
- global _MEMCACHED_HOST, _MEMCACHED_PORT
74
73
  global _memcached_available, _memcached_client
75
74
 
76
- if _MEMCACHED_TO_BE_USED != 'True':
75
+ memcached_to_be_used, memcached_host, memcached_port = get_configfile_key_memcached_parameters()
76
+ if memcached_to_be_used:
77
+ _memcached_available = True
78
+ else:
77
79
  _memcached_available = False
78
80
  return
79
81
 
80
- if _MEMCACHED_HOST == '' or _MEMCACHED_PORT == '':
82
+ if memcached_host == '':
81
83
  _memcached_available = False
82
84
  return
83
85
 
84
86
  try:
85
- memcached_client = Client(server=(_MEMCACHED_HOST, int(_MEMCACHED_PORT)),
87
+ memcached_client = Client(server=(memcached_host, memcached_port),
86
88
  allow_unicode_keys=True)
87
89
 
88
90
  # Test connection by setting and deleting a test key.
@@ -93,6 +95,8 @@ def memcached_open_connection() -> None:
93
95
  _memcached_client = memcached_client
94
96
  return
95
97
  except:
98
+ print('memcached_open_connection(): Warning: could not reach Memcached cache daemon,')
99
+ print(' it is probably not running, continuing with local cache.')
96
100
  _memcached_available = False
97
101
  _memcached_client = None
98
102
  return
@@ -271,16 +275,3 @@ def nodes_cache_key_id_type_size() -> str:
271
275
  result += 'This cache has ' + str(items) + ' elements, and its size is '
272
276
  result += str(size_kb) + ' kB.'
273
277
  return result
274
-
275
-
276
- # ############################################
277
- # ################### main ###################
278
- # ############################################
279
- # This will be executed on module initialization
280
- _MEMCACHED_HOST = get_configfile_key(section='Memcached',
281
- key='memcached_host')
282
- # This returns a str, will be converted to int later on.
283
- _MEMCACHED_PORT = get_configfile_key(section='Memcached',
284
- key='memcached_port')
285
- _MEMCACHED_TO_BE_USED = get_configfile_key(section='Memcached',
286
- key='ricgraph_explorer_uses_memcached')
@@ -82,7 +82,7 @@ MAX_NODES_CACHE_KEY_ID = 2000000
82
82
  MAX_NR_HISTORYITEMS_TO_ADD = 50
83
83
 
84
84
  # The maximum length of the organization abbreviation.
85
- MAX_ORG_ABBREVIATION_LENGTH = 3
85
+ MAX_ORG_ABBREVIATION_LENGTH = 4
86
86
 
87
87
 
88
88
  # ########################################################################
@@ -95,96 +95,116 @@ MAX_ORG_ABBREVIATION_LENGTH = 3
95
95
  #
96
96
  # An example mapping may look like this:
97
97
  # mapping = {
98
- # 'book': ROTYPE_BOOK,
99
- # 'data set': ROTYPE_DATASET,
100
- # 'software': ROTYPE_SOFTWARE
98
+ # 'book': ROCATEGORY_BOOK,
99
+ # 'data set': ROCATEGORY_DATASET,
100
+ # 'software': ROCATEGORY_SOFTWARE
101
101
  # }
102
102
  #
103
- # Call the function lookup_resout_type() to do this mapping.
104
- # If you add a type, also add it to ROTYPE_ALL.
105
- # If you add a type that is a publication, also add it to ROTYPE_PUBLICATION.
103
+ # Call the function lookup_resout_category() to do this mapping.
104
+ # If you add a type, also add it to ROCATEGORY_ALL.
105
+ # If you add a type that is a publication, also add it to ROCATEGORY_PUBLICATION.
106
+ #
107
+ # ROCATEGORY_* are used in the Ricgraph 'category' field.
106
108
  #
107
109
  # This list is inspired by the Strategy Evaluation Protocol 2021-2027
108
110
  # https://www.universiteitenvannederland.nl/files/documenten/Domeinen/Onderzoek/SEP_2021-2027.pdf,
109
111
  # Appendix E2.
110
- ROTYPE_ABSTRACT = 'abstract'
111
- ROTYPE_ARTEFACT = 'artefact'
112
- ROTYPE_BOOK = 'book'
113
- ROTYPE_BOOKCHAPTER = 'book chapter'
114
- ROTYPE_CONFERENCE_ARTICLE = 'conference article'
115
- ROTYPE_DATASET = 'data set'
116
- ROTYPE_DESIGN = 'design'
117
- ROTYPE_DIGITAL_VISUAL_PRODUCT = 'digital or visual product'
118
- ROTYPE_EDITORIAL = 'editorial'
119
- ROTYPE_ENTRY = 'entry for encyclopedia or dictionary'
120
- ROTYPE_EXHIBITION_PERFORMANCE = 'exhibition or performance'
121
- ROTYPE_JOURNAL_ARTICLE = 'journal article'
122
- ROTYPE_LETTER = 'letter to the editor'
123
- ROTYPE_MEMORANDUM = 'memorandum'
124
- ROTYPE_METHOD_DESCRIPTION = 'method description'
125
- ROTYPE_MODEL = 'model'
126
- ROTYPE_OTHER_CONTRIBUTION = 'other contribution'
127
- ROTYPE_PATENT = 'patent'
128
- ROTYPE_PHDTHESIS = 'PhD thesis'
129
- ROTYPE_POSTER = 'poster'
130
- ROTYPE_PREPRINT = 'preprint'
131
- ROTYPE_PRESENTATION = 'presentation'
132
- ROTYPE_REGISTERED_REPORT = 'registered report'
133
- ROTYPE_REPORT = 'report'
134
- ROTYPE_RETRACTION = 'retraction'
135
- ROTYPE_REVIEW = 'review'
136
- ROTYPE_SOFTWARE = 'software'
137
- ROTYPE_THESIS = 'thesis'
138
- ROTYPE_WEBSITE = 'website or web publication'
139
-
140
- ROTYPE_ALL = [ROTYPE_ABSTRACT,
141
- ROTYPE_ARTEFACT,
142
- ROTYPE_BOOK,
143
- ROTYPE_BOOKCHAPTER,
144
- ROTYPE_CONFERENCE_ARTICLE,
145
- ROTYPE_DATASET,
146
- ROTYPE_DESIGN,
147
- ROTYPE_DIGITAL_VISUAL_PRODUCT,
148
- ROTYPE_EDITORIAL,
149
- ROTYPE_ENTRY,
150
- ROTYPE_EXHIBITION_PERFORMANCE,
151
- ROTYPE_JOURNAL_ARTICLE,
152
- ROTYPE_LETTER,
153
- ROTYPE_MEMORANDUM,
154
- ROTYPE_METHOD_DESCRIPTION,
155
- ROTYPE_MODEL,
156
- ROTYPE_OTHER_CONTRIBUTION,
157
- ROTYPE_PATENT,
158
- ROTYPE_PHDTHESIS,
159
- ROTYPE_POSTER,
160
- ROTYPE_PREPRINT,
161
- ROTYPE_PRESENTATION,
162
- ROTYPE_REGISTERED_REPORT,
163
- ROTYPE_REPORT,
164
- ROTYPE_RETRACTION,
165
- ROTYPE_REVIEW,
166
- ROTYPE_SOFTWARE,
167
- ROTYPE_THESIS,
168
- ROTYPE_WEBSITE]
169
-
170
-
171
- ROTYPE_PUBLICATION = [ROTYPE_ABSTRACT,
172
- ROTYPE_BOOK,
173
- ROTYPE_BOOKCHAPTER,
174
- ROTYPE_CONFERENCE_ARTICLE,
175
- ROTYPE_EDITORIAL,
176
- ROTYPE_ENTRY,
177
- ROTYPE_JOURNAL_ARTICLE,
178
- ROTYPE_LETTER,
179
- ROTYPE_MEMORANDUM,
180
- ROTYPE_METHOD_DESCRIPTION,
181
- ROTYPE_PATENT,
182
- ROTYPE_PHDTHESIS,
183
- ROTYPE_POSTER,
184
- ROTYPE_PREPRINT,
185
- ROTYPE_PRESENTATION,
186
- ROTYPE_REGISTERED_REPORT,
187
- ROTYPE_REPORT,
188
- ROTYPE_RETRACTION,
189
- ROTYPE_REVIEW,
190
- ROTYPE_THESIS]
112
+ ROCATEGORY_ABSTRACT = 'abstract'
113
+ ROCATEGORY_ARTEFACT = 'artefact'
114
+ ROCATEGORY_BOOK = 'book'
115
+ ROCATEGORY_BOOKCHAPTER = 'book chapter'
116
+ ROCATEGORY_CONFERENCE_ARTICLE = 'conference article'
117
+ ROCATEGORY_DATASET = 'data set'
118
+ ROCATEGORY_DESIGN = 'design'
119
+ ROCATEGORY_DIGITAL_VISUAL_PRODUCT = 'digital or visual product'
120
+ ROCATEGORY_EDITORIAL = 'editorial'
121
+ ROCATEGORY_ENTRY = 'entry for encyclopedia or dictionary'
122
+ ROCATEGORY_EXHIBITION_PERFORMANCE = 'exhibition or performance'
123
+ ROCATEGORY_JOURNAL_ARTICLE = 'journal article'
124
+ ROCATEGORY_LETTER = 'letter to the editor'
125
+ ROCATEGORY_MEMORANDUM = 'memorandum'
126
+ ROCATEGORY_METHOD_DESCRIPTION = 'method description'
127
+ ROCATEGORY_MODEL = 'model'
128
+ ROCATEGORY_OTHER_CONTRIBUTION = 'other contribution'
129
+ ROCATEGORY_PATENT = 'patent'
130
+ ROCATEGORY_PHDTHESIS = 'PhD thesis'
131
+ ROCATEGORY_POSTER = 'poster'
132
+ ROCATEGORY_PREPRINT = 'preprint'
133
+ ROCATEGORY_PRESENTATION = 'presentation'
134
+ ROCATEGORY_REGISTERED_REPORT = 'registered report'
135
+ ROCATEGORY_REPORT = 'report'
136
+ ROCATEGORY_RETRACTION = 'retraction'
137
+ ROCATEGORY_REVIEW = 'review'
138
+ ROCATEGORY_SOFTWARE = 'software'
139
+ ROCATEGORY_THESIS = 'thesis'
140
+ ROCATEGORY_WEBSITE = 'website or web publication'
141
+
142
+ # ########################################################################
143
+ # This is a special research output type allowing to select all publication
144
+ # types.
145
+ ROCATEGORY_PUBLICATION_ALL = 'publication_all'
146
+
147
+
148
+ ROCATEGORY_ALL = [ROCATEGORY_ABSTRACT,
149
+ ROCATEGORY_ARTEFACT,
150
+ ROCATEGORY_BOOK,
151
+ ROCATEGORY_BOOKCHAPTER,
152
+ ROCATEGORY_CONFERENCE_ARTICLE,
153
+ ROCATEGORY_DATASET,
154
+ ROCATEGORY_DESIGN,
155
+ ROCATEGORY_DIGITAL_VISUAL_PRODUCT,
156
+ ROCATEGORY_EDITORIAL,
157
+ ROCATEGORY_ENTRY,
158
+ ROCATEGORY_EXHIBITION_PERFORMANCE,
159
+ ROCATEGORY_JOURNAL_ARTICLE,
160
+ ROCATEGORY_LETTER,
161
+ ROCATEGORY_MEMORANDUM,
162
+ ROCATEGORY_METHOD_DESCRIPTION,
163
+ ROCATEGORY_MODEL,
164
+ ROCATEGORY_OTHER_CONTRIBUTION,
165
+ ROCATEGORY_PATENT,
166
+ ROCATEGORY_PHDTHESIS,
167
+ ROCATEGORY_POSTER,
168
+ ROCATEGORY_PREPRINT,
169
+ ROCATEGORY_PRESENTATION,
170
+ ROCATEGORY_REGISTERED_REPORT,
171
+ ROCATEGORY_REPORT,
172
+ ROCATEGORY_RETRACTION,
173
+ ROCATEGORY_REVIEW,
174
+ ROCATEGORY_SOFTWARE,
175
+ ROCATEGORY_THESIS,
176
+ ROCATEGORY_WEBSITE]
177
+
178
+ # A resout_type_all is defined in initialize_ricgraph_explorer().
179
+ # These are elements of ROCATEGORY_ALL that are present in your Ricgraph.
180
+ # I.e., those have been harvested from the source systems that you chose to harvest.
181
+
182
+ ROCATEGORY_PUBLICATION = [ROCATEGORY_ABSTRACT,
183
+ ROCATEGORY_BOOK,
184
+ ROCATEGORY_BOOKCHAPTER,
185
+ ROCATEGORY_CONFERENCE_ARTICLE,
186
+ ROCATEGORY_EDITORIAL,
187
+ ROCATEGORY_ENTRY,
188
+ ROCATEGORY_JOURNAL_ARTICLE,
189
+ ROCATEGORY_LETTER,
190
+ ROCATEGORY_MEMORANDUM,
191
+ ROCATEGORY_METHOD_DESCRIPTION,
192
+ ROCATEGORY_PATENT,
193
+ ROCATEGORY_PHDTHESIS,
194
+ ROCATEGORY_POSTER,
195
+ ROCATEGORY_PREPRINT,
196
+ ROCATEGORY_PRESENTATION,
197
+ ROCATEGORY_REGISTERED_REPORT,
198
+ ROCATEGORY_REPORT,
199
+ ROCATEGORY_RETRACTION,
200
+ ROCATEGORY_REVIEW,
201
+ ROCATEGORY_THESIS]
202
+
203
+ # A resout_type_pub is defined in initialize_ricgraph_explorer().
204
+ # These are elements of ROCATEGORY_PUBLICATION that are present in your Ricgraph.
205
+ # I.e., those have been harvested from the source systems that you chose to harvest.
206
+
207
+
208
+ # ########################################################################
209
+ # Other types used in Ricgraph.
210
+ CATEGORY_PRESS_MEDIA = 'press media'