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.
- cognite/neat/__init__.py +4 -1
- cognite/neat/_client/__init__.py +4 -0
- cognite/neat/_client/api.py +8 -0
- cognite/neat/_client/client.py +21 -0
- cognite/neat/_client/config.py +40 -0
- cognite/neat/_client/containers_api.py +125 -0
- cognite/neat/_client/data_classes.py +44 -0
- cognite/neat/_client/data_model_api.py +115 -0
- cognite/neat/_client/spaces_api.py +115 -0
- cognite/neat/_client/statistics_api.py +24 -0
- cognite/neat/_client/views_api.py +129 -0
- cognite/neat/_data_model/_analysis.py +186 -0
- cognite/neat/_data_model/_constants.py +67 -0
- cognite/neat/_data_model/_identifiers.py +61 -0
- cognite/neat/_data_model/_shared.py +41 -0
- cognite/neat/_data_model/deployer/_differ.py +140 -0
- cognite/neat/_data_model/deployer/_differ_container.py +360 -0
- cognite/neat/_data_model/deployer/_differ_data_model.py +54 -0
- cognite/neat/_data_model/deployer/_differ_space.py +9 -0
- cognite/neat/_data_model/deployer/_differ_view.py +299 -0
- cognite/neat/_data_model/deployer/data_classes.py +529 -0
- cognite/neat/_data_model/deployer/deployer.py +401 -0
- cognite/neat/_data_model/exporters/__init__.py +15 -0
- cognite/neat/_data_model/exporters/_api_exporter.py +37 -0
- cognite/neat/_data_model/exporters/_base.py +24 -0
- cognite/neat/_data_model/exporters/_table_exporter/exporter.py +128 -0
- cognite/neat/_data_model/exporters/_table_exporter/workbook.py +409 -0
- cognite/neat/_data_model/exporters/_table_exporter/writer.py +399 -0
- cognite/neat/_data_model/importers/__init__.py +5 -0
- cognite/neat/_data_model/importers/_api_importer.py +166 -0
- cognite/neat/_data_model/importers/_base.py +16 -0
- cognite/neat/_data_model/importers/_table_importer/data_classes.py +291 -0
- cognite/neat/_data_model/importers/_table_importer/importer.py +192 -0
- cognite/neat/_data_model/importers/_table_importer/reader.py +875 -0
- cognite/neat/_data_model/importers/_table_importer/source.py +94 -0
- cognite/neat/_data_model/models/conceptual/_base.py +18 -0
- cognite/neat/_data_model/models/conceptual/_concept.py +67 -0
- cognite/neat/_data_model/models/conceptual/_data_model.py +51 -0
- cognite/neat/_data_model/models/conceptual/_properties.py +104 -0
- cognite/neat/_data_model/models/conceptual/_property.py +105 -0
- cognite/neat/_data_model/models/dms/__init__.py +206 -0
- cognite/neat/_data_model/models/dms/_base.py +31 -0
- cognite/neat/_data_model/models/dms/_constants.py +47 -0
- cognite/neat/_data_model/models/dms/_constraints.py +42 -0
- cognite/neat/_data_model/models/dms/_container.py +159 -0
- cognite/neat/_data_model/models/dms/_data_model.py +94 -0
- cognite/neat/_data_model/models/dms/_data_types.py +195 -0
- cognite/neat/_data_model/models/dms/_http.py +28 -0
- cognite/neat/_data_model/models/dms/_indexes.py +30 -0
- cognite/neat/_data_model/models/dms/_limits.py +96 -0
- cognite/neat/_data_model/models/dms/_references.py +135 -0
- cognite/neat/_data_model/models/dms/_schema.py +18 -0
- cognite/neat/_data_model/models/dms/_space.py +48 -0
- cognite/neat/_data_model/models/dms/_types.py +17 -0
- cognite/neat/_data_model/models/dms/_view_filter.py +282 -0
- cognite/neat/_data_model/models/dms/_view_property.py +235 -0
- cognite/neat/_data_model/models/dms/_views.py +210 -0
- cognite/neat/_data_model/models/entities/__init__.py +50 -0
- cognite/neat/_data_model/models/entities/_base.py +101 -0
- cognite/neat/_data_model/models/entities/_constants.py +22 -0
- cognite/neat/_data_model/models/entities/_data_types.py +144 -0
- cognite/neat/_data_model/models/entities/_identifiers.py +61 -0
- cognite/neat/_data_model/models/entities/_parser.py +226 -0
- cognite/neat/_data_model/validation/dms/__init__.py +57 -0
- cognite/neat/_data_model/validation/dms/_ai_readiness.py +167 -0
- cognite/neat/_data_model/validation/dms/_base.py +304 -0
- cognite/neat/_data_model/validation/dms/_connections.py +627 -0
- cognite/neat/_data_model/validation/dms/_consistency.py +56 -0
- cognite/neat/_data_model/validation/dms/_containers.py +135 -0
- cognite/neat/_data_model/validation/dms/_limits.py +414 -0
- cognite/neat/_data_model/validation/dms/_orchestrator.py +202 -0
- cognite/neat/_data_model/validation/dms/_views.py +101 -0
- cognite/neat/_exceptions.py +56 -0
- cognite/neat/_issues.py +68 -0
- cognite/neat/_session/__init__.py +3 -0
- cognite/neat/_session/_html/_render.py +30 -0
- cognite/neat/_session/_html/static/__init__.py +8 -0
- cognite/neat/_session/_html/static/deployment.css +303 -0
- cognite/neat/_session/_html/static/deployment.js +149 -0
- cognite/neat/_session/_html/static/issues.css +211 -0
- cognite/neat/_session/_html/static/issues.js +167 -0
- cognite/neat/_session/_html/static/shared.css +186 -0
- cognite/neat/_session/_html/templates/__init__.py +4 -0
- cognite/neat/_session/_html/templates/deployment.html +74 -0
- cognite/neat/_session/_html/templates/issues.html +44 -0
- cognite/neat/_session/_issues.py +76 -0
- cognite/neat/_session/_opt.py +35 -0
- cognite/neat/_session/_physical.py +240 -0
- cognite/neat/_session/_result.py +231 -0
- cognite/neat/_session/_session.py +69 -0
- cognite/neat/_session/_usage_analytics/_collector.py +131 -0
- cognite/neat/_session/_usage_analytics/_constants.py +23 -0
- cognite/neat/_session/_usage_analytics/_storage.py +240 -0
- cognite/neat/_session/_wrappers.py +82 -0
- cognite/neat/_state_machine/__init__.py +10 -0
- cognite/neat/_state_machine/_base.py +37 -0
- cognite/neat/_state_machine/_states.py +52 -0
- cognite/neat/_store/__init__.py +3 -0
- cognite/neat/_store/_provenance.py +71 -0
- cognite/neat/_store/_store.py +144 -0
- cognite/neat/_utils/_reader.py +194 -0
- cognite/neat/_utils/auxiliary.py +39 -0
- cognite/neat/_utils/collection.py +11 -0
- cognite/neat/_utils/http_client/__init__.py +39 -0
- cognite/neat/_utils/http_client/_client.py +245 -0
- cognite/neat/_utils/http_client/_config.py +19 -0
- cognite/neat/_utils/http_client/_data_classes.py +294 -0
- cognite/neat/_utils/http_client/_tracker.py +31 -0
- cognite/neat/_utils/text.py +71 -0
- cognite/neat/_utils/useful_types.py +37 -0
- cognite/neat/_utils/validation.py +149 -0
- cognite/neat/_version.py +2 -1
- cognite/neat/v0/core/__init__.py +0 -0
- cognite/neat/v0/core/_client/__init__.py +4 -0
- cognite/neat/v0/core/_client/_api/__init__.py +0 -0
- cognite/neat/v0/core/_client/_api/data_modeling_loaders.py +1032 -0
- cognite/neat/v0/core/_client/_api/neat_instances.py +101 -0
- cognite/neat/v0/core/_client/_api/schema.py +158 -0
- cognite/neat/v0/core/_client/_api/statistics.py +91 -0
- cognite/neat/v0/core/_client/_api_client.py +21 -0
- cognite/neat/v0/core/_client/data_classes/__init__.py +0 -0
- cognite/neat/v0/core/_client/data_classes/data_modeling.py +198 -0
- cognite/neat/v0/core/_client/data_classes/neat_sequence.py +261 -0
- cognite/neat/v0/core/_client/data_classes/schema.py +540 -0
- cognite/neat/v0/core/_client/data_classes/statistics.py +125 -0
- cognite/neat/v0/core/_client/testing.py +39 -0
- cognite/neat/v0/core/_config.py +11 -0
- cognite/neat/v0/core/_constants.py +278 -0
- cognite/neat/v0/core/_data_model/__init__.py +0 -0
- cognite/neat/v0/core/_data_model/_constants.py +210 -0
- cognite/neat/v0/core/_data_model/_shared.py +59 -0
- cognite/neat/v0/core/_data_model/analysis/__init__.py +3 -0
- cognite/neat/v0/core/_data_model/analysis/_base.py +578 -0
- cognite/neat/v0/core/_data_model/catalog/__init__.py +8 -0
- cognite/neat/v0/core/_data_model/catalog/classic_model.xlsx +0 -0
- cognite/neat/v0/core/_data_model/catalog/conceptual-imf-data-model.xlsx +0 -0
- cognite/neat/v0/core/_data_model/catalog/hello_world_pump.xlsx +0 -0
- cognite/neat/v0/core/_data_model/exporters/__init__.py +38 -0
- cognite/neat/v0/core/_data_model/exporters/_base.py +67 -0
- cognite/neat/v0/core/_data_model/exporters/_data_model2dms.py +428 -0
- cognite/neat/v0/core/_data_model/exporters/_data_model2excel.py +612 -0
- cognite/neat/v0/core/_data_model/exporters/_data_model2instance_template.py +158 -0
- cognite/neat/v0/core/_data_model/exporters/_data_model2semantic_model.py +646 -0
- cognite/neat/v0/core/_data_model/exporters/_data_model2yaml.py +84 -0
- cognite/neat/v0/core/_data_model/importers/__init__.py +49 -0
- cognite/neat/v0/core/_data_model/importers/_base.py +64 -0
- cognite/neat/v0/core/_data_model/importers/_base_file_reader.py +56 -0
- cognite/neat/v0/core/_data_model/importers/_dict2data_model.py +131 -0
- cognite/neat/v0/core/_data_model/importers/_dms2data_model.py +705 -0
- cognite/neat/v0/core/_data_model/importers/_graph2data_model.py +299 -0
- cognite/neat/v0/core/_data_model/importers/_rdf/__init__.py +4 -0
- cognite/neat/v0/core/_data_model/importers/_rdf/_base.py +161 -0
- cognite/neat/v0/core/_data_model/importers/_rdf/_inference2rdata_model.py +618 -0
- cognite/neat/v0/core/_data_model/importers/_rdf/_owl2data_model.py +124 -0
- cognite/neat/v0/core/_data_model/importers/_rdf/_shared.py +255 -0
- cognite/neat/v0/core/_data_model/importers/_spreadsheet2data_model.py +424 -0
- cognite/neat/v0/core/_data_model/models/__init__.py +38 -0
- cognite/neat/v0/core/_data_model/models/_base_unverified.py +181 -0
- cognite/neat/v0/core/_data_model/models/_base_verified.py +449 -0
- cognite/neat/v0/core/_data_model/models/_import_contexts.py +82 -0
- cognite/neat/v0/core/_data_model/models/_types.py +171 -0
- cognite/neat/v0/core/_data_model/models/conceptual/__init__.py +25 -0
- cognite/neat/v0/core/_data_model/models/conceptual/_unverified.py +193 -0
- cognite/neat/v0/core/_data_model/models/conceptual/_validation.py +308 -0
- cognite/neat/v0/core/_data_model/models/conceptual/_verified.py +327 -0
- cognite/neat/v0/core/_data_model/models/data_types.py +422 -0
- cognite/neat/v0/core/_data_model/models/entities/__init__.py +70 -0
- cognite/neat/v0/core/_data_model/models/entities/_constants.py +18 -0
- cognite/neat/v0/core/_data_model/models/entities/_loaders.py +155 -0
- cognite/neat/v0/core/_data_model/models/entities/_multi_value.py +83 -0
- cognite/neat/v0/core/_data_model/models/entities/_restrictions.py +230 -0
- cognite/neat/v0/core/_data_model/models/entities/_single_value.py +676 -0
- cognite/neat/v0/core/_data_model/models/entities/_types.py +103 -0
- cognite/neat/v0/core/_data_model/models/entities/_wrapped.py +217 -0
- cognite/neat/v0/core/_data_model/models/mapping/__init__.py +3 -0
- cognite/neat/v0/core/_data_model/models/mapping/_classic2core.py +39 -0
- cognite/neat/v0/core/_data_model/models/mapping/_classic2core.yaml +608 -0
- cognite/neat/v0/core/_data_model/models/physical/__init__.py +40 -0
- cognite/neat/v0/core/_data_model/models/physical/_exporter.py +658 -0
- cognite/neat/v0/core/_data_model/models/physical/_unverified.py +557 -0
- cognite/neat/v0/core/_data_model/models/physical/_validation.py +887 -0
- cognite/neat/v0/core/_data_model/models/physical/_verified.py +667 -0
- cognite/neat/v0/core/_data_model/transformers/__init__.py +70 -0
- cognite/neat/v0/core/_data_model/transformers/_base.py +79 -0
- cognite/neat/v0/core/_data_model/transformers/_converters.py +2485 -0
- cognite/neat/v0/core/_data_model/transformers/_mapping.py +390 -0
- cognite/neat/v0/core/_data_model/transformers/_union_conceptual.py +208 -0
- cognite/neat/v0/core/_data_model/transformers/_verification.py +120 -0
- cognite/neat/v0/core/_instances/__init__.py +0 -0
- cognite/neat/v0/core/_instances/_shared.py +37 -0
- cognite/neat/v0/core/_instances/_tracking/__init__.py +4 -0
- cognite/neat/v0/core/_instances/_tracking/base.py +30 -0
- cognite/neat/v0/core/_instances/_tracking/log.py +27 -0
- cognite/neat/v0/core/_instances/extractors/__init__.py +76 -0
- cognite/neat/v0/core/_instances/extractors/_base.py +58 -0
- cognite/neat/v0/core/_instances/extractors/_classic_cdf/__init__.py +0 -0
- cognite/neat/v0/core/_instances/extractors/_classic_cdf/_assets.py +37 -0
- cognite/neat/v0/core/_instances/extractors/_classic_cdf/_base.py +443 -0
- cognite/neat/v0/core/_instances/extractors/_classic_cdf/_classic.py +479 -0
- cognite/neat/v0/core/_instances/extractors/_classic_cdf/_data_sets.py +35 -0
- cognite/neat/v0/core/_instances/extractors/_classic_cdf/_events.py +33 -0
- cognite/neat/v0/core/_instances/extractors/_classic_cdf/_files.py +45 -0
- cognite/neat/v0/core/_instances/extractors/_classic_cdf/_labels.py +54 -0
- cognite/neat/v0/core/_instances/extractors/_classic_cdf/_relationships.py +122 -0
- cognite/neat/v0/core/_instances/extractors/_classic_cdf/_sequences.py +280 -0
- cognite/neat/v0/core/_instances/extractors/_classic_cdf/_timeseries.py +48 -0
- cognite/neat/v0/core/_instances/extractors/_dict.py +105 -0
- cognite/neat/v0/core/_instances/extractors/_dms.py +315 -0
- cognite/neat/v0/core/_instances/extractors/_dms_graph.py +238 -0
- cognite/neat/v0/core/_instances/extractors/_mock_graph_generator.py +404 -0
- cognite/neat/v0/core/_instances/extractors/_raw.py +67 -0
- cognite/neat/v0/core/_instances/extractors/_rdf_file.py +80 -0
- cognite/neat/v0/core/_instances/loaders/__init__.py +24 -0
- cognite/neat/v0/core/_instances/loaders/_base.py +116 -0
- cognite/neat/v0/core/_instances/loaders/_rdf2dms.py +649 -0
- cognite/neat/v0/core/_instances/loaders/_rdf_to_instance_space.py +249 -0
- cognite/neat/v0/core/_instances/queries/__init__.py +3 -0
- cognite/neat/v0/core/_instances/queries/_base.py +16 -0
- cognite/neat/v0/core/_instances/queries/_queries.py +16 -0
- cognite/neat/v0/core/_instances/queries/_select.py +478 -0
- cognite/neat/v0/core/_instances/queries/_update.py +37 -0
- cognite/neat/v0/core/_instances/transformers/__init__.py +65 -0
- cognite/neat/v0/core/_instances/transformers/_base.py +133 -0
- cognite/neat/v0/core/_instances/transformers/_classic_cdf.py +589 -0
- cognite/neat/v0/core/_instances/transformers/_prune_graph.py +315 -0
- cognite/neat/v0/core/_instances/transformers/_rdfpath.py +84 -0
- cognite/neat/v0/core/_instances/transformers/_value_type.py +366 -0
- cognite/neat/v0/core/_issues/__init__.py +21 -0
- cognite/neat/v0/core/_issues/_base.py +348 -0
- cognite/neat/v0/core/_issues/_contextmanagers.py +50 -0
- cognite/neat/v0/core/_issues/_factory.py +69 -0
- cognite/neat/v0/core/_issues/errors/__init__.py +90 -0
- cognite/neat/v0/core/_issues/errors/_external.py +91 -0
- cognite/neat/v0/core/_issues/errors/_general.py +51 -0
- cognite/neat/v0/core/_issues/errors/_properties.py +80 -0
- cognite/neat/v0/core/_issues/errors/_resources.py +116 -0
- cognite/neat/v0/core/_issues/errors/_wrapper.py +93 -0
- cognite/neat/{rules/issues → v0/core/_issues}/formatters.py +12 -10
- cognite/neat/v0/core/_issues/warnings/__init__.py +99 -0
- cognite/neat/v0/core/_issues/warnings/_external.py +56 -0
- cognite/neat/v0/core/_issues/warnings/_general.py +46 -0
- cognite/neat/v0/core/_issues/warnings/_models.py +165 -0
- cognite/neat/v0/core/_issues/warnings/_properties.py +108 -0
- cognite/neat/v0/core/_issues/warnings/_resources.py +110 -0
- cognite/neat/v0/core/_issues/warnings/user_modeling.py +125 -0
- cognite/neat/v0/core/_shared.py +77 -0
- cognite/neat/v0/core/_store/__init__.py +4 -0
- cognite/neat/v0/core/_store/_data_model.py +487 -0
- cognite/neat/v0/core/_store/_instance.py +485 -0
- cognite/neat/v0/core/_store/_provenance.py +217 -0
- cognite/neat/v0/core/_store/exceptions.py +59 -0
- cognite/neat/v0/core/_utils/__init__.py +0 -0
- cognite/neat/v0/core/_utils/auth.py +364 -0
- cognite/neat/v0/core/_utils/auxiliary.py +169 -0
- cognite/neat/v0/core/_utils/collection_.py +66 -0
- cognite/neat/v0/core/_utils/graph_transformations_report.py +36 -0
- cognite/neat/v0/core/_utils/io_.py +11 -0
- cognite/neat/v0/core/_utils/rdf_.py +336 -0
- cognite/neat/v0/core/_utils/reader/__init__.py +3 -0
- cognite/neat/v0/core/_utils/reader/_base.py +194 -0
- cognite/neat/v0/core/_utils/spreadsheet.py +182 -0
- cognite/neat/v0/core/_utils/tarjan.py +44 -0
- cognite/neat/v0/core/_utils/text.py +277 -0
- cognite/neat/v0/core/_utils/time_.py +17 -0
- cognite/neat/v0/core/_utils/upload.py +134 -0
- cognite/neat/v0/core/_utils/xml_.py +52 -0
- cognite/neat/v0/plugins/__init__.py +4 -0
- cognite/neat/v0/plugins/_base.py +9 -0
- cognite/neat/v0/plugins/_data_model.py +48 -0
- cognite/neat/v0/plugins/_issues.py +35 -0
- cognite/neat/v0/plugins/_manager.py +94 -0
- cognite/neat/v0/session/__init__.py +3 -0
- cognite/neat/v0/session/_base.py +332 -0
- cognite/neat/v0/session/_collector.py +131 -0
- cognite/neat/v0/session/_diff.py +51 -0
- cognite/neat/v0/session/_drop.py +103 -0
- cognite/neat/v0/session/_experimental.py +26 -0
- cognite/neat/v0/session/_explore.py +39 -0
- cognite/neat/v0/session/_fix.py +28 -0
- cognite/neat/v0/session/_inspect.py +285 -0
- cognite/neat/v0/session/_mapping.py +71 -0
- cognite/neat/v0/session/_plugin.py +66 -0
- cognite/neat/v0/session/_prepare.py +286 -0
- cognite/neat/v0/session/_read.py +923 -0
- cognite/neat/v0/session/_set.py +101 -0
- cognite/neat/v0/session/_show.py +298 -0
- cognite/neat/v0/session/_state/README.md +23 -0
- cognite/neat/v0/session/_state.py +161 -0
- cognite/neat/v0/session/_subset.py +88 -0
- cognite/neat/v0/session/_template.py +208 -0
- cognite/neat/v0/session/_to.py +454 -0
- cognite/neat/v0/session/_wizard.py +44 -0
- cognite/neat/v0/session/engine/__init__.py +4 -0
- cognite/neat/v0/session/engine/_import.py +7 -0
- cognite/neat/v0/session/engine/_interface.py +25 -0
- cognite/neat/v0/session/engine/_load.py +131 -0
- cognite/neat/v0/session/exceptions.py +103 -0
- cognite/neat/v1.py +3 -0
- cognite_neat-0.127.19.dist-info/METADATA +145 -0
- cognite_neat-0.127.19.dist-info/RECORD +318 -0
- {cognite_neat-0.70.1.dist-info → cognite_neat-0.127.19.dist-info}/WHEEL +1 -1
- cognite/neat/app/api/asgi/metrics.py +0 -4
- cognite/neat/app/api/configuration.py +0 -110
- cognite/neat/app/api/context_manager/__init__.py +0 -3
- cognite/neat/app/api/context_manager/manager.py +0 -16
- cognite/neat/app/api/data_classes/configuration.py +0 -121
- cognite/neat/app/api/data_classes/rest.py +0 -78
- cognite/neat/app/api/explorer.py +0 -64
- cognite/neat/app/api/routers/configuration.py +0 -24
- cognite/neat/app/api/routers/core.py +0 -51
- cognite/neat/app/api/routers/crud.py +0 -112
- cognite/neat/app/api/routers/data_exploration.py +0 -334
- cognite/neat/app/api/routers/metrics.py +0 -10
- cognite/neat/app/api/routers/rules.py +0 -169
- cognite/neat/app/api/routers/workflows.py +0 -274
- cognite/neat/app/api/utils/data_mapping.py +0 -17
- cognite/neat/app/api/utils/logging.py +0 -26
- cognite/neat/app/api/utils/query_templates.py +0 -92
- cognite/neat/app/main.py +0 -17
- cognite/neat/app/monitoring/metrics.py +0 -69
- cognite/neat/app/ui/index.html +0 -1
- cognite/neat/app/ui/neat-app/.gitignore +0 -23
- cognite/neat/app/ui/neat-app/README.md +0 -70
- cognite/neat/app/ui/neat-app/build/asset-manifest.json +0 -14
- cognite/neat/app/ui/neat-app/build/favicon.ico +0 -0
- cognite/neat/app/ui/neat-app/build/index.html +0 -1
- cognite/neat/app/ui/neat-app/build/logo192.png +0 -0
- cognite/neat/app/ui/neat-app/build/manifest.json +0 -25
- cognite/neat/app/ui/neat-app/build/robots.txt +0 -3
- cognite/neat/app/ui/neat-app/build/static/css/main.38a62222.css +0 -2
- cognite/neat/app/ui/neat-app/build/static/css/main.38a62222.css.map +0 -1
- cognite/neat/app/ui/neat-app/build/static/js/main.ed960141.js +0 -3
- cognite/neat/app/ui/neat-app/build/static/js/main.ed960141.js.LICENSE.txt +0 -97
- cognite/neat/app/ui/neat-app/build/static/js/main.ed960141.js.map +0 -1
- cognite/neat/app/ui/neat-app/build/static/media/logo.8093b84df9ed36a174c629d6fe0b730d.svg +0 -1
- cognite/neat/config.py +0 -46
- cognite/neat/constants.py +0 -36
- cognite/neat/exceptions.py +0 -139
- cognite/neat/graph/__init__.py +0 -3
- cognite/neat/graph/exceptions.py +0 -91
- cognite/neat/graph/extractor/__init__.py +0 -6
- cognite/neat/graph/extractor/_base.py +0 -14
- cognite/neat/graph/extractor/_dexpi.py +0 -306
- cognite/neat/graph/extractor/_graph_capturing_sheet.py +0 -401
- cognite/neat/graph/extractor/_mock_graph_generator.py +0 -359
- cognite/neat/graph/extractors/_base.py +0 -14
- cognite/neat/graph/extractors/_mock_graph_generator.py +0 -359
- cognite/neat/graph/loader/__init__.py +0 -23
- cognite/neat/graph/loader/_asset_loader.py +0 -516
- cognite/neat/graph/loader/_base.py +0 -69
- cognite/neat/graph/loader/_exceptions.py +0 -87
- cognite/neat/graph/loader/core/labels.py +0 -58
- cognite/neat/graph/loader/core/models.py +0 -136
- cognite/neat/graph/loader/core/rdf_to_assets.py +0 -1047
- cognite/neat/graph/loader/core/rdf_to_relationships.py +0 -558
- cognite/neat/graph/loader/rdf_to_dms.py +0 -309
- cognite/neat/graph/loader/validator.py +0 -87
- cognite/neat/graph/models.py +0 -6
- cognite/neat/graph/stores/__init__.py +0 -13
- cognite/neat/graph/stores/_base.py +0 -384
- cognite/neat/graph/stores/_graphdb_store.py +0 -51
- cognite/neat/graph/stores/_memory_store.py +0 -43
- cognite/neat/graph/stores/_oxigraph_store.py +0 -145
- cognite/neat/graph/stores/_oxrdflib.py +0 -247
- cognite/neat/graph/stores/_rdf_to_graph.py +0 -40
- cognite/neat/graph/transformation/entity_matcher.py +0 -101
- cognite/neat/graph/transformation/query_generator/__init__.py +0 -3
- cognite/neat/graph/transformation/query_generator/sparql.py +0 -540
- cognite/neat/graph/transformation/transformer.py +0 -316
- cognite/neat/rules/_analysis/_base.py +0 -25
- cognite/neat/rules/_analysis/_information_rules.py +0 -414
- cognite/neat/rules/_shared.py +0 -5
- cognite/neat/rules/analysis.py +0 -231
- cognite/neat/rules/examples/Rules-Nordic44-to-TNT.xlsx +0 -0
- cognite/neat/rules/examples/Rules-Nordic44-to-graphql.xlsx +0 -0
- cognite/neat/rules/examples/__init__.py +0 -18
- cognite/neat/rules/examples/power-grid-containers.yaml +0 -113
- cognite/neat/rules/examples/power-grid-example.xlsx +0 -0
- cognite/neat/rules/examples/power-grid-model.yaml +0 -213
- cognite/neat/rules/examples/rules-template.xlsx +0 -0
- cognite/neat/rules/examples/sheet2cdf-transformation-rules.xlsx +0 -0
- cognite/neat/rules/examples/skos-rules.xlsx +0 -0
- cognite/neat/rules/examples/source-to-solution-mapping-rules.xlsx +0 -0
- cognite/neat/rules/examples/wind-energy.owl +0 -1511
- cognite/neat/rules/exceptions.py +0 -2972
- cognite/neat/rules/exporter/__init__.py +0 -20
- cognite/neat/rules/exporter/_base.py +0 -45
- cognite/neat/rules/exporter/_core/__init__.py +0 -5
- cognite/neat/rules/exporter/_core/rules2labels.py +0 -24
- cognite/neat/rules/exporter/_rules2dms.py +0 -888
- cognite/neat/rules/exporter/_rules2excel.py +0 -212
- cognite/neat/rules/exporter/_rules2graphql.py +0 -183
- cognite/neat/rules/exporter/_rules2ontology.py +0 -523
- cognite/neat/rules/exporter/_rules2pydantic_models.py +0 -748
- cognite/neat/rules/exporter/_rules2rules.py +0 -104
- cognite/neat/rules/exporter/_rules2triples.py +0 -37
- cognite/neat/rules/exporter/_validation.py +0 -150
- cognite/neat/rules/exporters/__init__.py +0 -15
- cognite/neat/rules/exporters/_base.py +0 -42
- cognite/neat/rules/exporters/_models.py +0 -58
- cognite/neat/rules/exporters/_rules2dms.py +0 -259
- cognite/neat/rules/exporters/_rules2excel.py +0 -196
- cognite/neat/rules/exporters/_rules2ontology.py +0 -561
- cognite/neat/rules/exporters/_rules2yaml.py +0 -78
- cognite/neat/rules/exporters/_validation.py +0 -107
- cognite/neat/rules/importer/__init__.py +0 -22
- cognite/neat/rules/importer/_base.py +0 -70
- cognite/neat/rules/importer/_dict2rules.py +0 -158
- cognite/neat/rules/importer/_dms2rules.py +0 -196
- cognite/neat/rules/importer/_graph2rules.py +0 -304
- cognite/neat/rules/importer/_json2rules.py +0 -39
- cognite/neat/rules/importer/_owl2rules/__init__.py +0 -3
- cognite/neat/rules/importer/_owl2rules/_owl2classes.py +0 -239
- cognite/neat/rules/importer/_owl2rules/_owl2metadata.py +0 -255
- cognite/neat/rules/importer/_owl2rules/_owl2properties.py +0 -217
- cognite/neat/rules/importer/_owl2rules/_owl2rules.py +0 -290
- cognite/neat/rules/importer/_spreadsheet2rules.py +0 -45
- cognite/neat/rules/importer/_xsd2rules.py +0 -20
- cognite/neat/rules/importer/_yaml2rules.py +0 -39
- cognite/neat/rules/importers/__init__.py +0 -16
- cognite/neat/rules/importers/_base.py +0 -124
- cognite/neat/rules/importers/_dms2rules.py +0 -191
- cognite/neat/rules/importers/_dtdl2rules/__init__.py +0 -3
- cognite/neat/rules/importers/_dtdl2rules/_unit_lookup.py +0 -224
- cognite/neat/rules/importers/_dtdl2rules/dtdl_converter.py +0 -318
- cognite/neat/rules/importers/_dtdl2rules/dtdl_importer.py +0 -164
- cognite/neat/rules/importers/_dtdl2rules/spec.py +0 -359
- cognite/neat/rules/importers/_owl2rules/__init__.py +0 -3
- cognite/neat/rules/importers/_owl2rules/_owl2classes.py +0 -219
- cognite/neat/rules/importers/_owl2rules/_owl2metadata.py +0 -217
- cognite/neat/rules/importers/_owl2rules/_owl2properties.py +0 -203
- cognite/neat/rules/importers/_owl2rules/_owl2rules.py +0 -148
- cognite/neat/rules/importers/_spreadsheet2rules.py +0 -266
- cognite/neat/rules/importers/_yaml2rules.py +0 -110
- cognite/neat/rules/issues/__init__.py +0 -27
- cognite/neat/rules/issues/base.py +0 -190
- cognite/neat/rules/issues/dms.py +0 -331
- cognite/neat/rules/issues/fileread.py +0 -156
- cognite/neat/rules/issues/importing.py +0 -220
- cognite/neat/rules/issues/spreadsheet.py +0 -381
- cognite/neat/rules/issues/spreadsheet_file.py +0 -151
- cognite/neat/rules/models/__init__.py +0 -5
- cognite/neat/rules/models/_base.py +0 -151
- cognite/neat/rules/models/_rules/__init__.py +0 -14
- cognite/neat/rules/models/_rules/_types/__init__.py +0 -66
- cognite/neat/rules/models/_rules/_types/_base.py +0 -450
- cognite/neat/rules/models/_rules/_types/_field.py +0 -339
- cognite/neat/rules/models/_rules/_types/_value.py +0 -156
- cognite/neat/rules/models/_rules/base.py +0 -320
- cognite/neat/rules/models/_rules/dms_architect_rules.py +0 -1034
- cognite/neat/rules/models/_rules/dms_schema.py +0 -641
- cognite/neat/rules/models/_rules/domain_rules.py +0 -55
- cognite/neat/rules/models/_rules/information_rules.py +0 -525
- cognite/neat/rules/models/raw_rules.py +0 -304
- cognite/neat/rules/models/rdfpath.py +0 -238
- cognite/neat/rules/models/rules.py +0 -1269
- cognite/neat/rules/models/tables.py +0 -9
- cognite/neat/rules/models/value_types.py +0 -117
- cognite/neat/utils/__init__.py +0 -3
- cognite/neat/utils/auxiliary.py +0 -11
- cognite/neat/utils/cdf.py +0 -24
- cognite/neat/utils/cdf_loaders/__init__.py +0 -25
- cognite/neat/utils/cdf_loaders/_base.py +0 -62
- cognite/neat/utils/cdf_loaders/_data_modeling.py +0 -275
- cognite/neat/utils/cdf_loaders/_ingestion.py +0 -152
- cognite/neat/utils/cdf_loaders/data_classes.py +0 -121
- cognite/neat/utils/exceptions.py +0 -41
- cognite/neat/utils/spreadsheet.py +0 -84
- cognite/neat/utils/text.py +0 -104
- cognite/neat/utils/utils.py +0 -354
- cognite/neat/utils/xml.py +0 -37
- cognite/neat/workflows/__init__.py +0 -12
- cognite/neat/workflows/_exceptions.py +0 -41
- cognite/neat/workflows/base.py +0 -574
- cognite/neat/workflows/cdf_store.py +0 -393
- cognite/neat/workflows/examples/Export DMS/workflow.yaml +0 -89
- cognite/neat/workflows/examples/Export Rules to Ontology/workflow.yaml +0 -152
- cognite/neat/workflows/examples/Extract DEXPI Graph and Export Rules/workflow.yaml +0 -139
- cognite/neat/workflows/examples/Extract RDF Graph and Generate Assets/workflow.yaml +0 -270
- cognite/neat/workflows/examples/Import DMS/workflow.yaml +0 -65
- cognite/neat/workflows/examples/Ontology to Data Model/workflow.yaml +0 -116
- cognite/neat/workflows/examples/Validate Rules/workflow.yaml +0 -67
- cognite/neat/workflows/examples/Validate Solution Model/workflow.yaml +0 -64
- cognite/neat/workflows/examples/Visualize Data Model Using Mock Graph/workflow.yaml +0 -95
- cognite/neat/workflows/examples/Visualize Semantic Data Model/workflow.yaml +0 -111
- cognite/neat/workflows/manager.py +0 -309
- cognite/neat/workflows/migration/steps.py +0 -93
- cognite/neat/workflows/migration/wf_manifests.py +0 -33
- cognite/neat/workflows/model.py +0 -202
- cognite/neat/workflows/steps/data_contracts.py +0 -140
- cognite/neat/workflows/steps/lib/__init__.py +0 -7
- cognite/neat/workflows/steps/lib/graph_extractor.py +0 -123
- cognite/neat/workflows/steps/lib/graph_loader.py +0 -68
- cognite/neat/workflows/steps/lib/graph_store.py +0 -139
- cognite/neat/workflows/steps/lib/io_steps.py +0 -393
- cognite/neat/workflows/steps/lib/rules_exporter.py +0 -453
- cognite/neat/workflows/steps/lib/rules_importer.py +0 -171
- cognite/neat/workflows/steps/lib/rules_validator.py +0 -102
- cognite/neat/workflows/steps/lib/v1/__init__.py +0 -7
- cognite/neat/workflows/steps/lib/v1/graph_contextualization.py +0 -82
- cognite/neat/workflows/steps/lib/v1/graph_extractor.py +0 -644
- cognite/neat/workflows/steps/lib/v1/graph_loader.py +0 -606
- cognite/neat/workflows/steps/lib/v1/graph_store.py +0 -278
- cognite/neat/workflows/steps/lib/v1/graph_transformer.py +0 -58
- cognite/neat/workflows/steps/lib/v1/rules_exporter.py +0 -513
- cognite/neat/workflows/steps/lib/v1/rules_importer.py +0 -612
- cognite/neat/workflows/steps/step_model.py +0 -83
- cognite/neat/workflows/steps_registry.py +0 -212
- cognite/neat/workflows/tasks.py +0 -18
- cognite/neat/workflows/triggers.py +0 -169
- cognite/neat/workflows/utils.py +0 -19
- cognite_neat-0.70.1.dist-info/METADATA +0 -212
- cognite_neat-0.70.1.dist-info/RECORD +0 -234
- cognite_neat-0.70.1.dist-info/entry_points.txt +0 -3
- /cognite/neat/{app/api → _data_model}/__init__.py +0 -0
- /cognite/neat/{app/api/data_classes → _data_model/deployer}/__init__.py +0 -0
- /cognite/neat/{app/api/utils → _data_model/exporters/_table_exporter}/__init__.py +0 -0
- /cognite/neat/{app/monitoring → _data_model/importers/_table_importer}/__init__.py +0 -0
- /cognite/neat/{graph/extractors → _data_model/models}/__init__.py +0 -0
- /cognite/neat/{graph/loader/core → _data_model/models/conceptual}/__init__.py +0 -0
- /cognite/neat/{graph/transformation → _data_model/validation}/__init__.py +0 -0
- /cognite/neat/{rules → _session/_html}/__init__.py +0 -0
- /cognite/neat/{rules/_analysis → _session/_usage_analytics}/__init__.py +0 -0
- /cognite/neat/{workflows/migration → _utils}/__init__.py +0 -0
- /cognite/neat/{workflows/steps → v0}/__init__.py +0 -0
- /cognite/neat/{graph → v0/core/_instances}/examples/Knowledge-Graph-Nordic44-dirty.xml +0 -0
- /cognite/neat/{graph → v0/core/_instances}/examples/Knowledge-Graph-Nordic44.xml +0 -0
- /cognite/neat/{graph → v0/core/_instances}/examples/__init__.py +0 -0
- /cognite/neat/{graph → v0/core/_instances}/examples/skos-capturing-sheet-wind-topics.xlsx +0 -0
- {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
|
+
)
|