CSV_to_RDF_mpp_Measurement.py 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. # Utilities to read/write csv files
  2. import csv
  3. # Utilities to handle character encodings
  4. import unicodedata
  5. # Ordered Dicts
  6. from collections import OrderedDict
  7. import json
  8. # OPZIONAL IMPORTS
  9. # For timestamping/simple speed tests
  10. from datetime import datetime
  11. # Random number generator
  12. from random import *
  13. # System & command line utilities
  14. import sys
  15. # Json for the dictionary
  16. import json
  17. import_dir = '/Users/alessiaspadi/Documents/RESTORE/temp_MPP/tabelle/Ospedale/mod/'
  18. export_dir = '/Users/alessiaspadi/Documents/RESTORE/temp_MPP/tabelle/Ospedale/mod/E54_'
  19. # Custom class to store URIs + related infos for the ontologies/repositories
  20. class RDFcoords:
  21. def __init__(self, uri, prefix, code = None):
  22. self.uri = uri
  23. self.prefix = prefix
  24. self.code = code
  25. # Repositories
  26. museoCoords = RDFcoords('<http://palazzopretorio.comune.prato.it/it/le-opere/alcuni-capolavori/>', 'mpp:')
  27. cidocCoords = RDFcoords('<http://www.cidoc-crm.org/cidoc-crm/>', 'crm:')
  28. aatCoords = RDFcoords('<http://vocab.getty.edu/aat/>', 'aat:')
  29. nsCoords = RDFcoords('<http://www.w3.org/1999/02/22-rdf-syntax-ns#>', 'rdf:')
  30. schemaCoords = RDFcoords('<http://www.w3.org/2000/01/rdf-schema#>', 'rdfs:')
  31. # Basic functions for triples / shortened triples in TTL format
  32. def triple(subject, predicate, object1):
  33. line = subject + ' ' + predicate + ' ' + object1
  34. return line
  35. def doublet(predicate, object1):
  36. line = ' ' + predicate + ' ' + object1
  37. return line
  38. def singlet(object1):
  39. line = ' ' + object1
  40. return line
  41. # Line endings in TTL format
  42. continueLine1 = ' ;\n'
  43. continueLine2 = ' ,\n'
  44. closeLine = ' .\n'
  45. def writeTTLHeader(output):
  46. output.write('@prefix ' + museoCoords.prefix + ' ' + museoCoords.uri + closeLine)
  47. output.write('@prefix ' + cidocCoords.prefix + ' ' + cidocCoords.uri + closeLine)
  48. output.write('@prefix ' + aatCoords.prefix + ' ' + aatCoords.uri + closeLine)
  49. output.write('@prefix ' + schemaCoords.prefix + ' ' + schemaCoords.uri + closeLine)
  50. output.write('@prefix ' + nsCoords.prefix + ' ' + nsCoords.uri + closeLine)
  51. output.write('\n')
  52. filePrefix = 'SR20OA_'
  53. fileType = 'Ospedale'
  54. max_entries = 1000000000
  55. with open(import_dir + filePrefix + fileType + '.csv', newline="") as csv_file, open(
  56. export_dir + filePrefix + fileType + '.ttl', 'w') as output:
  57. reader = csv.DictReader(csv_file)
  58. writeTTLHeader(output)
  59. first = True
  60. ii = 0
  61. for row in reader:
  62. # The index ii is used to process a limited number of entries for testing purposes
  63. ii = ii + 1
  64. # Triplify the 'codice' -- should exist for every entry
  65. if row['RVEL'] == '' or row['RVEL'] == '0':
  66. codice = ''
  67. if (row['NCTR'] != '' and row['NCTN'] != ''):
  68. codice = row['NCTR'] + row['NCTN']
  69. unit = ''
  70. if (row['MISU'] != ''):
  71. unit = row['MISU']
  72. valueA = ''
  73. valueL = ''
  74. if (row['MISA'] != ''):
  75. value = row['MISA']
  76. valueA = value.replace(',', 'v')
  77. if (row['MISL'] != ''):
  78. value = row['MISL']
  79. valueL = value.replace(',', 'v')
  80. url = row['URL']
  81. #placeHolders
  82. datplaceHolder = museoCoords.prefix + url
  83. e55placeHolder = museoCoords.prefix + url + '_E55'
  84. e58placeHolder = museoCoords.prefix + url + '_unit_' + unit
  85. e60placeHolderA = museoCoords.prefix + url + '_value_' + valueA
  86. e60placeHolderL = museoCoords.prefix + url + '_value_' + valueL
  87. #Altezza
  88. #E22 P43 E54
  89. if (row['MISA'] != ''):
  90. line = triple(datplaceHolder,
  91. cidocCoords.prefix + 'P43_has_dimension',
  92. museoCoords.prefix + url + '_Altezza') + closeLine
  93. output.write(line)
  94. line = triple(museoCoords.prefix + url + '_Altezza',
  95. nsCoords.prefix + 'type',
  96. cidocCoords.prefix + 'E54_Dimension') + closeLine
  97. output.write(line)
  98. line = triple(museoCoords.prefix + url + '_Altezza',
  99. schemaCoords.prefix + 'label',
  100. '\"Altezza: ' + row['MISA'] + row['MISU'] +'\"') + closeLine
  101. output.write(line)
  102. # E54 P90 E60
  103. line = triple(museoCoords.prefix + url + '_Altezza',
  104. cidocCoords.prefix + 'P90_has_value',
  105. e60placeHolderA) + closeLine
  106. output.write(line)
  107. line = triple(e60placeHolderA,
  108. nsCoords.prefix + 'type',
  109. cidocCoords.prefix + 'E60') + closeLine
  110. output.write(line)
  111. line = triple(e60placeHolderA,
  112. schemaCoords.prefix + 'label',
  113. '\"' + row['MISA'] + '\"') + closeLine
  114. output.write(line)
  115. #E54 P2 E55
  116. line = triple(museoCoords.prefix + url + '_Altezza',
  117. cidocCoords.prefix + 'P2_has_type',
  118. aatCoords.prefix + '300055644') + closeLine
  119. output.write(line)
  120. line = triple(aatCoords.prefix + '300055644',
  121. schemaCoords.prefix + 'label',
  122. '\"altezza\"') + closeLine
  123. output.write(line)
  124. # E54 P91 E58
  125. if (row['MISU'] != ''):
  126. line = triple(museoCoords.prefix + url + '_Altezza',
  127. cidocCoords.prefix + 'P91_has_unit',
  128. e58placeHolder) + closeLine
  129. output.write(line)
  130. line = triple(e58placeHolder,
  131. nsCoords.prefix + 'type',
  132. cidocCoords.prefix + 'E58_Measurement_Unit') + closeLine
  133. output.write(line)
  134. line = triple(e58placeHolder,
  135. schemaCoords.prefix + 'label',
  136. '\"' + row['MISU'] + '\"') + closeLine
  137. output.write(line)
  138. # Larghezza
  139. # E22 P43 E54
  140. if (row['MISL'] != ''):
  141. line = triple(datplaceHolder,
  142. cidocCoords.prefix + 'P43_has_dimension',
  143. museoCoords.prefix + url + '_Larghezza') + closeLine
  144. output.write(line)
  145. line = triple(museoCoords.prefix + url + '_Larghezza',
  146. nsCoords.prefix + 'type',
  147. cidocCoords.prefix + 'E54_Dimension') + closeLine
  148. output.write(line)
  149. line = triple(museoCoords.prefix + url + '_Larghezza',
  150. schemaCoords.prefix + 'label',
  151. '\"Larghezza: ' + row['MISL'] + row['MISU'] + '\"') + closeLine
  152. output.write(line)
  153. # E54 P90 E60
  154. line = triple(museoCoords.prefix + url + '_Larghezza',
  155. cidocCoords.prefix + 'P90_has_value',
  156. e60placeHolderL) + closeLine
  157. output.write(line)
  158. line = triple(e60placeHolderL,
  159. nsCoords.prefix + 'type',
  160. cidocCoords.prefix + 'E60') + closeLine
  161. output.write(line)
  162. line = triple(e60placeHolderL,
  163. schemaCoords.prefix + 'label',
  164. '\"' + row['MISL'] + '\"') + closeLine
  165. output.write(line)
  166. # E54 P2 E55
  167. line = triple(museoCoords.prefix + url + '_Larghezza',
  168. cidocCoords.prefix + 'P2_has_type',
  169. aatCoords.prefix + '300055647') + closeLine
  170. output.write(line)
  171. line = triple(aatCoords.prefix + '300055647',
  172. schemaCoords.prefix + 'label',
  173. '\"larghezza\"') + closeLine
  174. output.write(line)
  175. # E54 P91 E58
  176. if (row['MISU'] != ''):
  177. line = triple(museoCoords.prefix + url + '_Larghezza',
  178. cidocCoords.prefix + 'P91_has_unit',
  179. e58placeHolder) + closeLine
  180. output.write(line)
  181. line = triple(e58placeHolder,
  182. nsCoords.prefix + 'type',
  183. cidocCoords.prefix + 'E58_Measurement_Unit') + closeLine
  184. output.write(line)
  185. line = triple(e58placeHolder,
  186. schemaCoords.prefix + 'label',
  187. '\"' + row['MISU'] + '\"') + closeLine
  188. output.write(line)
  189. output.write('\n')
  190. #
  191. #
  192. # Limit number of entries processed (if desired)
  193. if (ii > max_entries):
  194. break