Skip to content
Draft
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
768118c
First version of added namespace search in get_by_label
francescalb Mar 14, 2025
bcafad0
Corrected namespace search
francescalb Mar 14, 2025
79acb31
Updated so that emmo-inferred is given emmo as prefix (as prev)
francescalb Mar 14, 2025
dd99912
Updated test_patch to new emmo
francescalb Mar 14, 2025
3390620
Updated graph to have default for emmorelations
francescalb Mar 14, 2025
d5a6ea5
test_load and test_save updated
francescalb Mar 14, 2025
00e8d9a
Updated excelparser-tests with emmo-1.0.0
francescalb Mar 14, 2025
3aadfee
Updated redirections_test
francescalb Mar 14, 2025
6782a73
Update documentation test.
francescalb Mar 14, 2025
652951a
Test_save updated
francescalb Mar 14, 2025
d5ab563
Update ontopy/ontology.py
francescalb Mar 14, 2025
04b46f9
Update ontopy/ontology.py
francescalb Mar 14, 2025
46926c6
Update ontopy/ontology.py
francescalb Mar 14, 2025
64d0f8d
Merge branch 'flb/emmo_1.0.0_released' into flb/get_by_label_w_namespace
francescalb Mar 14, 2025
0b96a02
pre-commit
francescalb Mar 14, 2025
172af04
Merge branch 'flb/emmo_1.0.0_released' into flb/get_by_label_w_namespace
francescalb Mar 14, 2025
5f4b4ec
just temporarily push
francescalb Mar 18, 2025
f106279
Added possibility of specifying iri in new_entity
francescalb Mar 20, 2025
861a348
pylint fixes and docs corrections
francescalb Mar 20, 2025
5d47dde
Merge branch 'flb/specifiy_iri_new_entity' into flb/get_by_label_w_na…
francescalb Mar 20, 2025
8a13a0d
Merge branch 'master' into flb/get_by_label_w_namespace
jesper-friis May 29, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 45 additions & 22 deletions ontopy/ontology.py
Original file line number Diff line number Diff line change
Expand Up @@ -377,8 +377,9 @@ def get_by_label(
"Namespace given in argument is ignored. "
)
namespace = splitlabel[0]

#print('namespace', namespace)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can be removed

if namespace:
#print('in get_by_label namespavce')
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can be removed

entityset = self.get_by_label_all(
label,
label_annotations=label_annotations,
Expand All @@ -388,7 +389,7 @@ def get_by_label(
return entityset.pop()
raise NoSuchLabelError(
f"No label annotations matches for '{label}' "
f"with prefix '{prefix}'."
f"with namespace '{namespace}'."
)

if prefix:
Expand Down Expand Up @@ -518,13 +519,13 @@ def get_by_label_all(
ent for ent in self.get_entities() if ent.name in matches
)
if namespace:
print("in namespace", namespace)
print("entities", entities)
for ent in entities:
print("ent.namespace", ent.namespace)
print("ent.namespace.name", ent.namespace.name)
print("namespace", namespace)
print(namespace in [ent.namespace.name, ent.namespace.base_iri])
#print("in namespace", namespace)
#print("entities", entities)
#for ent in entities:
# print("ent.namespace", ent.namespace)
# print("ent.namespace.name", ent.namespace.name)
# print("namespace", namespace)
# print(namespace in [ent.namespace.name, ent.namespace.base_iri])
Comment on lines +522 to +528
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can be removed

return set(
ent
for ent in entities
Expand Down Expand Up @@ -2060,7 +2061,7 @@ def get_wu_palmer_measure(self, cls1, cls2):
generations2 = self.number_of_generations(cls2, cca)
return 2 * ccadepth / (generations1 + generations2 + 2 * ccadepth)

def new_entity(
def new_entity( # pylint: disable=too-many-arguments,too-many-branches,too-many-positional-arguments
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These pylint disable's will probably make the line too long. Probably better to move the comment to after the docstring (line 2119)

self,
name: str,
parent: Union[
Expand All @@ -2080,6 +2081,7 @@ def new_entity(
]
] = "class",
preflabel: Optional[str] = None,
iri: Optional[str] = None,
) -> Union[
ThingClass,
ObjectPropertyClass,
Expand All @@ -2103,6 +2105,8 @@ def new_entity(
be added as prefLabel if skos:prefLabel is in the ontology
and listed in `self.label_annotations`. Set `preflabel` to
False, to avoid assigning a prefLabel.
iri: IRI of the entity. If None, a new IRI will be generated
based on the ontology base IRI and the entity name.

Returns:
the new entity.
Expand Down Expand Up @@ -2148,7 +2152,8 @@ def new_entity(

with self:
entity = types.new_class(name, parents)

if iri:
entity.iri = iri
preflabel_iri = "http://www.w3.org/2004/02/skos/core#prefLabel"
if preflabel:
if not self.world[preflabel_iri]:
Expand All @@ -2169,63 +2174,81 @@ def new_entity(

# Method that creates new ThingClass using new_entity
def new_class(
self, name: str, parent: Union[ThingClass, Iterable]
self,
name: str,
parent: Union[ThingClass, Iterable],
iri: Optional[str] = None,
) -> ThingClass:
"""Create and return new class.

Args:
name: name of the class
parent: parent(s) of the class
iri: IRI of the new class. If None, a new IRI will be generated
based on the ontology base IRI and the entity name.


Returns:
the new class.
"""
return self.new_entity(name, parent, "class")
return self.new_entity(name, parent, "class", iri=iri)

# Method that creates new ObjectPropertyClass using new_entity
def new_object_property(
self, name: str, parent: Union[ObjectPropertyClass, Iterable]
self,
name: str,
parent: Union[ObjectPropertyClass, Iterable],
iri: Optional[str] = None,
) -> ObjectPropertyClass:
"""Create and return new object property.

Args:
name: name of the object property
parent: parent(s) of the object property

iri: IRI of the new object property. If None, a new IRI will be
based on the ontology base IRI and the entity name.
Returns:
the new object property.
"""
return self.new_entity(name, parent, "object_property")
return self.new_entity(name, parent, "object_property", iri=iri)

# Method that creates new DataPropertyClass using new_entity
def new_data_property(
self, name: str, parent: Union[DataPropertyClass, Iterable]
self,
name: str,
parent: Union[DataPropertyClass, Iterable],
iri: Optional[str] = None,
) -> DataPropertyClass:
"""Create and return new data property.

Args:
name: name of the data property
parent: parent(s) of the data property

iri: IRI of the new data property. If None, a new IRI will be
based on the ontology base IRI and the entity name
Returns:
the new data property.
"""
return self.new_entity(name, parent, "data_property")
return self.new_entity(name, parent, "data_property", iri=iri)

# Method that creates new AnnotationPropertyClass using new_entity
def new_annotation_property(
self, name: str, parent: Union[AnnotationPropertyClass, Iterable]
self,
name: str,
parent: Union[AnnotationPropertyClass, Iterable],
iri: Optional[str] = None,
) -> AnnotationPropertyClass:
"""Create and return new annotation property.

Args:
name: name of the annotation property
parent: parent(s) of the annotation property

iri: IRI of the new annotation property. If None, a new IRI will
be based on the ontology base IRI and the entity name.
Returns:
the new annotation property.
"""
return self.new_entity(name, parent, "annotation_property")
return self.new_entity(name, parent, "annotation_property", iri=iri)

def difference(self, other: owlready2.Ontology) -> set:
"""Return a set of triples that are in this, but not in the
Expand Down
72 changes: 71 additions & 1 deletion tests/ontopy_tests/test_new_entity.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,13 +101,30 @@ def test_new_entity(testonto: "Ontology") -> None:
entitytype="nonexistingpropertytype",
)
testonto.new_class("AnotherClass3", (testonto.AnotherClass,))

assert (
testonto.AnotherClass3.iri == "http://emmo.info/testonto#AnotherClass3"
)
testonto.new_object_property(
"hasSubObjectProperty3", testonto.hasObjectProperty
)

assert (
testonto.hasSubObjectProperty3.iri
== "http://emmo.info/testonto#hasSubObjectProperty3"
)
testonto.new_data_property("hasSubDataProperty3", testonto.hasDataProperty)
assert (
testonto.hasSubDataProperty3.iri
== "http://emmo.info/testonto#hasSubDataProperty3"
)
testonto.new_annotation_property(
"hasSubAnnotationProperty3", testonto.hasAnnotationProperty
)
assert (
testonto.hasSubAnnotationProperty3.iri
== "http://emmo.info/testonto#hasSubAnnotationProperty3"
)


def test_new_entity_w_preflabel() -> None:
Expand All @@ -122,4 +139,57 @@ def test_new_entity_w_preflabel() -> None:
preflabel="NewClass",
)

# assert testonto2.NewClass.preflabel == "NewClass"
assert testonto2.NewClass.prefLabel.en == ["NewClass"]


def test_new_entity_w_iri(testonto: "Ontology") -> None:
"""Test adding entities to ontology"""
from ontopy import get_ontology
import owlready2

testonto.new_entity(
"NewClass", owlready2.Thing, iri="http://different_ontology#NewClass"
)

assert testonto.NewClass.iri == "http://different_ontology#NewClass"

testonto.new_class(
"AnotherClass",
(testonto.NewClass,),
iri="http://different_ontology#AnotherClass",
)

assert testonto.AnotherClass.iri == "http://different_ontology#AnotherClass"

testonto.new_object_property(
"hasSubObjectProperty",
testonto.hasObjectProperty,
iri="http://different_ontology#hasSubObjectProperty",
)

assert (
testonto.hasSubObjectProperty.iri
== "http://different_ontology#hasSubObjectProperty"
)

testonto.new_data_property(
"hasSubDataProperty",
testonto.hasDataProperty,
iri="http://different_ontology#hasSubDataProperty",
)

assert (
testonto.hasSubDataProperty.iri
== "http://different_ontology#hasSubDataProperty"
)

testonto.new_annotation_property(
"hasSubAnnotationProperty",
testonto.hasAnnotationProperty,
iri="http://different_ontology#hasSubAnnotationProperty",
)

assert (
testonto.hasSubAnnotationProperty.iri
== "http://different_ontology#hasSubAnnotationProperty"
)
Loading