cognite-neat 0.75.7__py3-none-any.whl → 0.75.9__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.

Potentially problematic release.


This version of cognite-neat might be problematic. Click here for more details.

Files changed (103) hide show
  1. cognite/neat/_version.py +1 -1
  2. cognite/neat/app/api/configuration.py +4 -9
  3. cognite/neat/app/api/routers/configuration.py +2 -1
  4. cognite/neat/app/api/routers/crud.py +5 -5
  5. cognite/neat/app/api/routers/data_exploration.py +3 -1
  6. cognite/neat/app/api/routers/rules.py +3 -3
  7. cognite/neat/app/api/routers/workflows.py +3 -3
  8. cognite/neat/app/ui/neat-app/build/asset-manifest.json +3 -3
  9. cognite/neat/app/ui/neat-app/build/index.html +1 -1
  10. cognite/neat/app/ui/neat-app/build/static/js/{main.4345d42f.js → main.ec7f72e2.js} +3 -3
  11. cognite/neat/app/ui/neat-app/build/static/js/{main.4345d42f.js.map → main.ec7f72e2.js.map} +1 -1
  12. cognite/neat/config.py +147 -12
  13. cognite/neat/constants.py +1 -0
  14. cognite/neat/graph/exceptions.py +1 -2
  15. cognite/neat/graph/extractors/_mock_graph_generator.py +6 -5
  16. cognite/neat/legacy/graph/exceptions.py +1 -2
  17. cognite/neat/legacy/graph/extractors/_mock_graph_generator.py +1 -2
  18. cognite/neat/legacy/graph/loaders/_asset_loader.py +8 -13
  19. cognite/neat/legacy/graph/loaders/_base.py +2 -4
  20. cognite/neat/legacy/graph/loaders/_exceptions.py +1 -3
  21. cognite/neat/legacy/graph/loaders/core/rdf_to_assets.py +4 -8
  22. cognite/neat/legacy/graph/loaders/core/rdf_to_relationships.py +2 -4
  23. cognite/neat/legacy/graph/loaders/rdf_to_dms.py +2 -4
  24. cognite/neat/legacy/graph/loaders/validator.py +1 -1
  25. cognite/neat/legacy/graph/transformations/transformer.py +1 -2
  26. cognite/neat/legacy/rules/exporters/_rules2dms.py +1 -2
  27. cognite/neat/legacy/rules/exporters/_validation.py +4 -8
  28. cognite/neat/legacy/rules/importers/_base.py +0 -4
  29. cognite/neat/legacy/rules/importers/_dms2rules.py +0 -2
  30. cognite/neat/legacy/rules/models/rdfpath.py +1 -2
  31. cognite/neat/legacy/workflows/examples/Export_DMS/workflow.yaml +89 -0
  32. cognite/neat/legacy/workflows/examples/Export_Rules_to_Ontology/workflow.yaml +152 -0
  33. cognite/neat/legacy/workflows/examples/Extract_DEXPI_Graph_and_Export_Rules/workflow.yaml +139 -0
  34. cognite/neat/legacy/workflows/examples/Extract_RDF_Graph_and_Generate_Assets/workflow.yaml +270 -0
  35. cognite/neat/legacy/workflows/examples/Import_DMS/workflow.yaml +65 -0
  36. cognite/neat/legacy/workflows/examples/Ontology_to_Data_Model/workflow.yaml +116 -0
  37. cognite/neat/legacy/workflows/examples/Validate_Rules/workflow.yaml +67 -0
  38. cognite/neat/legacy/workflows/examples/Validate_Solution_Model/workflow.yaml +64 -0
  39. cognite/neat/legacy/workflows/examples/Visualize_Data_Model_Using_Mock_Graph/workflow.yaml +95 -0
  40. cognite/neat/legacy/workflows/examples/Visualize_Semantic_Data_Model/workflow.yaml +111 -0
  41. cognite/neat/rules/analysis/_base.py +1 -1
  42. cognite/neat/rules/analysis/_information_rules.py +4 -4
  43. cognite/neat/rules/exporters/_rules2excel.py +2 -2
  44. cognite/neat/rules/exporters/_rules2ontology.py +20 -17
  45. cognite/neat/rules/exporters/_validation.py +8 -10
  46. cognite/neat/rules/importers/_base.py +2 -4
  47. cognite/neat/rules/importers/_dms2rules.py +16 -19
  48. cognite/neat/rules/importers/_dtdl2rules/dtdl_converter.py +21 -19
  49. cognite/neat/rules/importers/_dtdl2rules/dtdl_importer.py +2 -4
  50. cognite/neat/rules/importers/_dtdl2rules/spec.py +3 -5
  51. cognite/neat/rules/importers/_owl2rules/_owl2rules.py +4 -6
  52. cognite/neat/rules/importers/_spreadsheet2rules.py +10 -9
  53. cognite/neat/rules/importers/_yaml2rules.py +10 -6
  54. cognite/neat/rules/issues/dms.py +3 -5
  55. cognite/neat/rules/issues/formatters.py +3 -1
  56. cognite/neat/rules/models/data_types.py +54 -31
  57. cognite/neat/rules/models/entities.py +184 -42
  58. cognite/neat/rules/models/rdfpath.py +112 -13
  59. cognite/neat/rules/models/rules/_base.py +2 -2
  60. cognite/neat/rules/models/rules/_dms_architect_rules.py +119 -189
  61. cognite/neat/rules/models/rules/_dms_rules_write.py +344 -0
  62. cognite/neat/rules/models/rules/_dms_schema.py +3 -3
  63. cognite/neat/rules/models/rules/_domain_rules.py +6 -3
  64. cognite/neat/rules/models/rules/_information_rules.py +68 -61
  65. cognite/neat/rules/models/rules/_types/__init__.py +0 -47
  66. cognite/neat/rules/models/rules/_types/_base.py +1 -309
  67. cognite/neat/rules/models/rules/_types/_field.py +0 -225
  68. cognite/neat/utils/cdf_loaders/_data_modeling.py +3 -1
  69. cognite/neat/utils/cdf_loaders/_ingestion.py +2 -4
  70. cognite/neat/utils/spreadsheet.py +2 -4
  71. cognite/neat/utils/utils.py +2 -4
  72. cognite/neat/workflows/base.py +5 -5
  73. cognite/neat/workflows/manager.py +32 -22
  74. cognite/neat/workflows/model.py +3 -3
  75. cognite/neat/workflows/steps/lib/__init__.py +0 -7
  76. cognite/neat/workflows/steps/lib/current/__init__.py +6 -0
  77. cognite/neat/workflows/steps/lib/{rules_exporter.py → current/rules_exporter.py} +8 -8
  78. cognite/neat/workflows/steps/lib/{rules_importer.py → current/rules_importer.py} +7 -7
  79. cognite/neat/workflows/steps/lib/io/__init__.py +1 -0
  80. cognite/neat/workflows/steps/lib/{v1 → legacy}/graph_contextualization.py +2 -2
  81. cognite/neat/workflows/steps/lib/{v1 → legacy}/graph_extractor.py +9 -9
  82. cognite/neat/workflows/steps/lib/{v1 → legacy}/graph_loader.py +9 -9
  83. cognite/neat/workflows/steps/lib/{v1 → legacy}/graph_store.py +4 -4
  84. cognite/neat/workflows/steps/lib/{v1 → legacy}/graph_transformer.py +2 -2
  85. cognite/neat/workflows/steps/lib/{v1 → legacy}/rules_exporter.py +15 -17
  86. cognite/neat/workflows/steps/lib/{v1 → legacy}/rules_importer.py +7 -7
  87. cognite/neat/workflows/steps/step_model.py +5 -9
  88. cognite/neat/workflows/steps_registry.py +20 -11
  89. {cognite_neat-0.75.7.dist-info → cognite_neat-0.75.9.dist-info}/METADATA +1 -1
  90. {cognite_neat-0.75.7.dist-info → cognite_neat-0.75.9.dist-info}/RECORD +100 -90
  91. cognite/neat/app/api/data_classes/configuration.py +0 -121
  92. cognite/neat/rules/models/_entity.py +0 -142
  93. cognite/neat/rules/models/rules/_types/_value.py +0 -159
  94. /cognite/neat/app/ui/neat-app/build/static/js/{main.4345d42f.js.LICENSE.txt → main.ec7f72e2.js.LICENSE.txt} +0 -0
  95. /cognite/neat/workflows/steps/lib/{graph_extractor.py → current/graph_extractor.py} +0 -0
  96. /cognite/neat/workflows/steps/lib/{graph_loader.py → current/graph_loader.py} +0 -0
  97. /cognite/neat/workflows/steps/lib/{graph_store.py → current/graph_store.py} +0 -0
  98. /cognite/neat/workflows/steps/lib/{rules_validator.py → current/rules_validator.py} +0 -0
  99. /cognite/neat/workflows/steps/lib/{io_steps.py → io/io_steps.py} +0 -0
  100. /cognite/neat/workflows/steps/lib/{v1 → legacy}/__init__.py +0 -0
  101. {cognite_neat-0.75.7.dist-info → cognite_neat-0.75.9.dist-info}/LICENSE +0 -0
  102. {cognite_neat-0.75.7.dist-info → cognite_neat-0.75.9.dist-info}/WHEEL +0 -0
  103. {cognite_neat-0.75.7.dist-info → cognite_neat-0.75.9.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,344 @@
1
+ from collections.abc import Sequence
2
+ from dataclasses import dataclass
3
+ from datetime import datetime
4
+ from typing import Any, Literal, cast, overload
5
+
6
+ from pydantic import BaseModel
7
+
8
+ from cognite.neat.rules.models.data_types import DataType
9
+ from cognite.neat.rules.models.entities import (
10
+ ClassEntity,
11
+ ContainerEntity,
12
+ DMSUnknownEntity,
13
+ Unknown,
14
+ ViewEntity,
15
+ ViewPropertyEntity,
16
+ )
17
+
18
+ from ._base import ExtensionCategory, SchemaCompleteness
19
+ from ._dms_architect_rules import DMSContainer, DMSMetadata, DMSProperty, DMSRules, DMSView
20
+
21
+
22
+ @dataclass
23
+ class DMSMetadataWrite:
24
+ schema_: Literal["complete", "partial", "extended"]
25
+ space: str
26
+ external_id: str
27
+ creator: str
28
+ version: str
29
+ extension: Literal["addition", "reshape", "rebuild"] = "addition"
30
+ name: str | None = None
31
+ description: str | None = None
32
+ created: datetime | str | None = None
33
+ updated: datetime | str | None = None
34
+ default_view_version: str | None = None
35
+
36
+ @classmethod
37
+ def load(cls, data: dict[str, Any] | None) -> "DMSMetadataWrite | None":
38
+ if data is None:
39
+ return None
40
+ _add_alias(data, DMSMetadata)
41
+ return cls(
42
+ schema_=data.get("schema_"), # type: ignore[arg-type]
43
+ space=data.get("space"), # type: ignore[arg-type]
44
+ external_id=data.get("external_id"), # type: ignore[arg-type]
45
+ creator=data.get("creator"), # type: ignore[arg-type]
46
+ version=data.get("version"), # type: ignore[arg-type]
47
+ extension=data.get("extension", "addition"),
48
+ name=data.get("name"),
49
+ description=data.get("description"),
50
+ created=data.get("created"),
51
+ updated=data.get("updated"),
52
+ default_view_version=data.get("default_view_version"),
53
+ )
54
+
55
+ def dump(self) -> dict[str, Any]:
56
+ return dict(
57
+ schema=SchemaCompleteness(self.schema_),
58
+ extension=ExtensionCategory(self.extension),
59
+ space=self.space,
60
+ externalId=self.external_id,
61
+ creator=self.creator,
62
+ version=self.version,
63
+ name=self.name,
64
+ description=self.description,
65
+ created=self.created or datetime.now(),
66
+ updated=self.updated or datetime.now(),
67
+ default_view_version=self.default_view_version or self.version,
68
+ )
69
+
70
+
71
+ @dataclass
72
+ class DMSPropertyWrite:
73
+ view: str
74
+ view_property: str | None
75
+ value_type: str
76
+ property_: str | None
77
+ class_: str | None = None
78
+ name: str | None = None
79
+ description: str | None = None
80
+ relation: Literal["direct", "reversedirect", "multiedge"] | None = None
81
+ nullable: bool | None = None
82
+ is_list: bool | None = None
83
+ default: str | int | dict | None = None
84
+ reference: str | None = None
85
+ container: str | None = None
86
+ container_property: str | None = None
87
+ index: str | list[str] | None = None
88
+ constraint: str | list[str] | None = None
89
+
90
+ @classmethod
91
+ @overload
92
+ def load(cls, data: None) -> None: ...
93
+
94
+ @classmethod
95
+ @overload
96
+ def load(cls, data: dict[str, Any]) -> "DMSPropertyWrite": ...
97
+
98
+ @classmethod
99
+ @overload
100
+ def load(cls, data: list[dict[str, Any]]) -> list["DMSPropertyWrite"]: ...
101
+
102
+ @classmethod
103
+ def load(
104
+ cls, data: dict[str, Any] | list[dict[str, Any]] | None
105
+ ) -> "DMSPropertyWrite | list[DMSPropertyWrite] | None":
106
+ if data is None:
107
+ return None
108
+ if isinstance(data, list) or (isinstance(data, dict) and isinstance(data.get("data"), list)):
109
+ items = cast(list[dict[str, Any]], data.get("data") if isinstance(data, dict) else data)
110
+ return [loaded for item in items if (loaded := cls.load(item)) is not None]
111
+
112
+ _add_alias(data, DMSProperty)
113
+ return cls(
114
+ view=data.get("view"), # type: ignore[arg-type]
115
+ view_property=data.get("view_property"), # type: ignore[arg-type]
116
+ value_type=data.get("value_type"), # type: ignore[arg-type]
117
+ property_=data.get("property_"),
118
+ class_=data.get("class_"),
119
+ name=data.get("name"),
120
+ description=data.get("description"),
121
+ relation=data.get("relation"),
122
+ nullable=data.get("nullable"),
123
+ is_list=data.get("is_list"),
124
+ default=data.get("default"),
125
+ reference=data.get("reference"),
126
+ container=data.get("container"),
127
+ container_property=data.get("container_property"),
128
+ index=data.get("index"),
129
+ constraint=data.get("constraint"),
130
+ )
131
+
132
+ def dump(self, default_space: str, default_version: str) -> dict[str, Any]:
133
+ value_type: DataType | ViewPropertyEntity | ViewEntity | DMSUnknownEntity
134
+ if DataType.is_data_type(self.value_type):
135
+ value_type = DataType.load(self.value_type)
136
+ elif self.value_type == str(Unknown):
137
+ value_type = DMSUnknownEntity()
138
+ else:
139
+ try:
140
+ value_type = ViewPropertyEntity.load(self.value_type, space=default_space, version=default_version)
141
+ except ValueError:
142
+ value_type = ViewEntity.load(self.value_type, space=default_space, version=default_version)
143
+
144
+ return {
145
+ "View": ViewEntity.load(self.view, space=default_space, version=default_version),
146
+ "ViewProperty": self.view_property,
147
+ "Value Type": value_type,
148
+ "Property": self.property_ or self.view_property,
149
+ "Class": ClassEntity.load(self.class_, prefix=default_space, version=default_version)
150
+ if self.class_
151
+ else None,
152
+ "Name": self.name,
153
+ "Description": self.description,
154
+ "Relation": self.relation,
155
+ "Nullable": self.nullable,
156
+ "IsList": self.is_list,
157
+ "Default": self.default,
158
+ "Reference": self.reference,
159
+ "Container": ContainerEntity.load(self.container, space=default_space, version=default_version)
160
+ if self.container
161
+ else None,
162
+ "ContainerProperty": self.container_property,
163
+ "Index": self.index,
164
+ "Constraint": self.constraint,
165
+ }
166
+
167
+
168
+ @dataclass
169
+ class DMSContainerWrite:
170
+ container: str
171
+ class_: str | None = None
172
+ name: str | None = None
173
+ description: str | None = None
174
+ reference: str | None = None
175
+ constraint: str | None = None
176
+
177
+ @classmethod
178
+ @overload
179
+ def load(cls, data: None) -> None: ...
180
+
181
+ @classmethod
182
+ @overload
183
+ def load(cls, data: dict[str, Any]) -> "DMSContainerWrite": ...
184
+
185
+ @classmethod
186
+ @overload
187
+ def load(cls, data: list[dict[str, Any]]) -> list["DMSContainerWrite"]: ...
188
+
189
+ @classmethod
190
+ def load(
191
+ cls, data: dict[str, Any] | list[dict[str, Any]] | None
192
+ ) -> "DMSContainerWrite | list[DMSContainerWrite] | None":
193
+ if data is None:
194
+ return None
195
+ if isinstance(data, list) or (isinstance(data, dict) and isinstance(data.get("data"), list)):
196
+ items = cast(list[dict[str, Any]], data.get("data") if isinstance(data, dict) else data)
197
+ return [loaded for item in items if (loaded := cls.load(item)) is not None]
198
+
199
+ _add_alias(data, DMSContainer)
200
+ return cls(
201
+ container=data.get("container"), # type: ignore[arg-type]
202
+ class_=data.get("class_"),
203
+ name=data.get("name"),
204
+ description=data.get("description"),
205
+ reference=data.get("reference"),
206
+ constraint=data.get("constraint"),
207
+ )
208
+
209
+ def dump(self, default_space: str) -> dict[str, Any]:
210
+ container = ContainerEntity.load(self.container, space=default_space)
211
+ return dict(
212
+ Container=container,
213
+ Class=ClassEntity.load(self.class_, prefix=default_space) if self.class_ else container.as_class(),
214
+ Name=self.name,
215
+ Description=self.description,
216
+ Reference=self.reference,
217
+ Constraint=[
218
+ ContainerEntity.load(constraint.strip(), space=default_space)
219
+ for constraint in self.constraint.split(",")
220
+ ]
221
+ if self.constraint
222
+ else None,
223
+ )
224
+
225
+
226
+ @dataclass
227
+ class DMSViewWrite:
228
+ view: str
229
+ class_: str | None = None
230
+ name: str | None = None
231
+ description: str | None = None
232
+ implements: str | None = None
233
+ reference: str | None = None
234
+ filter_: Literal["hasData", "nodeType"] | None = None
235
+ in_model: bool = True
236
+
237
+ @classmethod
238
+ @overload
239
+ def load(cls, data: None) -> None: ...
240
+
241
+ @classmethod
242
+ @overload
243
+ def load(cls, data: dict[str, Any]) -> "DMSViewWrite": ...
244
+
245
+ @classmethod
246
+ @overload
247
+ def load(cls, data: list[dict[str, Any]]) -> list["DMSViewWrite"]: ...
248
+
249
+ @classmethod
250
+ def load(cls, data: dict[str, Any] | list[dict[str, Any]] | None) -> "DMSViewWrite | list[DMSViewWrite] | None":
251
+ if data is None:
252
+ return None
253
+ if isinstance(data, list) or (isinstance(data, dict) and isinstance(data.get("data"), list)):
254
+ items = cast(list[dict[str, Any]], data.get("data") if isinstance(data, dict) else data)
255
+ return [loaded for item in items if (loaded := cls.load(item)) is not None]
256
+ _add_alias(data, DMSView)
257
+
258
+ return cls(
259
+ view=data.get("view"), # type: ignore[arg-type]
260
+ class_=data.get("class"),
261
+ name=data.get("name"),
262
+ description=data.get("description"),
263
+ implements=data.get("implements"),
264
+ reference=data.get("reference"),
265
+ filter_=data.get("filter_"),
266
+ in_model=data.get("in_model", True),
267
+ )
268
+
269
+ def dump(self, default_space: str, default_version: str) -> dict[str, Any]:
270
+ view = ViewEntity.load(self.view, space=default_space, version=default_version)
271
+ return dict(
272
+ View=view,
273
+ Class=ClassEntity.load(self.class_, prefix=default_space, version=default_version)
274
+ if self.class_
275
+ else view.as_class(),
276
+ Name=self.name,
277
+ Description=self.description,
278
+ Implements=[
279
+ ViewEntity.load(implement, space=default_space, version=default_version)
280
+ for implement in self.implements.split(",")
281
+ ]
282
+ if self.implements
283
+ else None,
284
+ Reference=self.reference,
285
+ Filter=self.filter_,
286
+ InModel=self.in_model,
287
+ )
288
+
289
+
290
+ @dataclass
291
+ class DMSRulesWrite:
292
+ metadata: DMSMetadataWrite
293
+ properties: Sequence[DMSPropertyWrite]
294
+ views: Sequence[DMSViewWrite]
295
+ containers: Sequence[DMSContainerWrite] | None = None
296
+ reference: "DMSRulesWrite | DMSRules | None" = None
297
+
298
+ @classmethod
299
+ @overload
300
+ def load(cls, data: dict[str, Any]) -> "DMSRulesWrite": ...
301
+
302
+ @classmethod
303
+ @overload
304
+ def load(cls, data: None) -> None: ...
305
+
306
+ @classmethod
307
+ def load(cls, data: dict | None) -> "DMSRulesWrite | None":
308
+ if data is None:
309
+ return None
310
+ _add_alias(data, DMSRules)
311
+ return cls(
312
+ metadata=DMSMetadataWrite.load(data.get("metadata")), # type: ignore[arg-type]
313
+ properties=DMSPropertyWrite.load(data.get("properties")), # type: ignore[arg-type]
314
+ views=DMSViewWrite.load(data.get("views")), # type: ignore[arg-type]
315
+ containers=DMSContainerWrite.load(data.get("containers")) or [],
316
+ reference=DMSRulesWrite.load(data.get("reference")),
317
+ )
318
+
319
+ def as_read(self) -> DMSRules:
320
+ return DMSRules.model_validate(self.dump())
321
+
322
+ def dump(self) -> dict[str, Any]:
323
+ default_space = self.metadata.space
324
+ default_version = self.metadata.version
325
+ reference: dict[str, Any] | None = None
326
+ if isinstance(self.reference, DMSRulesWrite):
327
+ reference = self.reference.dump()
328
+ elif isinstance(self.reference, DMSRules):
329
+ # We need to load through the DMSRulesWrite to set the correct default space and version
330
+ reference = DMSRulesWrite.load(self.reference.model_dump()).dump()
331
+
332
+ return dict(
333
+ Metadata=self.metadata.dump(),
334
+ Properties=[prop.dump(default_space, default_version) for prop in self.properties],
335
+ Views=[view.dump(default_space, default_version) for view in self.views],
336
+ Containers=[container.dump(default_space) for container in self.containers or []] or None,
337
+ Reference=reference,
338
+ )
339
+
340
+
341
+ def _add_alias(data: dict[str, Any], base_model: type[BaseModel]) -> None:
342
+ for field_name, field_ in base_model.model_fields.items():
343
+ if field_name not in data and field_.alias in data:
344
+ data[field_name] = data[field_.alias]
@@ -27,7 +27,7 @@ from cognite.neat.rules.issues.dms import (
27
27
  MissingSpaceError,
28
28
  MissingViewError,
29
29
  )
30
- from cognite.neat.rules.models.rules._types._value import DMS_VALUE_TYPE_MAPPINGS
30
+ from cognite.neat.rules.models.data_types import _DATA_TYPE_BY_DMS_TYPE
31
31
  from cognite.neat.utils.cdf_loaders import ViewLoader
32
32
  from cognite.neat.utils.cdf_loaders.data_classes import RawTableWrite, RawTableWriteList
33
33
  from cognite.neat.utils.text import to_camel
@@ -577,8 +577,8 @@ class PipelineSchema(DMSSchema):
577
577
  container = container_by_id.get(prop.container)
578
578
  if container is not None:
579
579
  dms_type = container.properties[prop.container_property_identifier].type._type
580
- if dms_type in DMS_VALUE_TYPE_MAPPINGS:
581
- sql_type = DMS_VALUE_TYPE_MAPPINGS[dms_type].sql
580
+ if dms_type in _DATA_TYPE_BY_DMS_TYPE:
581
+ sql_type = _DATA_TYPE_BY_DMS_TYPE[dms_type].sql
582
582
  else:
583
583
  warnings.warn(
584
584
  f"Unknown DMS type '{dms_type}' for property '{prop_name}'", RuntimeWarning, stacklevel=2
@@ -4,6 +4,9 @@ from typing import Any, ClassVar
4
4
  from pydantic import Field, field_serializer, field_validator, model_serializer
5
5
  from pydantic_core.core_schema import SerializationInfo
6
6
 
7
+ from cognite.neat.rules.models.data_types import DataType
8
+ from cognite.neat.rules.models.entities import ClassEntity, ParentEntityList
9
+
7
10
  from ._base import (
8
11
  BaseMetadata,
9
12
  RoleTypes,
@@ -11,7 +14,7 @@ from ._base import (
11
14
  SheetEntity,
12
15
  SheetList,
13
16
  )
14
- from ._types import ParentClassType, PropertyType, SemanticValueType, StrOrListType
17
+ from ._types import PropertyType, StrOrListType
15
18
 
16
19
 
17
20
  class DomainMetadata(BaseMetadata):
@@ -21,7 +24,7 @@ class DomainMetadata(BaseMetadata):
21
24
 
22
25
  class DomainProperty(SheetEntity):
23
26
  property_: PropertyType = Field(alias="Property")
24
- value_type: SemanticValueType = Field(alias="Value Type")
27
+ value_type: DataType | ClassEntity = Field(alias="Value Type")
25
28
  min_count: int | None = Field(alias="Min Count", default=None)
26
29
  max_count: int | float | None = Field(alias="Max Count", default=None)
27
30
 
@@ -40,7 +43,7 @@ class DomainProperty(SheetEntity):
40
43
 
41
44
  class DomainClass(SheetEntity):
42
45
  description: str | None = Field(None, alias="Description")
43
- parent: ParentClassType = Field(alias="Parent Class")
46
+ parent: ParentEntityList | None = Field(alias="Parent Class")
44
47
 
45
48
 
46
49
  class DomainRules(RuleModel):