cognite-neat 0.70.1__py3-none-any.whl → 0.127.19__py3-none-any.whl

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.
Files changed (530) hide show
  1. cognite/neat/__init__.py +4 -1
  2. cognite/neat/_client/__init__.py +4 -0
  3. cognite/neat/_client/api.py +8 -0
  4. cognite/neat/_client/client.py +21 -0
  5. cognite/neat/_client/config.py +40 -0
  6. cognite/neat/_client/containers_api.py +125 -0
  7. cognite/neat/_client/data_classes.py +44 -0
  8. cognite/neat/_client/data_model_api.py +115 -0
  9. cognite/neat/_client/spaces_api.py +115 -0
  10. cognite/neat/_client/statistics_api.py +24 -0
  11. cognite/neat/_client/views_api.py +129 -0
  12. cognite/neat/_data_model/_analysis.py +186 -0
  13. cognite/neat/_data_model/_constants.py +67 -0
  14. cognite/neat/_data_model/_identifiers.py +61 -0
  15. cognite/neat/_data_model/_shared.py +41 -0
  16. cognite/neat/_data_model/deployer/_differ.py +140 -0
  17. cognite/neat/_data_model/deployer/_differ_container.py +360 -0
  18. cognite/neat/_data_model/deployer/_differ_data_model.py +54 -0
  19. cognite/neat/_data_model/deployer/_differ_space.py +9 -0
  20. cognite/neat/_data_model/deployer/_differ_view.py +299 -0
  21. cognite/neat/_data_model/deployer/data_classes.py +529 -0
  22. cognite/neat/_data_model/deployer/deployer.py +401 -0
  23. cognite/neat/_data_model/exporters/__init__.py +15 -0
  24. cognite/neat/_data_model/exporters/_api_exporter.py +37 -0
  25. cognite/neat/_data_model/exporters/_base.py +24 -0
  26. cognite/neat/_data_model/exporters/_table_exporter/exporter.py +128 -0
  27. cognite/neat/_data_model/exporters/_table_exporter/workbook.py +409 -0
  28. cognite/neat/_data_model/exporters/_table_exporter/writer.py +399 -0
  29. cognite/neat/_data_model/importers/__init__.py +5 -0
  30. cognite/neat/_data_model/importers/_api_importer.py +166 -0
  31. cognite/neat/_data_model/importers/_base.py +16 -0
  32. cognite/neat/_data_model/importers/_table_importer/data_classes.py +291 -0
  33. cognite/neat/_data_model/importers/_table_importer/importer.py +192 -0
  34. cognite/neat/_data_model/importers/_table_importer/reader.py +875 -0
  35. cognite/neat/_data_model/importers/_table_importer/source.py +94 -0
  36. cognite/neat/_data_model/models/conceptual/_base.py +18 -0
  37. cognite/neat/_data_model/models/conceptual/_concept.py +67 -0
  38. cognite/neat/_data_model/models/conceptual/_data_model.py +51 -0
  39. cognite/neat/_data_model/models/conceptual/_properties.py +104 -0
  40. cognite/neat/_data_model/models/conceptual/_property.py +105 -0
  41. cognite/neat/_data_model/models/dms/__init__.py +206 -0
  42. cognite/neat/_data_model/models/dms/_base.py +31 -0
  43. cognite/neat/_data_model/models/dms/_constants.py +47 -0
  44. cognite/neat/_data_model/models/dms/_constraints.py +42 -0
  45. cognite/neat/_data_model/models/dms/_container.py +159 -0
  46. cognite/neat/_data_model/models/dms/_data_model.py +94 -0
  47. cognite/neat/_data_model/models/dms/_data_types.py +195 -0
  48. cognite/neat/_data_model/models/dms/_http.py +28 -0
  49. cognite/neat/_data_model/models/dms/_indexes.py +30 -0
  50. cognite/neat/_data_model/models/dms/_limits.py +96 -0
  51. cognite/neat/_data_model/models/dms/_references.py +135 -0
  52. cognite/neat/_data_model/models/dms/_schema.py +18 -0
  53. cognite/neat/_data_model/models/dms/_space.py +48 -0
  54. cognite/neat/_data_model/models/dms/_types.py +17 -0
  55. cognite/neat/_data_model/models/dms/_view_filter.py +282 -0
  56. cognite/neat/_data_model/models/dms/_view_property.py +235 -0
  57. cognite/neat/_data_model/models/dms/_views.py +210 -0
  58. cognite/neat/_data_model/models/entities/__init__.py +50 -0
  59. cognite/neat/_data_model/models/entities/_base.py +101 -0
  60. cognite/neat/_data_model/models/entities/_constants.py +22 -0
  61. cognite/neat/_data_model/models/entities/_data_types.py +144 -0
  62. cognite/neat/_data_model/models/entities/_identifiers.py +61 -0
  63. cognite/neat/_data_model/models/entities/_parser.py +226 -0
  64. cognite/neat/_data_model/validation/dms/__init__.py +57 -0
  65. cognite/neat/_data_model/validation/dms/_ai_readiness.py +167 -0
  66. cognite/neat/_data_model/validation/dms/_base.py +304 -0
  67. cognite/neat/_data_model/validation/dms/_connections.py +627 -0
  68. cognite/neat/_data_model/validation/dms/_consistency.py +56 -0
  69. cognite/neat/_data_model/validation/dms/_containers.py +135 -0
  70. cognite/neat/_data_model/validation/dms/_limits.py +414 -0
  71. cognite/neat/_data_model/validation/dms/_orchestrator.py +202 -0
  72. cognite/neat/_data_model/validation/dms/_views.py +101 -0
  73. cognite/neat/_exceptions.py +56 -0
  74. cognite/neat/_issues.py +68 -0
  75. cognite/neat/_session/__init__.py +3 -0
  76. cognite/neat/_session/_html/_render.py +30 -0
  77. cognite/neat/_session/_html/static/__init__.py +8 -0
  78. cognite/neat/_session/_html/static/deployment.css +303 -0
  79. cognite/neat/_session/_html/static/deployment.js +149 -0
  80. cognite/neat/_session/_html/static/issues.css +211 -0
  81. cognite/neat/_session/_html/static/issues.js +167 -0
  82. cognite/neat/_session/_html/static/shared.css +186 -0
  83. cognite/neat/_session/_html/templates/__init__.py +4 -0
  84. cognite/neat/_session/_html/templates/deployment.html +74 -0
  85. cognite/neat/_session/_html/templates/issues.html +44 -0
  86. cognite/neat/_session/_issues.py +76 -0
  87. cognite/neat/_session/_opt.py +35 -0
  88. cognite/neat/_session/_physical.py +240 -0
  89. cognite/neat/_session/_result.py +231 -0
  90. cognite/neat/_session/_session.py +69 -0
  91. cognite/neat/_session/_usage_analytics/_collector.py +131 -0
  92. cognite/neat/_session/_usage_analytics/_constants.py +23 -0
  93. cognite/neat/_session/_usage_analytics/_storage.py +240 -0
  94. cognite/neat/_session/_wrappers.py +82 -0
  95. cognite/neat/_state_machine/__init__.py +10 -0
  96. cognite/neat/_state_machine/_base.py +37 -0
  97. cognite/neat/_state_machine/_states.py +52 -0
  98. cognite/neat/_store/__init__.py +3 -0
  99. cognite/neat/_store/_provenance.py +71 -0
  100. cognite/neat/_store/_store.py +144 -0
  101. cognite/neat/_utils/_reader.py +194 -0
  102. cognite/neat/_utils/auxiliary.py +39 -0
  103. cognite/neat/_utils/collection.py +11 -0
  104. cognite/neat/_utils/http_client/__init__.py +39 -0
  105. cognite/neat/_utils/http_client/_client.py +245 -0
  106. cognite/neat/_utils/http_client/_config.py +19 -0
  107. cognite/neat/_utils/http_client/_data_classes.py +294 -0
  108. cognite/neat/_utils/http_client/_tracker.py +31 -0
  109. cognite/neat/_utils/text.py +71 -0
  110. cognite/neat/_utils/useful_types.py +37 -0
  111. cognite/neat/_utils/validation.py +149 -0
  112. cognite/neat/_version.py +2 -1
  113. cognite/neat/v0/core/__init__.py +0 -0
  114. cognite/neat/v0/core/_client/__init__.py +4 -0
  115. cognite/neat/v0/core/_client/_api/__init__.py +0 -0
  116. cognite/neat/v0/core/_client/_api/data_modeling_loaders.py +1032 -0
  117. cognite/neat/v0/core/_client/_api/neat_instances.py +101 -0
  118. cognite/neat/v0/core/_client/_api/schema.py +158 -0
  119. cognite/neat/v0/core/_client/_api/statistics.py +91 -0
  120. cognite/neat/v0/core/_client/_api_client.py +21 -0
  121. cognite/neat/v0/core/_client/data_classes/__init__.py +0 -0
  122. cognite/neat/v0/core/_client/data_classes/data_modeling.py +198 -0
  123. cognite/neat/v0/core/_client/data_classes/neat_sequence.py +261 -0
  124. cognite/neat/v0/core/_client/data_classes/schema.py +540 -0
  125. cognite/neat/v0/core/_client/data_classes/statistics.py +125 -0
  126. cognite/neat/v0/core/_client/testing.py +39 -0
  127. cognite/neat/v0/core/_config.py +11 -0
  128. cognite/neat/v0/core/_constants.py +278 -0
  129. cognite/neat/v0/core/_data_model/__init__.py +0 -0
  130. cognite/neat/v0/core/_data_model/_constants.py +210 -0
  131. cognite/neat/v0/core/_data_model/_shared.py +59 -0
  132. cognite/neat/v0/core/_data_model/analysis/__init__.py +3 -0
  133. cognite/neat/v0/core/_data_model/analysis/_base.py +578 -0
  134. cognite/neat/v0/core/_data_model/catalog/__init__.py +8 -0
  135. cognite/neat/v0/core/_data_model/catalog/classic_model.xlsx +0 -0
  136. cognite/neat/v0/core/_data_model/catalog/conceptual-imf-data-model.xlsx +0 -0
  137. cognite/neat/v0/core/_data_model/catalog/hello_world_pump.xlsx +0 -0
  138. cognite/neat/v0/core/_data_model/exporters/__init__.py +38 -0
  139. cognite/neat/v0/core/_data_model/exporters/_base.py +67 -0
  140. cognite/neat/v0/core/_data_model/exporters/_data_model2dms.py +428 -0
  141. cognite/neat/v0/core/_data_model/exporters/_data_model2excel.py +612 -0
  142. cognite/neat/v0/core/_data_model/exporters/_data_model2instance_template.py +158 -0
  143. cognite/neat/v0/core/_data_model/exporters/_data_model2semantic_model.py +646 -0
  144. cognite/neat/v0/core/_data_model/exporters/_data_model2yaml.py +84 -0
  145. cognite/neat/v0/core/_data_model/importers/__init__.py +49 -0
  146. cognite/neat/v0/core/_data_model/importers/_base.py +64 -0
  147. cognite/neat/v0/core/_data_model/importers/_base_file_reader.py +56 -0
  148. cognite/neat/v0/core/_data_model/importers/_dict2data_model.py +131 -0
  149. cognite/neat/v0/core/_data_model/importers/_dms2data_model.py +705 -0
  150. cognite/neat/v0/core/_data_model/importers/_graph2data_model.py +299 -0
  151. cognite/neat/v0/core/_data_model/importers/_rdf/__init__.py +4 -0
  152. cognite/neat/v0/core/_data_model/importers/_rdf/_base.py +161 -0
  153. cognite/neat/v0/core/_data_model/importers/_rdf/_inference2rdata_model.py +618 -0
  154. cognite/neat/v0/core/_data_model/importers/_rdf/_owl2data_model.py +124 -0
  155. cognite/neat/v0/core/_data_model/importers/_rdf/_shared.py +255 -0
  156. cognite/neat/v0/core/_data_model/importers/_spreadsheet2data_model.py +424 -0
  157. cognite/neat/v0/core/_data_model/models/__init__.py +38 -0
  158. cognite/neat/v0/core/_data_model/models/_base_unverified.py +181 -0
  159. cognite/neat/v0/core/_data_model/models/_base_verified.py +449 -0
  160. cognite/neat/v0/core/_data_model/models/_import_contexts.py +82 -0
  161. cognite/neat/v0/core/_data_model/models/_types.py +171 -0
  162. cognite/neat/v0/core/_data_model/models/conceptual/__init__.py +25 -0
  163. cognite/neat/v0/core/_data_model/models/conceptual/_unverified.py +193 -0
  164. cognite/neat/v0/core/_data_model/models/conceptual/_validation.py +308 -0
  165. cognite/neat/v0/core/_data_model/models/conceptual/_verified.py +327 -0
  166. cognite/neat/v0/core/_data_model/models/data_types.py +422 -0
  167. cognite/neat/v0/core/_data_model/models/entities/__init__.py +70 -0
  168. cognite/neat/v0/core/_data_model/models/entities/_constants.py +18 -0
  169. cognite/neat/v0/core/_data_model/models/entities/_loaders.py +155 -0
  170. cognite/neat/v0/core/_data_model/models/entities/_multi_value.py +83 -0
  171. cognite/neat/v0/core/_data_model/models/entities/_restrictions.py +230 -0
  172. cognite/neat/v0/core/_data_model/models/entities/_single_value.py +676 -0
  173. cognite/neat/v0/core/_data_model/models/entities/_types.py +103 -0
  174. cognite/neat/v0/core/_data_model/models/entities/_wrapped.py +217 -0
  175. cognite/neat/v0/core/_data_model/models/mapping/__init__.py +3 -0
  176. cognite/neat/v0/core/_data_model/models/mapping/_classic2core.py +39 -0
  177. cognite/neat/v0/core/_data_model/models/mapping/_classic2core.yaml +608 -0
  178. cognite/neat/v0/core/_data_model/models/physical/__init__.py +40 -0
  179. cognite/neat/v0/core/_data_model/models/physical/_exporter.py +658 -0
  180. cognite/neat/v0/core/_data_model/models/physical/_unverified.py +557 -0
  181. cognite/neat/v0/core/_data_model/models/physical/_validation.py +887 -0
  182. cognite/neat/v0/core/_data_model/models/physical/_verified.py +667 -0
  183. cognite/neat/v0/core/_data_model/transformers/__init__.py +70 -0
  184. cognite/neat/v0/core/_data_model/transformers/_base.py +79 -0
  185. cognite/neat/v0/core/_data_model/transformers/_converters.py +2485 -0
  186. cognite/neat/v0/core/_data_model/transformers/_mapping.py +390 -0
  187. cognite/neat/v0/core/_data_model/transformers/_union_conceptual.py +208 -0
  188. cognite/neat/v0/core/_data_model/transformers/_verification.py +120 -0
  189. cognite/neat/v0/core/_instances/__init__.py +0 -0
  190. cognite/neat/v0/core/_instances/_shared.py +37 -0
  191. cognite/neat/v0/core/_instances/_tracking/__init__.py +4 -0
  192. cognite/neat/v0/core/_instances/_tracking/base.py +30 -0
  193. cognite/neat/v0/core/_instances/_tracking/log.py +27 -0
  194. cognite/neat/v0/core/_instances/extractors/__init__.py +76 -0
  195. cognite/neat/v0/core/_instances/extractors/_base.py +58 -0
  196. cognite/neat/v0/core/_instances/extractors/_classic_cdf/__init__.py +0 -0
  197. cognite/neat/v0/core/_instances/extractors/_classic_cdf/_assets.py +37 -0
  198. cognite/neat/v0/core/_instances/extractors/_classic_cdf/_base.py +443 -0
  199. cognite/neat/v0/core/_instances/extractors/_classic_cdf/_classic.py +479 -0
  200. cognite/neat/v0/core/_instances/extractors/_classic_cdf/_data_sets.py +35 -0
  201. cognite/neat/v0/core/_instances/extractors/_classic_cdf/_events.py +33 -0
  202. cognite/neat/v0/core/_instances/extractors/_classic_cdf/_files.py +45 -0
  203. cognite/neat/v0/core/_instances/extractors/_classic_cdf/_labels.py +54 -0
  204. cognite/neat/v0/core/_instances/extractors/_classic_cdf/_relationships.py +122 -0
  205. cognite/neat/v0/core/_instances/extractors/_classic_cdf/_sequences.py +280 -0
  206. cognite/neat/v0/core/_instances/extractors/_classic_cdf/_timeseries.py +48 -0
  207. cognite/neat/v0/core/_instances/extractors/_dict.py +105 -0
  208. cognite/neat/v0/core/_instances/extractors/_dms.py +315 -0
  209. cognite/neat/v0/core/_instances/extractors/_dms_graph.py +238 -0
  210. cognite/neat/v0/core/_instances/extractors/_mock_graph_generator.py +404 -0
  211. cognite/neat/v0/core/_instances/extractors/_raw.py +67 -0
  212. cognite/neat/v0/core/_instances/extractors/_rdf_file.py +80 -0
  213. cognite/neat/v0/core/_instances/loaders/__init__.py +24 -0
  214. cognite/neat/v0/core/_instances/loaders/_base.py +116 -0
  215. cognite/neat/v0/core/_instances/loaders/_rdf2dms.py +649 -0
  216. cognite/neat/v0/core/_instances/loaders/_rdf_to_instance_space.py +249 -0
  217. cognite/neat/v0/core/_instances/queries/__init__.py +3 -0
  218. cognite/neat/v0/core/_instances/queries/_base.py +16 -0
  219. cognite/neat/v0/core/_instances/queries/_queries.py +16 -0
  220. cognite/neat/v0/core/_instances/queries/_select.py +478 -0
  221. cognite/neat/v0/core/_instances/queries/_update.py +37 -0
  222. cognite/neat/v0/core/_instances/transformers/__init__.py +65 -0
  223. cognite/neat/v0/core/_instances/transformers/_base.py +133 -0
  224. cognite/neat/v0/core/_instances/transformers/_classic_cdf.py +589 -0
  225. cognite/neat/v0/core/_instances/transformers/_prune_graph.py +315 -0
  226. cognite/neat/v0/core/_instances/transformers/_rdfpath.py +84 -0
  227. cognite/neat/v0/core/_instances/transformers/_value_type.py +366 -0
  228. cognite/neat/v0/core/_issues/__init__.py +21 -0
  229. cognite/neat/v0/core/_issues/_base.py +348 -0
  230. cognite/neat/v0/core/_issues/_contextmanagers.py +50 -0
  231. cognite/neat/v0/core/_issues/_factory.py +69 -0
  232. cognite/neat/v0/core/_issues/errors/__init__.py +90 -0
  233. cognite/neat/v0/core/_issues/errors/_external.py +91 -0
  234. cognite/neat/v0/core/_issues/errors/_general.py +51 -0
  235. cognite/neat/v0/core/_issues/errors/_properties.py +80 -0
  236. cognite/neat/v0/core/_issues/errors/_resources.py +116 -0
  237. cognite/neat/v0/core/_issues/errors/_wrapper.py +93 -0
  238. cognite/neat/{rules/issues → v0/core/_issues}/formatters.py +12 -10
  239. cognite/neat/v0/core/_issues/warnings/__init__.py +99 -0
  240. cognite/neat/v0/core/_issues/warnings/_external.py +56 -0
  241. cognite/neat/v0/core/_issues/warnings/_general.py +46 -0
  242. cognite/neat/v0/core/_issues/warnings/_models.py +165 -0
  243. cognite/neat/v0/core/_issues/warnings/_properties.py +108 -0
  244. cognite/neat/v0/core/_issues/warnings/_resources.py +110 -0
  245. cognite/neat/v0/core/_issues/warnings/user_modeling.py +125 -0
  246. cognite/neat/v0/core/_shared.py +77 -0
  247. cognite/neat/v0/core/_store/__init__.py +4 -0
  248. cognite/neat/v0/core/_store/_data_model.py +487 -0
  249. cognite/neat/v0/core/_store/_instance.py +485 -0
  250. cognite/neat/v0/core/_store/_provenance.py +217 -0
  251. cognite/neat/v0/core/_store/exceptions.py +59 -0
  252. cognite/neat/v0/core/_utils/__init__.py +0 -0
  253. cognite/neat/v0/core/_utils/auth.py +364 -0
  254. cognite/neat/v0/core/_utils/auxiliary.py +169 -0
  255. cognite/neat/v0/core/_utils/collection_.py +66 -0
  256. cognite/neat/v0/core/_utils/graph_transformations_report.py +36 -0
  257. cognite/neat/v0/core/_utils/io_.py +11 -0
  258. cognite/neat/v0/core/_utils/rdf_.py +336 -0
  259. cognite/neat/v0/core/_utils/reader/__init__.py +3 -0
  260. cognite/neat/v0/core/_utils/reader/_base.py +194 -0
  261. cognite/neat/v0/core/_utils/spreadsheet.py +182 -0
  262. cognite/neat/v0/core/_utils/tarjan.py +44 -0
  263. cognite/neat/v0/core/_utils/text.py +277 -0
  264. cognite/neat/v0/core/_utils/time_.py +17 -0
  265. cognite/neat/v0/core/_utils/upload.py +134 -0
  266. cognite/neat/v0/core/_utils/xml_.py +52 -0
  267. cognite/neat/v0/plugins/__init__.py +4 -0
  268. cognite/neat/v0/plugins/_base.py +9 -0
  269. cognite/neat/v0/plugins/_data_model.py +48 -0
  270. cognite/neat/v0/plugins/_issues.py +35 -0
  271. cognite/neat/v0/plugins/_manager.py +94 -0
  272. cognite/neat/v0/session/__init__.py +3 -0
  273. cognite/neat/v0/session/_base.py +332 -0
  274. cognite/neat/v0/session/_collector.py +131 -0
  275. cognite/neat/v0/session/_diff.py +51 -0
  276. cognite/neat/v0/session/_drop.py +103 -0
  277. cognite/neat/v0/session/_experimental.py +26 -0
  278. cognite/neat/v0/session/_explore.py +39 -0
  279. cognite/neat/v0/session/_fix.py +28 -0
  280. cognite/neat/v0/session/_inspect.py +285 -0
  281. cognite/neat/v0/session/_mapping.py +71 -0
  282. cognite/neat/v0/session/_plugin.py +66 -0
  283. cognite/neat/v0/session/_prepare.py +286 -0
  284. cognite/neat/v0/session/_read.py +923 -0
  285. cognite/neat/v0/session/_set.py +101 -0
  286. cognite/neat/v0/session/_show.py +298 -0
  287. cognite/neat/v0/session/_state/README.md +23 -0
  288. cognite/neat/v0/session/_state.py +161 -0
  289. cognite/neat/v0/session/_subset.py +88 -0
  290. cognite/neat/v0/session/_template.py +208 -0
  291. cognite/neat/v0/session/_to.py +454 -0
  292. cognite/neat/v0/session/_wizard.py +44 -0
  293. cognite/neat/v0/session/engine/__init__.py +4 -0
  294. cognite/neat/v0/session/engine/_import.py +7 -0
  295. cognite/neat/v0/session/engine/_interface.py +25 -0
  296. cognite/neat/v0/session/engine/_load.py +131 -0
  297. cognite/neat/v0/session/exceptions.py +103 -0
  298. cognite/neat/v1.py +3 -0
  299. cognite_neat-0.127.19.dist-info/METADATA +145 -0
  300. cognite_neat-0.127.19.dist-info/RECORD +318 -0
  301. {cognite_neat-0.70.1.dist-info → cognite_neat-0.127.19.dist-info}/WHEEL +1 -1
  302. cognite/neat/app/api/asgi/metrics.py +0 -4
  303. cognite/neat/app/api/configuration.py +0 -110
  304. cognite/neat/app/api/context_manager/__init__.py +0 -3
  305. cognite/neat/app/api/context_manager/manager.py +0 -16
  306. cognite/neat/app/api/data_classes/configuration.py +0 -121
  307. cognite/neat/app/api/data_classes/rest.py +0 -78
  308. cognite/neat/app/api/explorer.py +0 -64
  309. cognite/neat/app/api/routers/configuration.py +0 -24
  310. cognite/neat/app/api/routers/core.py +0 -51
  311. cognite/neat/app/api/routers/crud.py +0 -112
  312. cognite/neat/app/api/routers/data_exploration.py +0 -334
  313. cognite/neat/app/api/routers/metrics.py +0 -10
  314. cognite/neat/app/api/routers/rules.py +0 -169
  315. cognite/neat/app/api/routers/workflows.py +0 -274
  316. cognite/neat/app/api/utils/data_mapping.py +0 -17
  317. cognite/neat/app/api/utils/logging.py +0 -26
  318. cognite/neat/app/api/utils/query_templates.py +0 -92
  319. cognite/neat/app/main.py +0 -17
  320. cognite/neat/app/monitoring/metrics.py +0 -69
  321. cognite/neat/app/ui/index.html +0 -1
  322. cognite/neat/app/ui/neat-app/.gitignore +0 -23
  323. cognite/neat/app/ui/neat-app/README.md +0 -70
  324. cognite/neat/app/ui/neat-app/build/asset-manifest.json +0 -14
  325. cognite/neat/app/ui/neat-app/build/favicon.ico +0 -0
  326. cognite/neat/app/ui/neat-app/build/index.html +0 -1
  327. cognite/neat/app/ui/neat-app/build/logo192.png +0 -0
  328. cognite/neat/app/ui/neat-app/build/manifest.json +0 -25
  329. cognite/neat/app/ui/neat-app/build/robots.txt +0 -3
  330. cognite/neat/app/ui/neat-app/build/static/css/main.38a62222.css +0 -2
  331. cognite/neat/app/ui/neat-app/build/static/css/main.38a62222.css.map +0 -1
  332. cognite/neat/app/ui/neat-app/build/static/js/main.ed960141.js +0 -3
  333. cognite/neat/app/ui/neat-app/build/static/js/main.ed960141.js.LICENSE.txt +0 -97
  334. cognite/neat/app/ui/neat-app/build/static/js/main.ed960141.js.map +0 -1
  335. cognite/neat/app/ui/neat-app/build/static/media/logo.8093b84df9ed36a174c629d6fe0b730d.svg +0 -1
  336. cognite/neat/config.py +0 -46
  337. cognite/neat/constants.py +0 -36
  338. cognite/neat/exceptions.py +0 -139
  339. cognite/neat/graph/__init__.py +0 -3
  340. cognite/neat/graph/exceptions.py +0 -91
  341. cognite/neat/graph/extractor/__init__.py +0 -6
  342. cognite/neat/graph/extractor/_base.py +0 -14
  343. cognite/neat/graph/extractor/_dexpi.py +0 -306
  344. cognite/neat/graph/extractor/_graph_capturing_sheet.py +0 -401
  345. cognite/neat/graph/extractor/_mock_graph_generator.py +0 -359
  346. cognite/neat/graph/extractors/_base.py +0 -14
  347. cognite/neat/graph/extractors/_mock_graph_generator.py +0 -359
  348. cognite/neat/graph/loader/__init__.py +0 -23
  349. cognite/neat/graph/loader/_asset_loader.py +0 -516
  350. cognite/neat/graph/loader/_base.py +0 -69
  351. cognite/neat/graph/loader/_exceptions.py +0 -87
  352. cognite/neat/graph/loader/core/labels.py +0 -58
  353. cognite/neat/graph/loader/core/models.py +0 -136
  354. cognite/neat/graph/loader/core/rdf_to_assets.py +0 -1047
  355. cognite/neat/graph/loader/core/rdf_to_relationships.py +0 -558
  356. cognite/neat/graph/loader/rdf_to_dms.py +0 -309
  357. cognite/neat/graph/loader/validator.py +0 -87
  358. cognite/neat/graph/models.py +0 -6
  359. cognite/neat/graph/stores/__init__.py +0 -13
  360. cognite/neat/graph/stores/_base.py +0 -384
  361. cognite/neat/graph/stores/_graphdb_store.py +0 -51
  362. cognite/neat/graph/stores/_memory_store.py +0 -43
  363. cognite/neat/graph/stores/_oxigraph_store.py +0 -145
  364. cognite/neat/graph/stores/_oxrdflib.py +0 -247
  365. cognite/neat/graph/stores/_rdf_to_graph.py +0 -40
  366. cognite/neat/graph/transformation/entity_matcher.py +0 -101
  367. cognite/neat/graph/transformation/query_generator/__init__.py +0 -3
  368. cognite/neat/graph/transformation/query_generator/sparql.py +0 -540
  369. cognite/neat/graph/transformation/transformer.py +0 -316
  370. cognite/neat/rules/_analysis/_base.py +0 -25
  371. cognite/neat/rules/_analysis/_information_rules.py +0 -414
  372. cognite/neat/rules/_shared.py +0 -5
  373. cognite/neat/rules/analysis.py +0 -231
  374. cognite/neat/rules/examples/Rules-Nordic44-to-TNT.xlsx +0 -0
  375. cognite/neat/rules/examples/Rules-Nordic44-to-graphql.xlsx +0 -0
  376. cognite/neat/rules/examples/__init__.py +0 -18
  377. cognite/neat/rules/examples/power-grid-containers.yaml +0 -113
  378. cognite/neat/rules/examples/power-grid-example.xlsx +0 -0
  379. cognite/neat/rules/examples/power-grid-model.yaml +0 -213
  380. cognite/neat/rules/examples/rules-template.xlsx +0 -0
  381. cognite/neat/rules/examples/sheet2cdf-transformation-rules.xlsx +0 -0
  382. cognite/neat/rules/examples/skos-rules.xlsx +0 -0
  383. cognite/neat/rules/examples/source-to-solution-mapping-rules.xlsx +0 -0
  384. cognite/neat/rules/examples/wind-energy.owl +0 -1511
  385. cognite/neat/rules/exceptions.py +0 -2972
  386. cognite/neat/rules/exporter/__init__.py +0 -20
  387. cognite/neat/rules/exporter/_base.py +0 -45
  388. cognite/neat/rules/exporter/_core/__init__.py +0 -5
  389. cognite/neat/rules/exporter/_core/rules2labels.py +0 -24
  390. cognite/neat/rules/exporter/_rules2dms.py +0 -888
  391. cognite/neat/rules/exporter/_rules2excel.py +0 -212
  392. cognite/neat/rules/exporter/_rules2graphql.py +0 -183
  393. cognite/neat/rules/exporter/_rules2ontology.py +0 -523
  394. cognite/neat/rules/exporter/_rules2pydantic_models.py +0 -748
  395. cognite/neat/rules/exporter/_rules2rules.py +0 -104
  396. cognite/neat/rules/exporter/_rules2triples.py +0 -37
  397. cognite/neat/rules/exporter/_validation.py +0 -150
  398. cognite/neat/rules/exporters/__init__.py +0 -15
  399. cognite/neat/rules/exporters/_base.py +0 -42
  400. cognite/neat/rules/exporters/_models.py +0 -58
  401. cognite/neat/rules/exporters/_rules2dms.py +0 -259
  402. cognite/neat/rules/exporters/_rules2excel.py +0 -196
  403. cognite/neat/rules/exporters/_rules2ontology.py +0 -561
  404. cognite/neat/rules/exporters/_rules2yaml.py +0 -78
  405. cognite/neat/rules/exporters/_validation.py +0 -107
  406. cognite/neat/rules/importer/__init__.py +0 -22
  407. cognite/neat/rules/importer/_base.py +0 -70
  408. cognite/neat/rules/importer/_dict2rules.py +0 -158
  409. cognite/neat/rules/importer/_dms2rules.py +0 -196
  410. cognite/neat/rules/importer/_graph2rules.py +0 -304
  411. cognite/neat/rules/importer/_json2rules.py +0 -39
  412. cognite/neat/rules/importer/_owl2rules/__init__.py +0 -3
  413. cognite/neat/rules/importer/_owl2rules/_owl2classes.py +0 -239
  414. cognite/neat/rules/importer/_owl2rules/_owl2metadata.py +0 -255
  415. cognite/neat/rules/importer/_owl2rules/_owl2properties.py +0 -217
  416. cognite/neat/rules/importer/_owl2rules/_owl2rules.py +0 -290
  417. cognite/neat/rules/importer/_spreadsheet2rules.py +0 -45
  418. cognite/neat/rules/importer/_xsd2rules.py +0 -20
  419. cognite/neat/rules/importer/_yaml2rules.py +0 -39
  420. cognite/neat/rules/importers/__init__.py +0 -16
  421. cognite/neat/rules/importers/_base.py +0 -124
  422. cognite/neat/rules/importers/_dms2rules.py +0 -191
  423. cognite/neat/rules/importers/_dtdl2rules/__init__.py +0 -3
  424. cognite/neat/rules/importers/_dtdl2rules/_unit_lookup.py +0 -224
  425. cognite/neat/rules/importers/_dtdl2rules/dtdl_converter.py +0 -318
  426. cognite/neat/rules/importers/_dtdl2rules/dtdl_importer.py +0 -164
  427. cognite/neat/rules/importers/_dtdl2rules/spec.py +0 -359
  428. cognite/neat/rules/importers/_owl2rules/__init__.py +0 -3
  429. cognite/neat/rules/importers/_owl2rules/_owl2classes.py +0 -219
  430. cognite/neat/rules/importers/_owl2rules/_owl2metadata.py +0 -217
  431. cognite/neat/rules/importers/_owl2rules/_owl2properties.py +0 -203
  432. cognite/neat/rules/importers/_owl2rules/_owl2rules.py +0 -148
  433. cognite/neat/rules/importers/_spreadsheet2rules.py +0 -266
  434. cognite/neat/rules/importers/_yaml2rules.py +0 -110
  435. cognite/neat/rules/issues/__init__.py +0 -27
  436. cognite/neat/rules/issues/base.py +0 -190
  437. cognite/neat/rules/issues/dms.py +0 -331
  438. cognite/neat/rules/issues/fileread.py +0 -156
  439. cognite/neat/rules/issues/importing.py +0 -220
  440. cognite/neat/rules/issues/spreadsheet.py +0 -381
  441. cognite/neat/rules/issues/spreadsheet_file.py +0 -151
  442. cognite/neat/rules/models/__init__.py +0 -5
  443. cognite/neat/rules/models/_base.py +0 -151
  444. cognite/neat/rules/models/_rules/__init__.py +0 -14
  445. cognite/neat/rules/models/_rules/_types/__init__.py +0 -66
  446. cognite/neat/rules/models/_rules/_types/_base.py +0 -450
  447. cognite/neat/rules/models/_rules/_types/_field.py +0 -339
  448. cognite/neat/rules/models/_rules/_types/_value.py +0 -156
  449. cognite/neat/rules/models/_rules/base.py +0 -320
  450. cognite/neat/rules/models/_rules/dms_architect_rules.py +0 -1034
  451. cognite/neat/rules/models/_rules/dms_schema.py +0 -641
  452. cognite/neat/rules/models/_rules/domain_rules.py +0 -55
  453. cognite/neat/rules/models/_rules/information_rules.py +0 -525
  454. cognite/neat/rules/models/raw_rules.py +0 -304
  455. cognite/neat/rules/models/rdfpath.py +0 -238
  456. cognite/neat/rules/models/rules.py +0 -1269
  457. cognite/neat/rules/models/tables.py +0 -9
  458. cognite/neat/rules/models/value_types.py +0 -117
  459. cognite/neat/utils/__init__.py +0 -3
  460. cognite/neat/utils/auxiliary.py +0 -11
  461. cognite/neat/utils/cdf.py +0 -24
  462. cognite/neat/utils/cdf_loaders/__init__.py +0 -25
  463. cognite/neat/utils/cdf_loaders/_base.py +0 -62
  464. cognite/neat/utils/cdf_loaders/_data_modeling.py +0 -275
  465. cognite/neat/utils/cdf_loaders/_ingestion.py +0 -152
  466. cognite/neat/utils/cdf_loaders/data_classes.py +0 -121
  467. cognite/neat/utils/exceptions.py +0 -41
  468. cognite/neat/utils/spreadsheet.py +0 -84
  469. cognite/neat/utils/text.py +0 -104
  470. cognite/neat/utils/utils.py +0 -354
  471. cognite/neat/utils/xml.py +0 -37
  472. cognite/neat/workflows/__init__.py +0 -12
  473. cognite/neat/workflows/_exceptions.py +0 -41
  474. cognite/neat/workflows/base.py +0 -574
  475. cognite/neat/workflows/cdf_store.py +0 -393
  476. cognite/neat/workflows/examples/Export DMS/workflow.yaml +0 -89
  477. cognite/neat/workflows/examples/Export Rules to Ontology/workflow.yaml +0 -152
  478. cognite/neat/workflows/examples/Extract DEXPI Graph and Export Rules/workflow.yaml +0 -139
  479. cognite/neat/workflows/examples/Extract RDF Graph and Generate Assets/workflow.yaml +0 -270
  480. cognite/neat/workflows/examples/Import DMS/workflow.yaml +0 -65
  481. cognite/neat/workflows/examples/Ontology to Data Model/workflow.yaml +0 -116
  482. cognite/neat/workflows/examples/Validate Rules/workflow.yaml +0 -67
  483. cognite/neat/workflows/examples/Validate Solution Model/workflow.yaml +0 -64
  484. cognite/neat/workflows/examples/Visualize Data Model Using Mock Graph/workflow.yaml +0 -95
  485. cognite/neat/workflows/examples/Visualize Semantic Data Model/workflow.yaml +0 -111
  486. cognite/neat/workflows/manager.py +0 -309
  487. cognite/neat/workflows/migration/steps.py +0 -93
  488. cognite/neat/workflows/migration/wf_manifests.py +0 -33
  489. cognite/neat/workflows/model.py +0 -202
  490. cognite/neat/workflows/steps/data_contracts.py +0 -140
  491. cognite/neat/workflows/steps/lib/__init__.py +0 -7
  492. cognite/neat/workflows/steps/lib/graph_extractor.py +0 -123
  493. cognite/neat/workflows/steps/lib/graph_loader.py +0 -68
  494. cognite/neat/workflows/steps/lib/graph_store.py +0 -139
  495. cognite/neat/workflows/steps/lib/io_steps.py +0 -393
  496. cognite/neat/workflows/steps/lib/rules_exporter.py +0 -453
  497. cognite/neat/workflows/steps/lib/rules_importer.py +0 -171
  498. cognite/neat/workflows/steps/lib/rules_validator.py +0 -102
  499. cognite/neat/workflows/steps/lib/v1/__init__.py +0 -7
  500. cognite/neat/workflows/steps/lib/v1/graph_contextualization.py +0 -82
  501. cognite/neat/workflows/steps/lib/v1/graph_extractor.py +0 -644
  502. cognite/neat/workflows/steps/lib/v1/graph_loader.py +0 -606
  503. cognite/neat/workflows/steps/lib/v1/graph_store.py +0 -278
  504. cognite/neat/workflows/steps/lib/v1/graph_transformer.py +0 -58
  505. cognite/neat/workflows/steps/lib/v1/rules_exporter.py +0 -513
  506. cognite/neat/workflows/steps/lib/v1/rules_importer.py +0 -612
  507. cognite/neat/workflows/steps/step_model.py +0 -83
  508. cognite/neat/workflows/steps_registry.py +0 -212
  509. cognite/neat/workflows/tasks.py +0 -18
  510. cognite/neat/workflows/triggers.py +0 -169
  511. cognite/neat/workflows/utils.py +0 -19
  512. cognite_neat-0.70.1.dist-info/METADATA +0 -212
  513. cognite_neat-0.70.1.dist-info/RECORD +0 -234
  514. cognite_neat-0.70.1.dist-info/entry_points.txt +0 -3
  515. /cognite/neat/{app/api → _data_model}/__init__.py +0 -0
  516. /cognite/neat/{app/api/data_classes → _data_model/deployer}/__init__.py +0 -0
  517. /cognite/neat/{app/api/utils → _data_model/exporters/_table_exporter}/__init__.py +0 -0
  518. /cognite/neat/{app/monitoring → _data_model/importers/_table_importer}/__init__.py +0 -0
  519. /cognite/neat/{graph/extractors → _data_model/models}/__init__.py +0 -0
  520. /cognite/neat/{graph/loader/core → _data_model/models/conceptual}/__init__.py +0 -0
  521. /cognite/neat/{graph/transformation → _data_model/validation}/__init__.py +0 -0
  522. /cognite/neat/{rules → _session/_html}/__init__.py +0 -0
  523. /cognite/neat/{rules/_analysis → _session/_usage_analytics}/__init__.py +0 -0
  524. /cognite/neat/{workflows/migration → _utils}/__init__.py +0 -0
  525. /cognite/neat/{workflows/steps → v0}/__init__.py +0 -0
  526. /cognite/neat/{graph → v0/core/_instances}/examples/Knowledge-Graph-Nordic44-dirty.xml +0 -0
  527. /cognite/neat/{graph → v0/core/_instances}/examples/Knowledge-Graph-Nordic44.xml +0 -0
  528. /cognite/neat/{graph → v0/core/_instances}/examples/__init__.py +0 -0
  529. /cognite/neat/{graph → v0/core/_instances}/examples/skos-capturing-sheet-wind-topics.xlsx +0 -0
  530. {cognite_neat-0.70.1.dist-info → cognite_neat-0.127.19.dist-info/licenses}/LICENSE +0 -0
@@ -0,0 +1,646 @@
1
+ import sys
2
+ import warnings
3
+ from abc import ABC
4
+ from pathlib import Path
5
+ from typing import Any, ClassVar
6
+
7
+ from pydantic import BaseModel, ConfigDict, ValidationInfo, field_validator
8
+ from rdflib import DCTERMS, OWL, RDF, RDFS, XSD, BNode, Graph, Literal, Namespace, URIRef
9
+ from rdflib.collection import Collection as GraphCollection
10
+
11
+ from cognite.neat.v0.core._constants import DEFAULT_NAMESPACE as NEAT_NAMESPACE
12
+ from cognite.neat.v0.core._data_model._constants import EntityTypes
13
+ from cognite.neat.v0.core._data_model.analysis import DataModelAnalysis
14
+ from cognite.neat.v0.core._data_model.models.conceptual import (
15
+ Concept,
16
+ ConceptualDataModel,
17
+ ConceptualMetadata,
18
+ ConceptualProperty,
19
+ )
20
+ from cognite.neat.v0.core._data_model.models.data_types import DataType
21
+ from cognite.neat.v0.core._data_model.models.entities import ConceptEntity
22
+ from cognite.neat.v0.core._issues.errors import (
23
+ PropertyDefinitionDuplicatedError,
24
+ )
25
+ from cognite.neat.v0.core._issues.warnings import PropertyDefinitionDuplicatedWarning
26
+ from cognite.neat.v0.core._utils.rdf_ import remove_namespace_from_uri
27
+
28
+ from ._base import BaseExporter
29
+
30
+ if sys.version_info >= (3, 11):
31
+ from typing import Self
32
+ else:
33
+ from typing_extensions import Self
34
+
35
+ SHACL = Namespace("http://www.w3.org/ns/shacl#")
36
+
37
+
38
+ class GraphExporter(BaseExporter[ConceptualDataModel, Graph], ABC):
39
+ def export_to_file(self, data_model: ConceptualDataModel, filepath: Path) -> None:
40
+ self.export(data_model).serialize(destination=filepath, encoding=self._encoding, newline=self._new_line)
41
+
42
+
43
+ class OWLExporter(GraphExporter):
44
+ """Exports verified conceptual data model to an OWL ontology."""
45
+
46
+ def export(self, data_model: ConceptualDataModel) -> Graph:
47
+ return Ontology.from_data_model(data_model).graph
48
+
49
+ @property
50
+ def description(self) -> str:
51
+ return "Export verified conceptual data model to OWL."
52
+
53
+
54
+ class SHACLExporter(GraphExporter):
55
+ """Exports data_model to a SHACL graph."""
56
+
57
+ def export(self, data_model: ConceptualDataModel) -> Graph:
58
+ return ShaclShapes.from_data_model(data_model).graph
59
+
60
+ @property
61
+ def description(self) -> str:
62
+ return "Export verified conceptual data model to SHACL."
63
+
64
+
65
+ class _ModelConfig(BaseModel):
66
+ model_config: ClassVar[ConfigDict] = ConfigDict(arbitrary_types_allowed=True, strict=False, extra="allow")
67
+
68
+
69
+ class Ontology(_ModelConfig):
70
+ """
71
+ Represents an ontology. This class is used to generate an OWL ontology from conceptual data model.
72
+
73
+ Args:
74
+ properties: A list of OWL properties.
75
+ classes: A list of OWL classes.
76
+ metadata: Metadata about the ontology.
77
+ prefixes: A dictionary of prefixes and namespaces.
78
+ """
79
+
80
+ metadata: "OWLMetadata"
81
+ properties: list["OWLProperty"]
82
+ classes: list["OWLClass"]
83
+ prefixes: dict[str, Namespace]
84
+
85
+ @classmethod
86
+ def from_data_model(cls, data_model: ConceptualDataModel) -> Self:
87
+ """
88
+ Generates an ontology from a set of transformation data_model.
89
+
90
+ Args:
91
+ data_model: The data_model to generate the ontology from.
92
+
93
+ Returns:
94
+ An instance of Ontology.
95
+ """
96
+ analysis = DataModelAnalysis(data_model)
97
+ return cls(
98
+ properties=[
99
+ OWLProperty.from_list_of_properties(definition, data_model.metadata.namespace)
100
+ for definition in analysis.property_by_id().values()
101
+ ],
102
+ classes=[
103
+ OWLClass.from_concept(definition, data_model.metadata.namespace, data_model.prefixes)
104
+ for definition in data_model.concepts
105
+ ],
106
+ metadata=OWLMetadata(**data_model.metadata.model_dump()),
107
+ prefixes=data_model.prefixes,
108
+ )
109
+
110
+ @property
111
+ def graph(self) -> Graph:
112
+ """
113
+ Generates an OWL graph from the ontology.
114
+
115
+ Returns:
116
+ An OWL graph.
117
+ """
118
+ owl = Graph()
119
+ owl.bind(self.metadata.prefix, self.metadata.namespace)
120
+ for prefix, namespace in self.prefixes.items():
121
+ owl.bind(prefix, namespace)
122
+
123
+ owl.add((URIRef(self.metadata.namespace), RDF.type, OWL.Ontology))
124
+ for property_ in self.properties:
125
+ for triple in property_.triples:
126
+ owl.add(triple) # type: ignore[arg-type]
127
+
128
+ for class_ in self.classes:
129
+ for triple in class_.triples:
130
+ owl.add(triple) # type: ignore[arg-type]
131
+
132
+ for triple in self.metadata.triples:
133
+ owl.add(triple) # type: ignore[arg-type]
134
+
135
+ return owl
136
+
137
+
138
+ class OWLMetadata(ConceptualMetadata):
139
+ @property
140
+ def triples(self) -> list[tuple]:
141
+ # Mandatory triples originating from Metadata mandatory fields
142
+ triples: list[tuple] = [
143
+ (URIRef(self.namespace), DCTERMS.hasVersion, Literal(self.version)),
144
+ (URIRef(self.namespace), OWL.versionInfo, Literal(self.version)),
145
+ (URIRef(self.namespace), RDFS.label, Literal(self.name)),
146
+ (URIRef(self.namespace), NEAT_NAMESPACE.prefix, Literal(self.prefix)),
147
+ (URIRef(self.namespace), DCTERMS.title, Literal(self.name)),
148
+ (URIRef(self.namespace), DCTERMS.created, Literal(self.created, datatype=XSD.dateTime)),
149
+ (URIRef(self.namespace), DCTERMS.description, Literal(self.description)),
150
+ ]
151
+ if isinstance(self.creator, list):
152
+ triples.extend([(URIRef(self.namespace), DCTERMS.creator, Literal(creator)) for creator in self.creator])
153
+ else:
154
+ triples.append((URIRef(self.namespace), DCTERMS.creator, Literal(self.creator)))
155
+
156
+ # Optional triples originating from Metadata optional fields
157
+ if self.updated:
158
+ triples.append((URIRef(self.namespace), DCTERMS.modified, Literal(self.updated, datatype=XSD.dateTime)))
159
+
160
+ return triples
161
+
162
+
163
+ class OWLClass(_ModelConfig):
164
+ id_: URIRef
165
+ type_: URIRef = OWL.Class
166
+ label: str | None
167
+ comment: str | None
168
+ sub_class_of: list[URIRef] | None
169
+ namespace: Namespace
170
+
171
+ @classmethod
172
+ def from_concept(cls, definition: Concept, namespace: Namespace, prefixes: dict) -> Self:
173
+ if definition.implements and isinstance(definition.implements, list):
174
+ sub_class_of = []
175
+ for parent_class in definition.implements:
176
+ try:
177
+ sub_class_of.append(prefixes[str(parent_class.prefix)][str(parent_class.suffix)])
178
+ except KeyError:
179
+ sub_class_of.append(namespace[str(parent_class.suffix)])
180
+ else:
181
+ sub_class_of = None
182
+
183
+ return cls(
184
+ id_=namespace[str(definition.concept.suffix)],
185
+ label=definition.name if definition.name else None,
186
+ comment=definition.description,
187
+ sub_class_of=sub_class_of,
188
+ namespace=namespace,
189
+ )
190
+
191
+ @property
192
+ def type_triples(self) -> list[tuple]:
193
+ return [(self.id_, RDF.type, self.type_)]
194
+
195
+ @property
196
+ def label_triples(self) -> list[tuple]:
197
+ if self.label:
198
+ return [(self.id_, RDFS.label, Literal(self.label))]
199
+ else: # If comment is None, return empty list
200
+ return []
201
+
202
+ @property
203
+ def title_triples(self) -> list[tuple]:
204
+ if self.label:
205
+ return [
206
+ (
207
+ self.id_,
208
+ DCTERMS.title,
209
+ Literal(f"{remove_namespace_from_uri(self.id_)} - {self.label}"),
210
+ )
211
+ ]
212
+ else:
213
+ return []
214
+
215
+ @property
216
+ def comment_triples(self) -> list[tuple]:
217
+ if self.comment:
218
+ return [(self.id_, RDFS.comment, Literal(self.comment))]
219
+ else: # If comment is None, return empty list
220
+ return []
221
+
222
+ @property
223
+ def subclass_triples(self) -> list[tuple]:
224
+ if self.sub_class_of:
225
+ return [(self.id_, RDFS.subClassOf, sub_class_of) for sub_class_of in self.sub_class_of]
226
+ else:
227
+ return []
228
+
229
+ @property
230
+ def triples(self) -> list[tuple]:
231
+ return (
232
+ self.type_triples + self.label_triples + self.title_triples + self.comment_triples + self.subclass_triples
233
+ )
234
+
235
+
236
+ class OWLProperty(_ModelConfig):
237
+ id_: URIRef
238
+ type_: set[URIRef]
239
+ label: set[str]
240
+ comment: set[str]
241
+ domain: set[URIRef]
242
+ range_: set[URIRef]
243
+ namespace: Namespace
244
+
245
+ @classmethod
246
+ def from_list_of_properties(cls, definitions: list[ConceptualProperty], namespace: Namespace) -> "OWLProperty":
247
+ """Here list of properties is a list of properties with the same id, but different definitions."""
248
+ property_ids = {definition.property_ for definition in definitions}
249
+ if len(property_ids) != 1:
250
+ raise PropertyDefinitionDuplicatedError(
251
+ definitions[0].concept,
252
+ "class",
253
+ definitions[0].property_,
254
+ frozenset(property_ids),
255
+ )
256
+
257
+ owl_property = cls.model_construct(
258
+ id_=namespace[definitions[0].property_],
259
+ namespace=namespace,
260
+ label=set(),
261
+ comment=set(),
262
+ domain=set(),
263
+ range_=set(),
264
+ type_=set(),
265
+ )
266
+ for definition in definitions:
267
+ owl_property.type_.add(OWL[definition.type_])
268
+
269
+ if isinstance(definition.value_type, DataType):
270
+ owl_property.range_.add(XSD[definition.value_type.xsd])
271
+ elif isinstance(definition.value_type, ConceptEntity):
272
+ owl_property.range_.add(namespace[str(definition.value_type.suffix)])
273
+ else:
274
+ raise ValueError(f"Value type {definition.value_type.type_} is not supported")
275
+ owl_property.domain.add(namespace[str(definition.concept.suffix)])
276
+ if definition.name:
277
+ owl_property.label.add(definition.name)
278
+ if definition.description:
279
+ owl_property.comment.add(definition.description)
280
+
281
+ return owl_property
282
+
283
+ @field_validator("type_")
284
+ def is_multi_type(cls, v: Any, info: ValidationInfo) -> Any:
285
+ if len(v) > 1:
286
+ warnings.warn(
287
+ PropertyDefinitionDuplicatedWarning(
288
+ remove_namespace_from_uri(info.data["id"]),
289
+ "class",
290
+ "type",
291
+ frozenset({remove_namespace_from_uri(t) for t in v}),
292
+ "This warning occurs when a same property is define for two object/classes where"
293
+ " its expected value type is different in one definition, e.g. acts as an edge, while in "
294
+ "other definition acts as and attribute",
295
+ "If a property takes different value types for different objects, simply define new property",
296
+ ),
297
+ stacklevel=2,
298
+ )
299
+ return v
300
+
301
+ @field_validator("range_")
302
+ def is_multi_range(cls, v: Any, info: ValidationInfo) -> Any:
303
+ if len(v) > 1:
304
+ warnings.warn(
305
+ PropertyDefinitionDuplicatedWarning(
306
+ remove_namespace_from_uri(info.data["id_"]),
307
+ "class",
308
+ "range",
309
+ frozenset({remove_namespace_from_uri(t) for t in v}),
310
+ "This warning occurs when a property takes range of "
311
+ "values which consists of union of multiple value types.",
312
+ "If value types for different objects, simply define new property",
313
+ ),
314
+ stacklevel=2,
315
+ )
316
+ return v
317
+
318
+ @field_validator("domain")
319
+ def is_multi_domain(cls, v: Any, info: ValidationInfo) -> Any:
320
+ if len(v) > 1:
321
+ warnings.warn(
322
+ PropertyDefinitionDuplicatedWarning(
323
+ remove_namespace_from_uri(info.data["id_"]),
324
+ "class",
325
+ "domain",
326
+ frozenset({remove_namespace_from_uri(t) for t in v}),
327
+ "This warning occurs when a same property is define for two object/classes where"
328
+ " its expected value type is different in one definition, e.g. acts as an edge, while in "
329
+ "other definition acts as and attribute",
330
+ "If value types for different objects, simply define new property",
331
+ ),
332
+ stacklevel=2,
333
+ )
334
+ return v
335
+
336
+ @field_validator("label")
337
+ def has_multi_name(cls, v: Any, info: ValidationInfo) -> Any:
338
+ if len(v) > 1:
339
+ warnings.warn(
340
+ PropertyDefinitionDuplicatedWarning(
341
+ remove_namespace_from_uri(info.data["id_"]),
342
+ "class",
343
+ "label",
344
+ frozenset(v),
345
+ f"Only the first label (name) will be used, {v[0]}",
346
+ ),
347
+ stacklevel=2,
348
+ )
349
+ return v
350
+
351
+ @field_validator("comment")
352
+ def has_multi_comment(cls, v: Any, info: ValidationInfo) -> Any:
353
+ if len(v) > 1:
354
+ warnings.warn(
355
+ PropertyDefinitionDuplicatedWarning(
356
+ remove_namespace_from_uri(info.data["id_"]),
357
+ "class",
358
+ "comment",
359
+ frozenset(v),
360
+ "All definitions will be concatenated to form a single definition.",
361
+ ),
362
+ stacklevel=2,
363
+ )
364
+ return v
365
+
366
+ @property
367
+ def domain_triples(self) -> list[tuple]:
368
+ triples: list[tuple] = []
369
+ if len(self.domain) == 1:
370
+ triples.append((self.id_, RDFS.domain, next(iter(self.domain))))
371
+ else:
372
+ _graph = Graph()
373
+ b_union = BNode()
374
+ b_domain = BNode()
375
+ _graph.add((self.id_, RDFS.domain, b_domain))
376
+ _graph.add((b_domain, OWL.unionOf, b_union))
377
+ _graph.add((b_domain, RDF.type, OWL.Class))
378
+ _ = GraphCollection(_graph, b_union, list(self.domain))
379
+ triples.extend(list(_graph))
380
+ return triples
381
+
382
+ @property
383
+ def range_triples(self) -> list[tuple]:
384
+ triples: list[tuple] = []
385
+ if len(self.range_) == 1:
386
+ triples.append((self.id_, RDFS.range, next(iter(self.range_))))
387
+ else:
388
+ _graph = Graph()
389
+ b_union = BNode()
390
+ b_range = BNode()
391
+ _graph.add((self.id_, RDFS.range, b_range))
392
+ _graph.add((b_range, OWL.unionOf, b_union))
393
+ _graph.add((b_range, RDF.type, OWL.Class))
394
+ _graph.add((b_range, OWL.unionOf, b_union))
395
+ _graph.add((b_range, RDF.type, OWL.Class))
396
+ _ = GraphCollection(_graph, b_union, list(self.range_))
397
+ triples.extend(list(_graph))
398
+ return triples
399
+
400
+ @property
401
+ def type_triples(self) -> list[tuple]:
402
+ return [(self.id_, RDF.type, type_) for type_ in self.type_]
403
+
404
+ @property
405
+ def label_triples(self) -> list[tuple]:
406
+ if label := list(filter(None, self.label)):
407
+ return [(self.id_, RDFS.label, Literal(label[0]))]
408
+ else:
409
+ return []
410
+
411
+ @property
412
+ def title_triples(self) -> list[tuple]:
413
+ if label := list(filter(None, self.label)):
414
+ return [
415
+ (
416
+ self.id_,
417
+ DCTERMS.title,
418
+ Literal(f"{remove_namespace_from_uri(self.id_)} - {label[0]}"),
419
+ )
420
+ ]
421
+ else:
422
+ return []
423
+
424
+ @property
425
+ def comment_triples(self) -> list[tuple]:
426
+ return [(self.id_, RDFS.comment, Literal("\n".join(filter(None, self.comment))))]
427
+
428
+ @property
429
+ def triples(self) -> list[tuple]:
430
+ return (
431
+ self.type_triples
432
+ + self.label_triples
433
+ + self.title_triples
434
+ + self.comment_triples
435
+ + self.domain_triples
436
+ + self.range_triples
437
+ )
438
+
439
+
440
+ class ShaclShapes(_ModelConfig):
441
+ """
442
+ Represents a SHACL shapes. This class is used to generate a SHACL graph from conceptual data model.
443
+
444
+ Args:
445
+ shapes: A list of SHACL node shapes.
446
+ prefixes: A dictionary of prefixes and namespaces.
447
+ """
448
+
449
+ shapes: list["SHACLNodeShape"]
450
+ prefixes: dict[str, Namespace]
451
+
452
+ @classmethod
453
+ def from_data_model(cls, data_model: ConceptualDataModel) -> Self:
454
+ """
455
+ Generates shacl shapes from a conceptual data model.
456
+
457
+ Args:
458
+ data_model: The data_model to generate the shacl shapes from.
459
+
460
+ Returns:
461
+ An instance of ShaclShapes.
462
+ """
463
+ analysis = DataModelAnalysis(data_model)
464
+ concepts_by_concept_entity = analysis.concept_by_concept_entity
465
+ properties_by_concept_entity = analysis.properties_by_concepts()
466
+ return cls(
467
+ shapes=[
468
+ # shapes that have property shapes as well
469
+ SHACLNodeShape.from_concept(
470
+ concept_entity,
471
+ concepts_by_concept_entity,
472
+ properties,
473
+ data_model.metadata.namespace,
474
+ )
475
+ for concept_entity, properties in properties_by_concept_entity.items()
476
+ ]
477
+ + [
478
+ # shapes without any property shapes
479
+ SHACLNodeShape.from_concept(
480
+ concept_entity,
481
+ concepts_by_concept_entity,
482
+ [],
483
+ data_model.metadata.namespace,
484
+ )
485
+ for concept_entity in concepts_by_concept_entity.keys()
486
+ if concept_entity not in properties_by_concept_entity
487
+ ],
488
+ prefixes=data_model.prefixes,
489
+ )
490
+
491
+ @property
492
+ def graph(self) -> Graph:
493
+ """
494
+ Generates a SHACL graph from the class instance.
495
+
496
+ Returns:
497
+ A SHACL graph.
498
+ """
499
+
500
+ shacl = Graph()
501
+ for prefix, namespace in self.prefixes.items():
502
+ shacl.bind(prefix, namespace)
503
+
504
+ for shape in self.shapes:
505
+ for triple in shape.triples:
506
+ shacl.add(triple) # type: ignore[arg-type]
507
+
508
+ return shacl
509
+
510
+
511
+ class SHACLNodeShape(_ModelConfig):
512
+ id_: URIRef
513
+ type_: URIRef = SHACL.NodeShape
514
+ target_class: URIRef
515
+ parent: list[URIRef] | None = None
516
+ property_shapes: list["SHACLPropertyShape"] | None = None
517
+ namespace: Namespace
518
+
519
+ @property
520
+ def type_triples(self) -> list[tuple]:
521
+ return [(self.id_, RDF.type, self.type_)]
522
+
523
+ @property
524
+ def target_class_triples(self) -> list[tuple]:
525
+ return [(self.id_, SHACL.targetClass, self.target_class)]
526
+
527
+ @property
528
+ def target_parent_class_triples(self) -> list[tuple]:
529
+ if self.parent:
530
+ return [(self.id_, RDFS.subClassOf, parent) for parent in self.parent]
531
+ else:
532
+ return []
533
+
534
+ @property
535
+ def property_shapes_triples(self) -> list[tuple]:
536
+ triples: list[tuple] = []
537
+ if self.property_shapes:
538
+ for property_shape in self.property_shapes:
539
+ triples.append((self.id_, SHACL.property, property_shape.id_))
540
+ triples.extend(property_shape.triples)
541
+ return triples
542
+
543
+ @property
544
+ def triples(self) -> list[tuple]:
545
+ return (
546
+ self.type_triples
547
+ + self.target_class_triples
548
+ + self.property_shapes_triples
549
+ + self.target_parent_class_triples
550
+ )
551
+
552
+ @classmethod
553
+ def from_concept(
554
+ cls,
555
+ concept_entity: ConceptEntity,
556
+ concepts_by_concept_entity: dict[ConceptEntity, Concept],
557
+ properties: list[ConceptualProperty],
558
+ namespace: Namespace,
559
+ ) -> "SHACLNodeShape":
560
+ if not (concept := concepts_by_concept_entity.get(concept_entity)):
561
+ raise ValueError(f"Concept {concept_entity} not found in data model!")
562
+
563
+ if concept.implements:
564
+ parent = [namespace[str(parent.suffix) + "Shape"] for parent in concept.implements]
565
+ else:
566
+ parent = None
567
+ return cls(
568
+ id_=namespace[f"{concept.concept.suffix!s}Shape"],
569
+ target_class=concept.instance_source or namespace[str(concept.concept.suffix)],
570
+ parent=parent,
571
+ property_shapes=[
572
+ SHACLPropertyShape.from_property(property_, concepts_by_concept_entity, namespace)
573
+ for property_ in properties
574
+ ],
575
+ namespace=namespace,
576
+ )
577
+
578
+
579
+ class SHACLPropertyShape(_ModelConfig):
580
+ id_: BNode
581
+ type_: URIRef = SHACL.property
582
+ path: URIRef # URIRef to property in OWL
583
+ node_kind: URIRef # SHACL.IRI or SHACL.Literal
584
+ expected_value_type: URIRef
585
+ min_count: int | None
586
+ max_count: int | None
587
+ namespace: Namespace
588
+
589
+ @property
590
+ def path_triples(self) -> list[tuple]:
591
+ return [(self.id_, SHACL.path, self.path)]
592
+
593
+ @property
594
+ def node_kind_triples(self) -> list[tuple]:
595
+ triples: list[tuple] = [(self.id_, SHACL.nodeKind, self.node_kind)]
596
+
597
+ if self.node_kind == SHACL.Literal:
598
+ triples.append((self.id_, SHACL.datatype, self.expected_value_type))
599
+ else:
600
+ triples.append((self.id_, SHACL.node, self.expected_value_type))
601
+
602
+ return triples
603
+
604
+ @property
605
+ def cardinality_triples(self) -> list[tuple]:
606
+ triples: list[tuple] = []
607
+ if self.min_count:
608
+ triples.append((self.id_, SHACL.minCount, Literal(self.min_count)))
609
+ if self.max_count:
610
+ triples.append((self.id_, SHACL.maxCount, Literal(self.max_count)))
611
+
612
+ return triples
613
+
614
+ @property
615
+ def triples(self) -> list[tuple]:
616
+ return self.path_triples + self.node_kind_triples + self.cardinality_triples
617
+
618
+ @classmethod
619
+ def from_property(
620
+ cls,
621
+ property_: ConceptualProperty,
622
+ concepts_by_concept_entity: dict[ConceptEntity, Concept],
623
+ namespace: Namespace,
624
+ ) -> "SHACLPropertyShape":
625
+ if isinstance(property_.value_type, ConceptEntity):
626
+ concept = concepts_by_concept_entity.get(property_.value_type)
627
+ value_type_uri = concept.instance_source if concept else None
628
+ expected_value_type = value_type_uri or namespace[f"{property_.value_type.suffix}"]
629
+ elif isinstance(property_.value_type, DataType):
630
+ expected_value_type = XSD[property_.value_type.xsd]
631
+ else:
632
+ raise NotImplementedError(f"Value type {property_.value_type.type_} is not supported yet")
633
+
634
+ return cls(
635
+ id_=BNode(),
636
+ path=property_.instance_source[0]
637
+ if property_.instance_source and len(property_.instance_source) == 1
638
+ else namespace[property_.property_],
639
+ node_kind=SHACL.IRI if property_.type_ == EntityTypes.object_property else SHACL.Literal,
640
+ expected_value_type=expected_value_type,
641
+ min_count=property_.min_count,
642
+ max_count=(
643
+ int(property_.max_count) if property_.max_count and property_.max_count != float("inf") else None
644
+ ),
645
+ namespace=namespace,
646
+ )