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

cognite/neat/_version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.78.3"
1
+ __version__ = "0.78.4"
@@ -0,0 +1,4 @@
1
+ from ._classic_cdf._asset_hierarchy import AssetHierarchyExtractor
2
+ from ._mock_graph_generator import MockGraphGenerator
3
+
4
+ __all__ = ["AssetHierarchyExtractor", "MockGraphGenerator"]
File without changes
@@ -0,0 +1,100 @@
1
+ from collections.abc import Iterable
2
+ from datetime import datetime
3
+ from pathlib import Path
4
+ from typing import cast
5
+
6
+ import pytz
7
+ from cognite.client import CogniteClient
8
+ from cognite.client.data_classes import Asset, AssetList
9
+ from rdflib import RDF, Literal, Namespace
10
+
11
+ from cognite.neat.constants import DEFAULT_NAMESPACE
12
+ from cognite.neat.graph.extractors._base import BaseExtractor
13
+ from cognite.neat.graph.models import Triple
14
+ from cognite.neat.utils.utils import string_to_ideal_type
15
+
16
+
17
+ class AssetHierarchyExtractor(BaseExtractor):
18
+ def __init__(
19
+ self,
20
+ assets: Iterable[Asset],
21
+ namespace: Namespace | None = None,
22
+ ):
23
+ self.namespace = namespace or DEFAULT_NAMESPACE
24
+ self.assets = assets
25
+
26
+ @classmethod
27
+ def from_dataset(
28
+ cls,
29
+ client: CogniteClient,
30
+ data_set_external_id: str,
31
+ namespace: Namespace | None = None,
32
+ ):
33
+ return cls(cast(Iterable[Asset], client.assets(data_set_external_ids=data_set_external_id)), namespace)
34
+
35
+ @classmethod
36
+ def from_hierarchy(cls, client: CogniteClient, root_asset_external_id: str, namespace: Namespace | None = None):
37
+ return cls(cast(Iterable[Asset], client.assets(asset_subtree_external_ids=root_asset_external_id)), namespace)
38
+
39
+ @classmethod
40
+ def from_file(cls, file_path: str, namespace: Namespace | None = None):
41
+ return cls(AssetList.load(Path(file_path).read_text()), namespace)
42
+
43
+ def extract(self) -> Iterable[Triple]:
44
+ """Extracts an asset with the given asset_id."""
45
+ for asset in self.assets:
46
+ yield from self._asset2triples(asset, self.namespace)
47
+
48
+ @classmethod
49
+ def _asset2triples(cls, asset: Asset, namespace: Namespace) -> list[Triple]:
50
+ """Converts an asset to triples."""
51
+ triples: list[Triple] = [(namespace[str(asset.id)], RDF.type, namespace["Asset"])]
52
+
53
+ if asset.name:
54
+ triples.append((namespace[str(asset.id)], namespace["name"], Literal(asset.name)))
55
+
56
+ if asset.description:
57
+ triples.append((namespace[str(asset.id)], namespace["description"], Literal(asset.description)))
58
+
59
+ if asset.external_id:
60
+ triples.append((namespace[str(asset.id)], namespace["externalId"], Literal(asset.external_id)))
61
+
62
+ if asset.source:
63
+ triples.append((namespace[str(asset.id)], namespace["source"], Literal(asset.source)))
64
+
65
+ # properties ref creation and update
66
+ triples.append(
67
+ (
68
+ namespace[str(asset.id)],
69
+ namespace["createdTime"],
70
+ Literal(datetime.fromtimestamp(asset.created_time / 1000, pytz.utc)),
71
+ )
72
+ )
73
+ triples.append(
74
+ (
75
+ namespace[str(asset.id)],
76
+ namespace["lastUpdatedTime"],
77
+ Literal(datetime.fromtimestamp(asset.last_updated_time / 1000, pytz.utc)),
78
+ )
79
+ )
80
+
81
+ if asset.parent_id:
82
+ triples.append((namespace[str(asset.id)], namespace["parent"], namespace[str(asset.parent_id)]))
83
+
84
+ if asset.root_id:
85
+ triples.append((namespace[str(asset.id)], namespace["root"], namespace[str(asset.root_id)]))
86
+
87
+ if asset.data_set_id:
88
+ triples.append((namespace[str(asset.id)], namespace["dataset"], namespace[str(asset.data_set_id)]))
89
+
90
+ if asset.labels:
91
+ for label in asset.labels:
92
+ # external_id can create ill-formed URIs, so we opt for Literal instead
93
+ triples.append((namespace[str(asset.id)], namespace["label"], Literal(label.dump()["externalId"])))
94
+
95
+ if asset.metadata:
96
+ for key, value in asset.metadata.items():
97
+ if value:
98
+ triples.append((namespace[str(asset.id)], namespace[key], Literal(string_to_ideal_type(value))))
99
+
100
+ return triples
@@ -355,3 +355,27 @@ def get_inheritance_path(child: Any, child_parent: dict[Any, list[Any]]) -> list
355
355
 
356
356
  def replace_non_alphanumeric_with_underscore(text):
357
357
  return re.sub(r"\W+", "_", text)
358
+
359
+
360
+ def string_to_ideal_type(input_string: str) -> int | bool | float | datetime | str:
361
+ try:
362
+ # Try converting to int
363
+ return int(input_string)
364
+ except ValueError:
365
+ try:
366
+ # Try converting to float
367
+ return float(input_string) # type: ignore
368
+ except ValueError:
369
+ if input_string.lower() == "true":
370
+ # Return True if input is 'true'
371
+ return True
372
+ elif input_string.lower() == "false":
373
+ # Return False if input is 'false'
374
+ return False
375
+ else:
376
+ try:
377
+ # Try converting to datetime
378
+ return datetime.fromisoformat(input_string) # type: ignore
379
+ except ValueError:
380
+ # Return the input string if no conversion is possible
381
+ return input_string
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cognite-neat
3
- Version: 0.78.3
3
+ Version: 0.78.4
4
4
  Summary: Knowledge graph transformation
5
5
  Home-page: https://cognite-neat.readthedocs-hosted.com/
6
6
  License: Apache-2.0
@@ -1,5 +1,5 @@
1
1
  cognite/neat/__init__.py,sha256=v-rRiDOgZ3sQSMQKq0vgUQZvpeOkoHFXissAx6Ktg84,61
2
- cognite/neat/_version.py,sha256=oEHe9RtsScnXCOzPdKOEz68VfnXPGqwRpt9BirfOZTw,23
2
+ cognite/neat/_version.py,sha256=4qUludpNixgmhGKESx2FYWVdHE0dHtestyzPDEVZ-iA,23
3
3
  cognite/neat/app/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  cognite/neat/app/api/asgi/metrics.py,sha256=nxFy7L5cChTI0a-zkCiJ59Aq8yLuIJp5c9Dg0wRXtV0,152
5
5
  cognite/neat/app/api/configuration.py,sha256=2U5M6M252swvQPQyooA1EBzFUZNtcTmuSaywfJDgckM,4232
@@ -49,8 +49,10 @@ cognite/neat/graph/examples/Knowledge-Graph-Nordic44.xml,sha256=U2Ns-M4LRjT1fBkh
49
49
  cognite/neat/graph/examples/__init__.py,sha256=yAjHVY3b5jOjmbW-iLbhvu7BG014TpGi3K4igkDqW5I,368
50
50
  cognite/neat/graph/examples/skos-capturing-sheet-wind-topics.xlsx,sha256=CV_yK5ZSbYS_ktfIZUPD8Sevs47zpswLXQUDFkGE4Gw,45798
51
51
  cognite/neat/graph/exceptions.py,sha256=R6pyOH774n9w2x_X_nrUr8OMAdjJMf_XPIqAvxIQaWo,3401
52
- cognite/neat/graph/extractors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
+ cognite/neat/graph/extractors/__init__.py,sha256=YpoCBdmRyn3Pjav2cAYBi5beEnyJBHu-jB7rh9XpgVE,182
53
53
  cognite/neat/graph/extractors/_base.py,sha256=TOXDnlqske8DgnJwA0THDVRgmR79Acjm56yF0E-2w7I,356
54
+ cognite/neat/graph/extractors/_classic_cdf/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
+ cognite/neat/graph/extractors/_classic_cdf/_asset_hierarchy.py,sha256=p9jrHSxMsqPbkHBnstvktIF4lRgHvxpKvcgxY22YS2k,3851
54
56
  cognite/neat/graph/extractors/_mock_graph_generator.py,sha256=gziG2FFsLk-HmA9uxAeT9RCjVpFxjkCTLiC4tq2zgvw,14961
55
57
  cognite/neat/graph/models.py,sha256=AtLgZh2qyRP6NRetjQCy9qLMuTQB0CH52Zsev-qa2sk,149
56
58
  cognite/neat/graph/stores/__init__.py,sha256=ivvk7STSo-4wuP_CpizKUCPKmt_ufpNWRJUN9Bv5gdY,543
@@ -230,7 +232,7 @@ cognite/neat/utils/cdf_loaders/data_classes.py,sha256=0apspfwVlFltYOZfmk_PNknS3Z
230
232
  cognite/neat/utils/exceptions.py,sha256=-w4cAcvcoWLf-_ZwAl7QV_NysfqtQzIOd1Ti-mpxJgM,981
231
233
  cognite/neat/utils/spreadsheet.py,sha256=LI0c7dlW0zXHkHw0NvB-gg6Df6cDcE3FbiaHBYLXdzQ,2714
232
234
  cognite/neat/utils/text.py,sha256=4bg1_Q0lg7KsoxaDOvXrVyeY78BJN8i-27BlyDzUCls,3082
233
- cognite/neat/utils/utils.py,sha256=gcbBbuUSm7xJhgU7ZRzeNc4eJtDVCS2CdNhbGP9gLq4,12919
235
+ cognite/neat/utils/utils.py,sha256=OOuL0l-pv_8gDJCpXGBx-U9CEYDKQffP9dt8Dbg5kdU,13807
234
236
  cognite/neat/utils/xml.py,sha256=ppLT3lQKVp8wOP-m8-tFY8uB2P4R76l7R_-kUtsABng,992
235
237
  cognite/neat/workflows/__init__.py,sha256=oiKub_U9f5cA0I1nKl5dFkR4BD8_6Be9eMzQ_50PwP0,396
236
238
  cognite/neat/workflows/_exceptions.py,sha256=ugI_X1XNpikAiL8zIggBjcx6q7WvOpRIgvxHrj2Rhr4,1348
@@ -276,8 +278,8 @@ cognite/neat/workflows/steps_registry.py,sha256=fkTX14ZA7_gkUYfWIlx7A1XbCidvqR23
276
278
  cognite/neat/workflows/tasks.py,sha256=dqlJwKAb0jlkl7abbY8RRz3m7MT4SK8-7cntMWkOYjw,788
277
279
  cognite/neat/workflows/triggers.py,sha256=_BLNplzoz0iic367u1mhHMHiUrCwP-SLK6_CZzfODX0,7071
278
280
  cognite/neat/workflows/utils.py,sha256=gKdy3RLG7ctRhbCRwaDIWpL9Mi98zm56-d4jfHDqP1E,453
279
- cognite_neat-0.78.3.dist-info/LICENSE,sha256=W8VmvFia4WHa3Gqxq1Ygrq85McUNqIGDVgtdvzT-XqA,11351
280
- cognite_neat-0.78.3.dist-info/METADATA,sha256=rvUofmdp5RnFDBlXQwKlBytNiizOBnvhA1rJcEOunjg,9306
281
- cognite_neat-0.78.3.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
282
- cognite_neat-0.78.3.dist-info/entry_points.txt,sha256=61FPqiWb25vbqB0KI7znG8nsg_ibLHBvTjYnkPvNFso,50
283
- cognite_neat-0.78.3.dist-info/RECORD,,
281
+ cognite_neat-0.78.4.dist-info/LICENSE,sha256=W8VmvFia4WHa3Gqxq1Ygrq85McUNqIGDVgtdvzT-XqA,11351
282
+ cognite_neat-0.78.4.dist-info/METADATA,sha256=rCJxBd0usi6z7qKES5e_B3x6vTLxlXGQNraOAuXaOIs,9306
283
+ cognite_neat-0.78.4.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
284
+ cognite_neat-0.78.4.dist-info/entry_points.txt,sha256=61FPqiWb25vbqB0KI7znG8nsg_ibLHBvTjYnkPvNFso,50
285
+ cognite_neat-0.78.4.dist-info/RECORD,,