From 3c94723d4889a2a9648646c05b3a052f81e9c1ca Mon Sep 17 00:00:00 2001 From: Peiran Li Date: Sun, 29 Oct 2023 12:11:38 +0100 Subject: [PATCH 1/5] Add ClassDeletion & ObjectPropertyDeletion Add required datatype but not implemented: - ClassDeletion: A node deletion where the owl type is 'owl:Class'. (Symmetrical extension for ClassCreation) - ObjectPropertyDeletion: A node deletion where the owl type is 'ObjectProperty'. (Symmetrical extension for ObjectPropertyCreation) Update for related class references: - ClassDeletionId - ObjectPropertyDeletionId --- src/kgcl_schema/datamodel/kgcl.py | 60 +++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/src/kgcl_schema/datamodel/kgcl.py b/src/kgcl_schema/datamodel/kgcl.py index 074abac6..b26053ab 100644 --- a/src/kgcl_schema/datamodel/kgcl.py +++ b/src/kgcl_schema/datamodel/kgcl.py @@ -273,6 +273,11 @@ class ObjectPropertyCreationId(NodeCreationId): class NodeDeletionId(NodeChangeId): pass +class ClassDeletionId(NodeDeletionId): + pass + +class ObjectPropertyDeletionId(NodeDeletionId): + pass class NodeDirectMergeId(NodeObsoletionId): pass @@ -2252,6 +2257,61 @@ def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]): super().__post_init__(**kwargs) +@dataclass +class ClassDeletion(NodeDeletion): + """ + A node deletion where the owl type is 'owl:Class' + """ + _inherited_slots: ClassVar[List[str]] = [] + + class_class_uri: ClassVar[URIRef] = KGCL.ClassDeletion + class_class_curie: ClassVar[str] = "kgcl:ClassDeletion" + class_name: ClassVar[str] = "ClassDeletion" + class_model_uri: ClassVar[URIRef] = KGCL.ClassDeletion + + id: Union[str, ClassDeletionId] = None + superclass: Optional[Union[str, NodeId]] = None + change_description: Optional[str] = None + + def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]): + if self._is_empty(self.id): + self.MissingRequiredField("id") + if not isinstance(self.id, ClassDeletionId): + self.id = ClassDeletionId(self.id) + + if self.superclass is not None and not isinstance(self.superclass, NodeId): + self.superclass = NodeId(self.superclass) + + if self.change_description is not None and not isinstance(self.change_description, str): + self.change_description = str(self.change_description) + + super().__post_init__(**kwargs) + +@dataclass +class ObjectPropertyDeletion(NodeDeletion): + """ + A node deletion where the owl type is 'ObjectProperty' + """ + _inherited_slots: ClassVar[List[str]] = [] + + class_class_uri: ClassVar[URIRef] = KGCL.ObjectPropertyDeletion + class_class_curie: ClassVar[str] = "kgcl:ObjectPropertyDeletion" + class_name: ClassVar[str] = "ObjectPropertyDeletion" + class_model_uri: ClassVar[URIRef] = KGCL.ObjectPropertyDeletion + + id: Union[str, ObjectPropertyDeletionId] = None + change_description: Optional[str] = None + + def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]): + if self._is_empty(self.id): + self.MissingRequiredField("id") + if not isinstance(self.id, ObjectPropertyCreationId): + self.id = ObjectPropertyDeletionId(self.id) + + if self.change_description is not None and not isinstance(self.change_description, str): + self.change_description = str(self.change_description) + + super().__post_init__(**kwargs) @dataclass class NodeDirectMerge(NodeObsoletion): From 35a5fe3906d43c6a4bf29b8bf1ae0f270b7795c1 Mon Sep 17 00:00:00 2001 From: Peiran Li Date: Mon, 30 Oct 2023 16:52:42 +0100 Subject: [PATCH 2/5] Add ClassDeletion & ObjectPropertyDeletion Add ClassDeletion and ObjectPropertyDeletion under NodeDeletion. --- src/kgcl_schema/schema/kgcl.yaml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/kgcl_schema/schema/kgcl.yaml b/src/kgcl_schema/schema/kgcl.yaml index 94fbe8a3..75b0b657 100644 --- a/src/kgcl_schema/schema/kgcl.yaml +++ b/src/kgcl_schema/schema/kgcl.yaml @@ -694,6 +694,20 @@ classes: slot_usage: change_description: string_serialization: delete {about_node} + ClassDeletion: + is_a: NodeDeletion + description: A node deletion where the owl type is 'owl:Class' + slots: + - superclass + slot_usage: + change_description: + string_serialization: delete class {about_node} + ObjectPropertyDeletion: + is_a: NodeDeletion + description: A node deletion where the owl type is 'ObjectProperty' + slot_usage: + change_description: + string_serialization: delete object property {about_node} NodeDirectMerge: is_a: NodeObsoletion mixins: From a011b71574692b4552dee7f00107283b02631b2a Mon Sep 17 00:00:00 2001 From: Syphax Date: Tue, 11 Feb 2025 04:49:48 +0100 Subject: [PATCH 3/5] add running projet help in read me --- README.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/README.md b/README.md index 50298b02..8de084eb 100644 --- a/README.md +++ b/README.md @@ -18,3 +18,20 @@ The following URIs will resolve to the KGCL standard: [Read more here.](https://incatools.github.io/kgcl/) +## How to run project locally +install python 3.9, using mise (optional), get mise from [here](https://mise.jdx.dev/) +```bash +mise install python 3.9 +``` +install poetry +```bash +pip install poetry +``` +install dependencies +```bash +poetry install +``` +run tests +```bash +poetry run pytest +``` From e70ecc1e0f7b993ca6f859ad167d80ed0c6ea89d Mon Sep 17 00:00:00 2001 From: Syphax Date: Tue, 11 Feb 2025 04:50:10 +0100 Subject: [PATCH 4/5] add ClassDeletion schema --- src/kgcl_schema/schema/kgcl.yaml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/kgcl_schema/schema/kgcl.yaml b/src/kgcl_schema/schema/kgcl.yaml index b5e18fea..dddaa704 100644 --- a/src/kgcl_schema/schema/kgcl.yaml +++ b/src/kgcl_schema/schema/kgcl.yaml @@ -705,6 +705,14 @@ classes: slot_usage: change_description: string_serialization: delete {about_node} + ClassDeletion: + is_a: NodeDeletion + description: A node deletion where the owl type is 'owl:Class' + slots: + - superclass + slot_usage: + change_description: + string_serialization: delete class {about_node} NodeDirectMerge: is_a: NodeObsoletion mixins: From 9ade15553ca2a4f1df7e7e3a2efaea85dbc4aadd Mon Sep 17 00:00:00 2001 From: Syphax Date: Tue, 11 Feb 2025 04:50:28 +0100 Subject: [PATCH 5/5] add ClassDeletion implementation --- src/kgcl_schema/datamodel/kgcl.py | 33 +++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/kgcl_schema/datamodel/kgcl.py b/src/kgcl_schema/datamodel/kgcl.py index 7082b25c..f05198d1 100644 --- a/src/kgcl_schema/datamodel/kgcl.py +++ b/src/kgcl_schema/datamodel/kgcl.py @@ -309,6 +309,9 @@ class ObjectPropertyCreationId(NodeCreationId): class NodeDeletionId(NodeChangeId): pass +class ClassDeletionId(NodeDeletionId): + pass + class NodeDirectMergeId(NodeObsoletionId): pass @@ -2531,6 +2534,36 @@ def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]): super().__post_init__(**kwargs) self.type = str(self.class_name) +@dataclass +class ClassDeletion(NodeDeletion): + """ + A node deletion where the owl type is 'owl:Class' + """ + _inherited_slots: ClassVar[List[str]] = [] + + class_class_uri: ClassVar[URIRef] = KGCL.ClassDeletion + class_class_curie: ClassVar[str] = "kgcl:ClassDeletion" + class_name: ClassVar[str] = "ClassDeletion" + class_model_uri: ClassVar[URIRef] = KGCL.ClassDeletion + + id: Union[str, ClassDeletionId] = None + superclass: Optional[Union[str, NodeId]] = None + change_description: Optional[str] = None + + def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]): + if self._is_empty(self.id): + self.MissingRequiredField("id") + if not isinstance(self.id, ClassDeletionId): + self.id = ClassDeletionId(self.id) + + if self.superclass is not None and not isinstance(self.superclass, NodeId): + self.superclass = NodeId(self.superclass) + + if self.change_description is not None and not isinstance(self.change_description, str): + self.change_description = str(self.change_description) + + super().__post_init__(**kwargs) + @dataclass(repr=False) class NodeDirectMerge(NodeObsoletion):