From 24b86ad38cc8e23fe486927960cab3240afae43f Mon Sep 17 00:00:00 2001 From: "Francesca L. Bleken" <48128015+francescalb@users.noreply.github.com> Date: Mon, 9 Oct 2023 21:44:35 +0200 Subject: [PATCH] Update to comply with owlready2>0.41 (#639) * Update to comply with owlready2>0.41 which returns a owlready2.locstr instead of str * Updated excelparser to use emmo1.0.0-beta4, patch and excelparser OK. * _getattr monkey patch so that ThingClass annotations can be directly accessed. * Added some get_by_albel_tests that codecov is complaining about. * Added wu-palmer test in test_generations --- ontopy/excelparser.py | 6 +- ontopy/graph.py | 6 +- ontopy/ontology.py | 1 - ontopy/patch.py | 38 +++++- requirements.txt | 2 +- tests/conftest.py | 14 ++- tests/ontopy_tests/conftest.py | 40 ------- tests/ontopy_tests/test_patch.py | 113 ++++++++++++------ tests/ontopy_tests/test_prefix.py | 7 ++ tests/ontopy_tests/test_utils.py | 2 +- tests/test_dir.py | 1 - tests/test_excelparser/onto.xlsx | Bin 24080 -> 24136 bytes tests/test_excelparser/onto_only_classes.xlsx | Bin 22265 -> 22093 bytes tests/test_excelparser/onto_update.xlsx | Bin 13032 -> 13555 bytes .../onto_update_only_classes.xlsx | Bin 13032 -> 13555 bytes .../result_ontology/fromexcelonto.ttl | 36 +++--- .../fromexcelonto_only_classes.ttl | 78 ++++++------ tests/test_excelparser/test_excelparser.py | 13 +- tests/test_generation_search.py | 5 + tests/test_get_by_label.py | 16 +-- tests/test_load.py | 12 +- .../testutils.py => utilities/utilities.py} | 15 ++- 22 files changed, 236 insertions(+), 169 deletions(-) mode change 100755 => 100644 tests/test_excelparser/onto.xlsx mode change 100755 => 100644 tests/test_excelparser/onto_only_classes.xlsx rename tests/{ontopy_tests/testutils.py => utilities/utilities.py} (78%) diff --git a/ontopy/excelparser.py b/ontopy/excelparser.py index 90852a57f..eff2f5657 100755 --- a/ontopy/excelparser.py +++ b/ontopy/excelparser.py @@ -319,12 +319,10 @@ def create_ontology_from_pandas( # pylint:disable=too-many-locals,too-many-bran # Set given or default base_iri if base_iri_from_metadata is False. if not base_iri_from_metadata: onto.base_iri = base_iri - - onto.sync_python_names() + # onto.sync_python_names() # prefLabel, label, and altLabel # are default label annotations onto.set_default_label_annotations() - # Add object properties if objectproperties is not None: objectproperties = _clean_dataframe(objectproperties) @@ -367,7 +365,6 @@ def create_ontology_from_pandas( # pylint:disable=too-many-locals,too-many-bran onto.sync_attributes( name_policy="uuid", name_prefix="EMMO_", class_docstring="elucidation" ) - # Clean up data frame with new concepts data = _clean_dataframe(data) # Add entities @@ -562,7 +559,6 @@ def get_metadata_from_dataframe( # pylint: disable=too-many-locals,too-many-bra ) except AttributeError: pass - return onto, catalog diff --git a/ontopy/graph.py b/ontopy/graph.py index 0ad9e578a..7b7ac7f05 100644 --- a/ontopy/graph.py +++ b/ontopy/graph.py @@ -720,11 +720,11 @@ def _relation_styles( """ for relation in entity.mro(): if relation in rels: - if get_label(relation) in relations: - rattrs = relations[get_label(relation)] + if str(get_label(relation)) in relations: + rattrs = relations[str(get_label(relation))] else: for alt_label in relation.get_annotations()["altLabel"]: - rattrs = relations[alt_label] + rattrs = relations[str(alt_label)] break else: diff --git a/ontopy/ontology.py b/ontopy/ontology.py index 13a28c75e..1b910ba94 100644 --- a/ontopy/ontology.py +++ b/ontopy/ontology.py @@ -904,7 +904,6 @@ def save( ) revmap = {value: key for key, value in FMAP.items()} - if filename is None: if format: fmt = revmap.get(format, format) diff --git a/ontopy/patch.py b/ontopy/patch.py index a37c5de60..23e28afb2 100644 --- a/ontopy/patch.py +++ b/ontopy/patch.py @@ -6,6 +6,7 @@ from owlready2 import AnnotationPropertyClass, ThingClass, PropertyClass from owlready2 import Metadata, Thing, Restriction, Namespace from ontopy.utils import EMMOntoPyException +from ontopy.ontology import Ontology as OntopyOntology def render_func(entity): @@ -27,6 +28,10 @@ def render_func(entity): # # Extending ThingClass (classes) # ============================== + +save_getattr = ThingClass.__getattr__ + + def get_preferred_label(self): """Returns the preferred label as a string (not list). @@ -69,7 +74,7 @@ def get_parents(self, strict=False): def _dir(self): """Extend dir() listing of ontology classes.""" set_dir = set(object.__dir__(self)) - props = self.namespace.world._props.keys() + props = [str(key) for key in self.namespace.world._props.keys()] set_dir.update(props) return sorted(set_dir) @@ -91,14 +96,16 @@ def _setitem(self, name, value): Example: >>> from emmopy import get_emmo + >>> from owlready2 import locstr >>> emmo = get_emmo() >>> emmo.Atom['altLabel'] - ['ChemicalElement'] + [locstr('ChemicalElement', 'en')] >>> emmo.Atom['altLabel'] = 'Element' + >>> emmo.Atom['altLabel'] = locstr('Atomo', 'it') >>> emmo.Atom['altLabel'] - ['ChemicalElement', 'Element'] - + [locstr('ChemicalElement', 'en'), 'Element', locstr('Atomo', 'it')] """ + item = _getitem(self, name) item.append(value) @@ -112,6 +119,24 @@ def _delitem(self, name): item.clear() +def _getattr(self, name): + """Provide attribute access to annotation properties. + + This upates __getattr__ in owlready2. If name is not found as + attribute it tries using the iriname of the annotation property. + """ + try: + return save_getattr(self, name) + except AttributeError as err: + # make sure we are using and ontopy Ontology which has get_by_label + if isinstance(self.namespace.ontology, OntopyOntology): + entity = self.namespace.ontology.get_by_label(name) + # add annotation property to world._props for faster access later + self.namespace.world._props[name] = entity + return save_getattr(self, entity.name) + raise err + + def get_annotations( self, all=False, imported=True ): # pylint: disable=redefined-builtin @@ -125,7 +150,7 @@ def get_annotations( onto = self.namespace.ontology annotations = { - get_preferred_label(_): _._get_values_for_class(self) + str(get_preferred_label(_)): _._get_values_for_class(self) for _ in onto.annotation_properties(imported=imported) } if all: @@ -197,6 +222,7 @@ def get_indirect_is_a(self, skip_classes=True): setattr(ThingClass, "__getitem__", _getitem) setattr(ThingClass, "__setitem__", _setitem) setattr(ThingClass, "__delitem__", _delitem) +setattr(ThingClass, "__getattr__", _getattr) setattr(ThingClass, "get_preferred_label", get_preferred_label) setattr(ThingClass, "get_parents", get_parents) setattr(ThingClass, "get_annotations", get_annotations) @@ -252,7 +278,7 @@ def namespace_init(self, world_or_ontology, base_iri, name=None): # Extending Metadata # ================== def keys(self): - """Return a generator over annotation property names associates + """Return a generator over annotation property names associated with this ontology.""" namespace = self.namespace for annotation in namespace.annotation_properties(): diff --git a/requirements.txt b/requirements.txt index dafa36149..1092621de 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,7 @@ defusedxml>=0.7.1,<1 graphviz>=0.16,<0.21 numpy>=1.19.5,<2 openpyxl>=3.0.9,<3.2 -Owlready2>=0.28,!=0.32,!=0.34,<0.42 +Owlready2>=0.28,!=0.32,!=0.34,<0.44 packaging>=21.0,<24 pandas>=1.2,<2.1 Pygments>=2.7.4,<3 diff --git a/tests/conftest.py b/tests/conftest.py index 47c216155..856167d10 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -6,6 +6,11 @@ if TYPE_CHECKING: from ontopy.ontology import Ontology + from typing import Sequence +import sys, os + +# Add test-specific utilities to path +sys.path.append(os.path.join(os.path.dirname(__file__), "utilities")) @pytest.fixture(scope="session") @@ -16,7 +21,14 @@ def repo_dir() -> Path: @pytest.fixture def emmo() -> "Ontology": - """Load and return EMMO.""" + """Load and return EMMO. + + Note that this loads the version of EMMO that is + the current defailt in ontopy. + + When updating the defeault EMMO for ontopy, + tests might need to be updated. + """ from emmopy import get_emmo emmo = get_emmo() diff --git a/tests/ontopy_tests/conftest.py b/tests/ontopy_tests/conftest.py index b17d6ba12..d05a2cdca 100644 --- a/tests/ontopy_tests/conftest.py +++ b/tests/ontopy_tests/conftest.py @@ -5,43 +5,3 @@ # Files to skip collect_ignore = ["interactive_test.py"] - - -# Utilities -def abbreviate(onto, iri, must_exist=True): - """Returns existing Owlready2 storid for `iri`.""" - if iri is None: - return None - abbreviater = getattr(onto, "_abbreviate") - storid = abbreviater(iri, create_if_missing=False) - if storid is None and must_exist: - raise ValueError(f"no such IRI in ontology: {iri}") - return storid - - -def get_triples(onto, s=None, p=None, o=None) -> list: - """Returns a list of triples matching spo.""" - return [ - ( - onto._unabbreviate(s_) if isinstance(s_, int) and s_ > 0 else s_, - onto._unabbreviate(p_) if isinstance(p_, int) and p_ > 0 else p_, - onto._unabbreviate(o_) if isinstance(o_, int) and o_ > 0 else o_, - ) - for s_, p_, o_, d in onto._get_triples_spod_spod( - abbreviate(onto, s), - abbreviate(onto, p), - abbreviate(onto, o, False) or o, - None, - ) - ] - - -def has_triple(onto, s=None, p=None, o=None) -> bool: - """Returns true if ontology `onto` contains the given triple. - - None may be used as a wildcard for of `s`, `p` or `o`. - """ - try: - return bool(get_triples(onto, s, p, o)) - except ValueError: - return False diff --git a/tests/ontopy_tests/test_patch.py b/tests/ontopy_tests/test_patch.py index d6704863f..8ce2b253b 100644 --- a/tests/ontopy_tests/test_patch.py +++ b/tests/ontopy_tests/test_patch.py @@ -1,48 +1,91 @@ """Tests Owlready2 patches implemented in ontopy/patch.py -Implemented as a script, such that it easy to understand and use for debugging. """ + import pytest from ontopy import get_ontology from owlready2 import owl, Inverse +from utilities import setassert + + +def test_get_by_label_onto(emmo: "Ontology") -> None: + # Test some ThingClass extensions implemented in patch.py + assert str(emmo.Atom.get_preferred_label()) == "Atom" + + assert emmo.Atom.get_parents() == {emmo.MolecularEntity} + + setassert( + emmo.Atom.get_annotations().keys(), + { + "prefLabel", + "altLabel", + "elucidation", + "comment", + }, + ) + setassert( + emmo.Atom.get_annotations(all=True).keys(), + { + "qualifiedCardinality", + "minQualifiedCardinality", + "prefLabel", + "abstract", + "hiddenLabel", + "etymology", + "altLabel", + "example", + "elucidation", + "OWLDLRestrictedAxiom", + "wikipediaReference", + "conceptualisation", + "logo", + "comment", + "dbpediaReference", + "definition", + "VIMTerm", + "creator", + "iupacReference", + "contact", + "omReference", + "ISO9000Reference", + "ISO80000Reference", + "qudtReference", + "contributor", + "license", + "ISO14040Reference", + "figure", + "title", + "publisher", + }, + ) + + # Test item access/assignment/deletion for classes + setassert(emmo.Atom["altLabel"], {"ChemicalElement"}) + + with pytest.raises(KeyError): + emmo.Atom["hasPart"] + + emmo.Atom["altLabel"] = "Element" + setassert(emmo.Atom["altLabel"], {"ChemicalElement", "Element"}) + + del emmo.Atom["altLabel"] + assert emmo.Atom["altLabel"] == [] + + emmo.Atom.altLabel = "ChemicalElement" + assert emmo.Atom["altLabel"] == ["ChemicalElement"] + + assert emmo.Atom.is_defined == False + assert emmo.Holistic.is_defined == True + assert ( + emmo.wikipediaReference + ) # Check that wikipediaReference is in ontology + assert ( + emmo.Atom.wikipediaReference == [] + ) # Check that wikipediaReference can be acceses as attribute -emmo = get_ontology().load() - - -# Test some ThingClass extensions implemented in patch.py -assert emmo.Atom.get_preferred_label() == "Atom" - -assert emmo.Atom.get_parents() == {emmo.MolecularEntity} - -assert set(emmo.Atom.get_annotations().keys()) == { - "prefLabel", - "altLabel", - "elucidation", - "comment", -} - - -# Test item access/assignment/deletion for classes -assert set(emmo.Atom["altLabel"]) == {"ChemicalElement"} - -with pytest.raises(KeyError): - emmo.Atom["hasPart"] - -emmo.Atom["altLabel"] = "Element" -assert set(emmo.Atom["altLabel"]) == {"ChemicalElement", "Element"} - -del emmo.Atom["altLabel"] -assert emmo.Atom["altLabel"] == [] - -emmo.Atom["altLabel"] = "ChemicalElement" -assert emmo.Atom["altLabel"] == ["ChemicalElement"] - - -assert emmo.Atom.is_defined == False -assert emmo.Holistic.is_defined == True # TODO: Fix disjoint_with(). # It seems not to take into account disjoint unions. diff --git a/tests/ontopy_tests/test_prefix.py b/tests/ontopy_tests/test_prefix.py index 7d17da56b..d8452adbe 100644 --- a/tests/ontopy_tests/test_prefix.py +++ b/tests/ontopy_tests/test_prefix.py @@ -1,6 +1,7 @@ from typing import TYPE_CHECKING import pytest from ontopy.utils import NoSuchLabelError +import warnings if TYPE_CHECKING: from pathlib import Path @@ -37,6 +38,12 @@ def test_prefix(testonto: "Ontology", emmo: "Ontology") -> None: "TestClass", prefix="models" ) + with pytest.raises(ValueError): + testonto.get_by_label_all(" ") + + with pytest.raises(TypeError): + testonto.get_by_label(1) + def test_prefix_emmo(emmo: "Ontology") -> None: """Test prefix in ontology""" diff --git a/tests/ontopy_tests/test_utils.py b/tests/ontopy_tests/test_utils.py index 4b5647682..1505ef03f 100644 --- a/tests/ontopy_tests/test_utils.py +++ b/tests/ontopy_tests/test_utils.py @@ -1,5 +1,5 @@ import ontopy.utils as utils -from testutils import get_triples, has_triple +from utilities import get_triples, has_triple def test_annotate_source(testonto: "Ontology"): diff --git a/tests/test_dir.py b/tests/test_dir.py index 867fa7758..c43af81cd 100644 --- a/tests/test_dir.py +++ b/tests/test_dir.py @@ -2,7 +2,6 @@ from ontopy import get_ontology - thisdir = Path(__file__).resolve().parent onto = get_ontology( diff --git a/tests/test_excelparser/onto.xlsx b/tests/test_excelparser/onto.xlsx old mode 100755 new mode 100644 index 2274d00189aaf93d81bfa27d138dc92c49adaeca..3e7a07528cd284e449eb6ac9d8a1b09f38dbb9e3 GIT binary patch delta 13278 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 delta 13245 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 delta 12107 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 diff --git a/tests/test_excelparser/onto_update.xlsx b/tests/test_excelparser/onto_update.xlsx index f8c36d3969c86eb4b45143ea0f3bad9b482be9f1..e2184bd93ce07440510d137695f5c1348a4b215a 100644 GIT binary patch delta 8052 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 WnH$>4M}dR=qSZ}ak|Df*W&a24YX7(Z delta 7470 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 diff --git a/tests/test_excelparser/onto_update_only_classes.xlsx b/tests/test_excelparser/onto_update_only_classes.xlsx index f8c36d3969c86eb4b45143ea0f3bad9b482be9f1..f3c2639ae007ff106259402ab1a73e1c93a7b8cc 100644 GIT binary patch delta 8056 zcmaJ`Ra9Nevc(;;aS!h9uEB%5J7nV$9KyySc-UBQcXto&?(PH#F2UuIj5p4?_kFzn z=uy3@`e&`Gxn|8eu(-0Snu9~Eo*|?A4Fv(w240851L-*|vts#X*1ZDmg?6D}2)NYq z{X#go>waHi6thQ@84?TB5;K=PY`7CuFtHdA`V&7cX8!m*?w&SM>e`h~rI8~0Eh}q_ zA{2?7gBl01rIonZU>6uD8Pbf!DMnZ_rEzwYG?JjM#6g!y1Oea|Yi6@J_DtEW>ue$W zNZ-kx1S;u-3$flhR8>hkOjA{JWVwDGWMIVvMgU50jR)`3(D`HY=!;nO0Fr#%qDK2= zv)*+9ZSWPHzl!M%$RjXFEh9N>RJZWq8yCb@bQta=&)@j~yPsu^`2|Xh zC1jcQ3m_-g6R*F&`k%pel>*8p%+7`L5(^LFKubjLwTlk|%W|MKU0{%(lyYH7%XJyp zV9o-8C(w<6-^}}wGmqsi#QKRMjwT#^-+HRKdm`~usEVLJH0KO_<#txrxMAq;B9L0E z3T#^!8&`vc9(?BFQAe~rh{A%)Ysh`k(V1K1X@)@;_;IiiPKQ(vjREDJ)koRSA=F3h z4x;bFj4xmqBh<$j{amcz#ZwwoJgtwznSQ0COMf4VkvpRo9--Nz6bc?vGTC(j6FBND zoKP5G4u34;)HwWVec}1_Db${=+T@BF#$aN)utYQ5s-`Cv+u@KtpXOjKW+|Sk3@53Jg@C6zbMo;wrhu;B)Cr;$dOQ)g^oY?f0eJm zm_^eyIJd4PX(eTgT`l1jsT$oyv<_gXvJ|+Ds*yxX>#^L2qGn^Wm36p4u`I*Pwg9DM zX`#UDg;03tue6ySq$`)P=w<2NMi(KQi=&QLbvah9ls2IW#7o#Jsq8RT8D>z@SmvTO3ynkP&^Rr|pE?gA3#o zh5a4!99nq$4g%u!6&gbMBQy*a1RQuA4!-sjQ5*`bSFb@c76t;M3LOFh4+4C_N&rd& zuY|9#0z%G^zrbfd-o<~w#QbzqYZ*C#)Io zxOZDZkFq2U38>&)yHAr)L>808tvIGXe$X1(1oPDD{u-B^>P#hTP-`;T{}lV6JsH$r zY9W}H07bl|<&Rf{^uRZ^pd*8bF9Jhk_wM&?@1uL^?{$&3oQmEg7{pb9udFEW+JW(~ zU!+i~e?ZM`ywi9t)PjAzD~n4t@3qdbUt{7R9n$_$=|xl5Z!xs8AB@U3eHPe)e^t@(GkU%RFlc0t7+qX0~CbO z2^DzK7O&1Q|ZI1;r_cQ^$v zF*G8Z1|hp-r=!ZO#piGF?>hSa0;S@}am6nuK-iA4RKw4|ZsB;|R@0<3q{x zdQVf(*ojgf@z;Mhd*ne|Yoku>h&{r_8t>`AC~%p8sl=TA8)>CTKCgtk1YRRbWvo1W z-SjpbZui!D)WTjv9n?yn5~9V$^-H9-WO!E*@56kM*%iwk3AhnpgH}#?5w-{o0nvx} zzmS3rVrTZSvwg#r=;c4S!tk4zaRc1z?}%YC$1J|qsxjA7?*wORGBE4LTlA~d-4=n= zDUe%EQ1;m8YT|CvP0q#@w*^e8GeC8m+=E(>YEIv^-3;D{ z7SfS$4J7U^@M84hm%G*WW2n3?l1-YdeZdkCZ?2oF$90Z2#03!^v)6)!?$BM|Mkgq)P3Bi$B zqA(Qb(I)RIv(zC>7*;cpIe$>0X1al(PVYy6p7DBJDUHKF2!88nb}%1OngrS=D=tQF#A!vpiqLwB}rqtz|RCA6lr&P?x{h;qVNyJt;X~| zIrM1xQ&`Psn4!}Tz1h7ELj$~m@wxU@=*IhYa^P~0Rpvr!q3@6QPmuq-Ao=JiqySdD zU?YoT-^1BzZ2EYGgPc&-C)W?3FI$Vk)`d_bPsiPv$K6%0h#4xPT;e{z`mz`^N*-02Jf>MI!ut{-Lvb{@W(7&NORX0xNOH{M-tGoNq8iZ5oFMD8D+b26)*gFy2;o-N);aeS$*F->Oe|AR*t7-Htt{>MmKED_NN-$^5i~Vq8wFwxT1d@%k8@ z4pVe9>4I(^DdhPx{eo9#ohTtPqf0ycC~lIM3Vl{zD`!1%_p$MDDpF#;y2Vs=K{*an z+qu^3)!uXR=g=vHeo)YIqWS)+?>EZCGf_4|(2>w=Q_YkVTPSFZyV@JN42g&CySWv= zEEXo06(TZ6P&N-?*Ouayl-P-G7~~MquSS9DMj?d@GTy#XwOSIV@|!SiWV%&4QQ5q^ zZ4*74o_UNb;pw!C1K@e;mcwc&;#DO%T~}0t*N!PAP5IA-!wIlw_ucnv{#P-)6dJe; zQ1C`4GQD>yrEZ$e5-hhbg{^bQz4LcTijue|#nuS~rr${}@un<6DnD*Q%M!Dd-j7)q z6Vgbc#!%Npb)yP=fhm4RB`aH_OZ}-)&RF`6UILDr>RuE#6Zs6C$QOZkvD9gI@qs~R z6HOVD>YKxU{k+op1!SRWB`L25`HrGs4~R)dCr%)IY0-!*j3iU?PS0Cx;o`IhUGyH? zR-0n2JW)h)&yDK)0H+d-j@Uy!%fmThuiL&d=6J|YUG+kNDxy|mjlP3O$mYakR6`1? zr|Ld?ivjMK#59E+Tg^%G&IRMO_H%iRi+=v{mb*H$daTt8Q8DiWT1?QLQpc;6A}Gh7 zh*4=X>x7ptD#D7tKzJr2w8vjClE?$-z0R9~Eh+q6AyjRWLwWLMX^f==POi%f24NXZ zoW+|rmhA)&DA4agw6DXK{;ZL?^}C%yCr+5_}=BWvyBtqpL5> zj(wFcLPI!sdfLHc>1aE=NzbeMhkH+Z2J9FBhlc|tOrK@AkK4pQBPaI)q)*`N@G3F$0RPVQ&`kMuPKEuq_OFu7M)XZTOpQ?{uQkg&T)rQ0DmymQUF|%c{ z()`-;PSBkvsb}A{T4*gv*jmqWe@m9=`Kq02W`|L(U@LDr@l|35VG_-iNarwY8IOY6 zxNHt>;oTV*cnIMdBnyHz-x&ALB0`R~b-~6mKNMAtOMvbYDNT$Abi9PWVg+$DF_s|%^!cx za?LTt%Xj8VBv}94Lwlo_oxbtw!H4hWNwXGAOck+vAu!IK0g>Z~nt;71IyCr!nLflH zSS(jsT0>v2VWoeSg({3KX|gMd*qPI3wZUNets8rMi&EjsXSQXnWbmtP_ODe{e`NRQWG^g zaz^2%?)5PW6=o(eC{H0}u0b^-O6X;*hhwKJP$@MTs1%l;Or2rBmfR8&7d!4$bAAna z|D>t4p!%Nj3gkBlH#5Z{>^ zR>QkFX^u=`z=k!d#zsdSVwX~Z4$nKqf%MF4D^7{FxZ^d4WYvbmn_&`guQ@$k&wC6q zq>P8x)@ z>ZxOBb6ETuzYO<5NxMji1dTl9Tpjt4e=B1hGD{rhc_7GF$>#!zGcASyZJK0RO*Cs@ zI%bm7jS00@(~e&Dq3YFwf)y;z_;sdyGwdo8kt zueY=NGk?}anGG)~?RHf=o*`o&NKxzDU5YQ1myKxDsVYlWG-!swvWSDsO+5M9r6Y({ z%VTLZtiR$e0VP86l8azG)`K!F1QWu;zjZ4za;Qh}MQWNZ5F4nM+&MJ8R2Udix(f&Y z6GTWZej1$pOn73u2={qKLboRRIT@7U&2R2T&WIbcS#&utYFG<*P-7p5d}WlG2V080 z+k!#B=7CeV=66g@BVGSUD!cHk&Ire8xI$}5C8ITf-P zIRg9q8KbsPRum<(;3##8R*XT8oe@sCqv3SKNgzCi&zu*;jj%}uWrvg>)(KRIYAeL` z=yJk&^z;e5nUJ}cE8*U-q|OrcLYT%9$9R3}!Jnr&Sw~0CBDnA_)~x8ddLZBBT#rcGAtMXN*RT2@8nAFSy5DG97A!5@uR1$NG@IO7B)C=q|cy@*g2h z35eVkEZb0h`d0s`h?{}xM$Z3>R?2+ufQ`~Ca)&H?0C<4B0y2Jy05cjBq+)-Hv~lk< zuBF08BS)%EEy&;p9erQGcrntbukRMy_e#uOwZ#`6z_s|6Qx%N{$JPBY8&>hV=9ev9g>Qr`;pX4g+lKY zsC_5u#x9ihhWiMa^#=*bO_XmNmY?H0>roOpQfoboZaiD22RBEIVXHKbg;u!Eh(>Jh z8w=*FTg4jZTpiLA&$MrP?P3a|&uACZFeOrw3Qnuuke2e8`6#K@Aa-X!Ul~B{z63rQgK+}2KbUxy*f^+AyLK&U`Z}4GPiN! zt5Pa_Yw|_~9@?Vk$|U4%1Aq9EP_4-JddS|I>rkEvuYb8+vwAx0P<0uYm(8UaT5*X7 z9IaxhR#Fe$-Y-ps2BqP)0EU4XluWI=GuI17{o|h9Iw#b!hhLuAM)VDxsr0R_=e2b} z1bT=uKim?UmuqPChmIK%p1BFyC+Nvs#hb0_GAYkMN<~wb(mgb(xFm6hi$jNtN=lLA z%{M!vN&`9`b3Zby?Ap%#PC`D?6qIN`9teptvh)Vbo%<=jEZr8C3|UO^;lJl=$JHq3 zy>#09*g$y`_<3ww0&%}0@dNlN_nW&o2=aavWuZbx2(&N}0)QX>n5`wRt9~qFeVOlK zKK2lMKFEYPGRw;>W8CbA+#E0CwWy1Hv{>*VhP$(xH~U5+vK%f?;FPE7gENX+H%ECs z3mu)k2mA73nV=PKhBT2= zo%>|i=n`rcE0ZW%N3*86=feytkYzK+QMYg`4`lk#Wr+%TypI2ViWvW{Vx9l^k*aAS z2llNNog}J|I4fh8Wc(8jv(}@OL<*}k#sjadgJyR-w3Uo5zMz#MMejOot@TzS7d<0P zWic84sy{MBFw*h@#>U6}o`)NGb>~_>EQR75hRWMK;5^@0pzrnGYJ%<=h!tb-i!Y?8 z7ZOZF~3l$_o(B2u7Td#|>)l=jOn9Cdpl*C2s$+#J7J<~gZR71-5Kj}pj)ir zDl8tCJv2i~ibp@1eTJ5$i_*p4m-a~N+cGZ=8C2!LPHlfuKiZhD39if5sN7++gRTq` z%)Qb~7JT;ir=EdNAe<;HJ{*^C( zPBt?W^wvDbEFLpHbB1$9J<6!KJY#M*9Vx|7PurPE!*7!3>!`ShWB<(dburhKLk`%L z;+ktHg=J!J9!1p%!UK{;w zLqT81yOLhsIAii#=ln(=|8Pfl2WOklKnn|(&n!mH7Pg;R{vQ5HQp|tOL9t!dJ*+4p zXMyd37ea3Q{dg3zEN{)efz&NTMJ{DQwS~Eb&4zD)n{9BHJ;uZD=jn~I7$;2K^lws>to4Tb2PMGYisMA4y*!+`Ru{^@ye=JzkAa%%b0uv z4#K-oWT~N5T^O07xCKCt6pO7bzE#($*{uu(%Qxi(c0Z=A-G{fIL$-DZ$kwAw(n~ zC>WghuRZIKOhZUa68^kjxxx0nKe(q&9U5D9i)tUPeT4e+AAqeLOk&cgwV>yKgw9Kq z1gA3KgIdcqsqZ{Kk3aM7$GJ3UX`Dm$C)SSxq7aZoBXkqJz}fqz=<7M1{1sG{)~NXW zev-9M5A@imnDzeBYCOjJh}`FtcHe>Qb*>dAczV^aeRjLV%MnM*w5Lx%?xro%0Ukdy zag4G~ry=42Vpdx?a(=RWyx6hUVlO`|JbL9UP zZ9Z>!ptr+F*J6X+tl|Tnut;BJ>7JSq7o)2?10=0dzHv8%d;O4_;QOa7di%BE4G)8W zG?L5UL$|WcuFIoZia}$;E;N^Lma+G%x4hG0aKiWkH@pli;Kxu?|I6fFaO`C4IyR>X zHKoZ+Ya{bW&gkK!#U=AdWu)F#EG!uIsj$Gf{jMGT(D23h`VF+Fhgh~zK^=P=H) zI==VnbK6~ioTxDpu&gVRn6--V{vN#OaWo0;kL^XkWY@%O#@-j3TNKxpSdz%E>wpcH zHgeKS)ZHrAa9|?X*0S;%b5a5#F*2`W4fcb2HKbn&b+zZNf(zHW-o&R4fdwEemIK{_ zt|y_b>`+X5x72wvE%_SGTu4~cY z1Lc8;ldTq`r@x<&Vn6>m0g7bVI`{jK7AOBUpN1E%*)S}an2>6|_|Io;^G18lti7P^ z*+uwBQWajwRV!;&!Fa-Rmk*$}NU|<2Gh&1z$^Eyh}f_ODi<=dEiHY4RK z2ji>Gc>24~qD^qn*blVw8uohdKS@EJj>!WFUt~|CbP;^9dL8TxdvaHn^hgCOPU`3y zxI7rQ3kvHMQJrvkex?djR(7dt6A9tHB0W=h6M*8{+6?nXI6E?Rl+JHOC|;q!oh-5c zF#^_MRfIWwlc&Kihy>t1Rsi9DkHOw>jf*bV-x*L)*v9T{*8OH=BdE` zR5)M_b^!1H#lC;zhUou4Bm}py;uHOafwx4qew&fM%>w^pAuxjd*(r$r$@DjAAMhV; Y2#9!Qa3?zf8tPlKZt&*xWBcR%A2E0U^#A|> delta 7470 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

akxhuYAWo zS|v*J%sFH_gcfx^4rts*0CF6~KJ9;7#c$9!f9fAc>q+k=eyGrWKR%u4C(bGuq%I$i zXecrLQuJ*Yl+$2Y)@hy=WP`(;zvhbS7B*(KfbJfyM&EldVPjtFh0rQlA@+-b6n))fPSd#W`-AvB*skP$IC14H%n@lMc^|v5-6y60o zN?UhJ=4mz=`U0|DG#W9!3Rq$0cBVzzK+@nt@5{ZwRws@uU4#SkFRw>><1ZoTa$@}k zNtGAov8M`1u{K6?#fK}UA!~LrcT<;4udcINKwW1OJ90J4a-Hl)-p2bP_?`}C@beej zH1EDl&!1I|NfFoVuG0<-9muy2PadQVqXD;kr+7$EAHKN%Qv`g@uZFw^wdCib`ro?9 z(_`nKj~@F!RT5&V|5Yge@pu{#5j;7uQ~j^>@_!x1iT=IIlMn;_$&U}U5THP*Cr_Xt z{@0B1|9@!xccBEdO@NN_ze&c^N&huIjclNQ1z4#5eQlp2&+)0UN$@{*Ep}*>AOqDu dq4^}I;s1}rGADFMkOCJQ>8U*#dwKq4{eS*gBsc&7 diff --git a/tests/test_excelparser/result_ontology/fromexcelonto.ttl b/tests/test_excelparser/result_ontology/fromexcelonto.ttl index 4b4c9f7fa..ae1a98580 100644 --- a/tests/test_excelparser/result_ontology/fromexcelonto.ttl +++ b/tests/test_excelparser/result_ontology/fromexcelonto.ttl @@ -12,8 +12,8 @@ "Jesper Friis"@en, "Sylvain Gouttebroze"@en ; dcterms:title "A test domain ontology"@en ; - owl:imports , - ; + owl:imports , + ; owl:versionInfo "0.01"@en . :EMMO_0264be35-e8ad-5b35-a1a3-84b37bde22d1 a owl:Class ; @@ -40,7 +40,7 @@ skos:prefLabel "GrainBoundary"@en . :EMMO_41808a43-529f-5798-b0ed-71ddcb2c5456 a owl:Class ; - emmo:EMMO_c84c6752_6d64_48cc_9500_e54a3c34898d "\"A very secure source\""@en ; + emmo:EMMO_c84c6752_6d64_48cc_9500_e54a3c34898d "\"http at wikipedia\""@en ; :EMMO_0ec801a2-7da4-55ff-906b-c5ccc905bb8d "\"Another thing\""@en ; :EMMO_98871837-aa90-5eef-9a56-926ae8beebbb "\"A text about this type of boundary\""@en ; rdfs:subClassOf :EMMO_1b2bfe71-5da9-5c46-b137-be45c3e3f9c3 ; @@ -142,12 +142,13 @@ skos:prefLabel "Atom"@en . :EMMO_98871837-aa90-5eef-9a56-926ae8beebbb a owl:AnnotationProperty ; - emmo:EMMO_967080e5_2f42_4eb2_a3a9_c58143e835f9 "Where to find the entry in the \"book of boundaries\""@en ; + rdfs:comment "Where to find the entry in the \"book of boundaries\""@en ; + rdfs:subPropertyOf emmo:EMMO_c7b62dd7_063a_4c2a_8504_42f7264ba83f ; skos:prefLabel "bookOfBoundariesEntry"@en . :EMMO_a14817a8-a449-5115-8924-b90833317d02 a owl:ObjectProperty ; - emmo:EMMO_967080e5_2f42_4eb2_a3a9_c58143e835f9 "has a part that is a boundary"@en ; - rdfs:comment "This definition is humbug"@en ; + rdfs:comment "This definition is humbug"@en, + "has a part that is a boundary"@en ; rdfs:domain :EMMO_1b2bfe71-5da9-5c46-b137-be45c3e3f9c3 ; rdfs:subPropertyOf emmo:EMMO_17e27c22_37e1_468c_9dd7_95e137f73e7f ; skos:prefLabel "hasBoundaryPart"@en . @@ -157,28 +158,29 @@ rdfs:subClassOf :EMMO_1b2bfe71-5da9-5c46-b137-be45c3e3f9c3 ; skos:prefLabel "SpatialBoundary"@en . +:EMMO_80bf0979-a0ec-529c-b9a1-d4aa3032e037 a owl:Class ; + emmo:EMMO_967080e5_2f42_4eb2_a3a9_c58143e835f9 "everything that can be perceived or measured"@en ; + rdfs:comment " note that this is changed from pattern as Pattern is from emmo-beta4 an altLabel for Data"@en, + " this definition is much broader than definition of pattern such as \"the regular and repeated way in which something happens or is\""@en, + "a pattern is defined from a contrast"@en ; + rdfs:subClassOf emmo:EMMO_649bf97b_4397_4005_90d9_219755d92e34 ; + skos:prefLabel "SpecialPattern"@en . + :EMMO_9fa9ca88-2891-538a-a8dd-ccb8a08b9890 a owl:Class ; - emmo:EMMO_21ae69b4_235e_479d_8dd8_4f756f694c1b "A"@en, + emmo:EMMO_967080e5_2f42_4eb2_a3a9_c58143e835f9 "NEED elucidation"@en ; + rdfs:subClassOf :EMMO_80bf0979-a0ec-529c-b9a1-d4aa3032e037 ; + skos:altLabel "A"@en, "Just"@en, "Test"@en ; - emmo:EMMO_967080e5_2f42_4eb2_a3a9_c58143e835f9 "NEED elucidation"@en ; - rdfs:subClassOf :EMMO_cd254842-c697-55f6-917d-9805c77b9187 ; skos:prefLabel "SpatioTemporalPattern"@en . -:EMMO_cd254842-c697-55f6-917d-9805c77b9187 a owl:Class ; - emmo:EMMO_967080e5_2f42_4eb2_a3a9_c58143e835f9 "everything that can be perceived or measured"@en ; - rdfs:comment " this definition is much broader than definition of pattern such as \"the regular and repeated way in which something happens or is\""@en, - "a pattern is defined from a contrast"@en ; - rdfs:subClassOf emmo:EMMO_649bf97b_4397_4005_90d9_219755d92e34 ; - skos:prefLabel "Pattern"@en . - :EMMO_4b32833e-0833-56a7-903c-28a6a8191fe8 a owl:Class ; emmo:EMMO_967080e5_2f42_4eb2_a3a9_c58143e835f9 "Pattern occuring within a boundary in the 4D space"@en ; rdfs:comment "Every physical patterns are FinitePattern"@en ; rdfs:subClassOf [ a owl:Restriction ; owl:onProperty emmo:EMMO_17e27c22_37e1_468c_9dd7_95e137f73e7f ; owl:someValuesFrom :EMMO_1b2bfe71-5da9-5c46-b137-be45c3e3f9c3 ], - :EMMO_cd254842-c697-55f6-917d-9805c77b9187 ; + :EMMO_80bf0979-a0ec-529c-b9a1-d4aa3032e037 ; skos:prefLabel "FinitePattern"@en . :EMMO_1b2bfe71-5da9-5c46-b137-be45c3e3f9c3 a owl:Class ; diff --git a/tests/test_excelparser/result_ontology/fromexcelonto_only_classes.ttl b/tests/test_excelparser/result_ontology/fromexcelonto_only_classes.ttl index 5ded0b43f..cb6c2d276 100644 --- a/tests/test_excelparser/result_ontology/fromexcelonto_only_classes.ttl +++ b/tests/test_excelparser/result_ontology/fromexcelonto_only_classes.ttl @@ -1,19 +1,19 @@ @prefix : . -@prefix core: . +@prefix dcterms: . @prefix emmo: . @prefix owl: . @prefix rdfs: . -@prefix term: . +@prefix skos: . a owl:Ontology ; - term:contributor "SINTEF"@en, + dcterms:contributor "SINTEF"@en, "SINTEF Industry"@en ; - term:creator "Francesca L. Bleken"@en, + dcterms:creator "Francesca L. Bleken"@en, "Jesper Friis"@en, "Sylvain Gouttebroze"@en ; - term:title "A test domain ontology"@en ; - owl:imports , - ; + dcterms:title "A test domain ontology"@en ; + owl:imports , + ; owl:versionInfo "0.01"@en . :EMMO_0264be35-e8ad-5b35-a1a3-84b37bde22d1 a owl:Class ; @@ -24,53 +24,53 @@ owl:someValuesFrom emmo:EMMO_d4f7d378_5e3b_468a_baa1_a7e98358cda7 ], :EMMO_138590b8-3333-515d-87ab-717aac8434e6, :EMMO_4b32833e-0833-56a7-903c-28a6a8191fe8 ; - core:prefLabel "FiniteTemporalPattern"@en . + skos:prefLabel "FiniteTemporalPattern"@en . :EMMO_080262b7-4f7e-582b-916e-8274c73dd629 a owl:Class ; rdfs:subClassOf ; - core:prefLabel "ANewTestClass"@en . + skos:prefLabel "ANewTestClass"@en . :EMMO_1c81f1eb-8b94-5e74-96de-1aeacbdb5b93 a owl:Class ; emmo:EMMO_967080e5_2f42_4eb2_a3a9_c58143e835f9 "The boundary of a grain"@en ; rdfs:subClassOf :EMMO_472ed27e-ce08-53cb-8453-56ab363275c4 ; - core:prefLabel "GrainBoundary"@en . + skos:prefLabel "GrainBoundary"@en . :EMMO_6920d08f-b1e4-5789-9778-f75f4514ef46 a owl:Class ; emmo:EMMO_967080e5_2f42_4eb2_a3a9_c58143e835f9 "NEED elucidation"@en ; rdfs:subClassOf owl:Thing ; - core:prefLabel "SpatioTemporalBoundary"@en . + skos:prefLabel "SpatioTemporalBoundary"@en . :EMMO_76b2eb15-3ab7-52b3-ade2-755aa390d63e a owl:Class ; emmo:EMMO_967080e5_2f42_4eb2_a3a9_c58143e835f9 "Spatial pattern localized in a volume of space"@en ; emmo:EMMO_b432d2d5_25f4_4165_99c5_5935a7763c1a "Textured surface after etching"@en ; rdfs:subClassOf [ a owl:Restriction ; - owl:onProperty emmo:EMMO_17e27c22_37e1_468c_9dd7_95e137f73e7f ; - owl:someValuesFrom :EMMO_472ed27e-ce08-53cb-8453-56ab363275c4 ], - [ a owl:Restriction ; owl:onProperty emmo:EMMO_e1097637_70d2_4895_973f_2396f04fa204 ; owl:someValuesFrom emmo:EMMO_f1a51559_aa3d_43a0_9327_918039f0dfed ], + [ a owl:Restriction ; + owl:onProperty emmo:EMMO_17e27c22_37e1_468c_9dd7_95e137f73e7f ; + owl:someValuesFrom :EMMO_472ed27e-ce08-53cb-8453-56ab363275c4 ], :EMMO_4b32833e-0833-56a7-903c-28a6a8191fe8, :EMMO_5f50f77e-f321-53e3-af76-fe5b0a347479 ; - core:prefLabel "FiniteSpatialPattern"@en . + skos:prefLabel "FiniteSpatialPattern"@en . :EMMO_b04965e6-a9bb-591f-8f8a-1adcb2c8dc39 a owl:Class ; rdfs:subClassOf emmo:EMMO_21f56795_ee72_4858_b571_11cfaa59c1a8 ; - core:prefLabel "1"@en . + skos:prefLabel "1"@en . :EMMO_e0b20a22-7e6f-5c81-beca-35bc5358e11b a owl:Class ; emmo:EMMO_967080e5_2f42_4eb2_a3a9_c58143e835f9 "NEED elucidation"@en ; rdfs:subClassOf :EMMO_4b32833e-0833-56a7-903c-28a6a8191fe8, :EMMO_9fa9ca88-2891-538a-a8dd-ccb8a08b9890 ; - core:prefLabel "FiniteSpatioTemporalPattern"@en . + skos:prefLabel "FiniteSpatioTemporalPattern"@en . :EMMO_e4e653eb-72cd-5dd6-a428-f506d9679774 a owl:Class ; rdfs:subClassOf ; - core:prefLabel "AnotherNewTestClass"@en . + skos:prefLabel "AnotherNewTestClass"@en . :EMMO_e633d033-2af6-5f04-a706-dab826854fb1 a owl:Class ; emmo:EMMO_967080e5_2f42_4eb2_a3a9_c58143e835f9 "The boundary of a subgrain"@en ; rdfs:subClassOf owl:Thing ; - core:prefLabel "SubgrainBoundary"@en . + skos:prefLabel "SubgrainBoundary"@en . :EMMO_e919bd0f-97fb-5d47-92fa-f5756640b6fc a owl:Class ; emmo:EMMO_967080e5_2f42_4eb2_a3a9_c58143e835f9 "Our own special molecules"@en ; @@ -79,59 +79,59 @@ owl:onProperty emmo:EMMO_17e27c22_37e1_468c_9dd7_95e137f73e7f ; owl:someValuesFrom :EMMO_8b758694-7dd3-547a-8589-a835c15a0fb2 ], emmo:EMMO_3397f270_dfc1_4500_8f6f_4d0d85ac5f71 ; - core:prefLabel "SpecialMolecule"@en . + skos:prefLabel "SpecialMolecule"@en . :EMMO_f8ad57d3-6cb5-5628-99e6-eb5915bece3a a owl:Class ; rdfs:subClassOf owl:Thing ; - core:prefLabel "SubSubgrainBoundary"@en . + skos:prefLabel "SubSubgrainBoundary"@en . :EMMO_fb1218a4-b462-5e51-9bed-5b8d394551aa a owl:Class ; rdfs:subClassOf [ a owl:Restriction ; owl:onProperty emmo:EMMO_17e27c22_37e1_468c_9dd7_95e137f73e7f ; owl:someValuesFrom emmo:EMMO_eb77076b_a104_42ac_a065_798b2d2809ad ], emmo:EMMO_3397f270_dfc1_4500_8f6f_4d0d85ac5f71 ; - core:prefLabel "AnotherSpecialMolecule"@en . + skos:prefLabel "AnotherSpecialMolecule"@en . :EMMO_138590b8-3333-515d-87ab-717aac8434e6 a owl:Class ; emmo:EMMO_967080e5_2f42_4eb2_a3a9_c58143e835f9 "Pattern with only temporal aspect"@en ; emmo:EMMO_b432d2d5_25f4_4165_99c5_5935a7763c1a "Voltage in AC plug"@en ; rdfs:subClassOf owl:Thing ; - core:prefLabel "TemporalPattern"@en . + skos:prefLabel "TemporalPattern"@en . :EMMO_5f50f77e-f321-53e3-af76-fe5b0a347479 a owl:Class ; emmo:EMMO_967080e5_2f42_4eb2_a3a9_c58143e835f9 "Spatial pattern without regular temporal variations"@en ; emmo:EMMO_b432d2d5_25f4_4165_99c5_5935a7763c1a "Infinite grid"@en ; rdfs:subClassOf :EMMO_9fa9ca88-2891-538a-a8dd-ccb8a08b9890 ; - core:prefLabel "SpatialPattern"@en . + skos:prefLabel "SpatialPattern"@en . :EMMO_8b758694-7dd3-547a-8589-a835c15a0fb2 a owl:Class ; rdfs:subClassOf emmo:EMMO_eb77076b_a104_42ac_a065_798b2d2809ad ; - core:prefLabel "Atom"@en . + skos:prefLabel "Atom"@en . :EMMO_1b2bfe71-5da9-5c46-b137-be45c3e3f9c3 a owl:Class ; emmo:EMMO_967080e5_2f42_4eb2_a3a9_c58143e835f9 "NEED elucidation"@en ; rdfs:subClassOf emmo:EMMO_649bf97b_4397_4005_90d9_219755d92e34 ; - core:prefLabel "Boundary"@en . + skos:prefLabel "Boundary"@en . :EMMO_472ed27e-ce08-53cb-8453-56ab363275c4 a owl:Class ; emmo:EMMO_967080e5_2f42_4eb2_a3a9_c58143e835f9 " "@en ; rdfs:subClassOf :EMMO_1b2bfe71-5da9-5c46-b137-be45c3e3f9c3 ; - core:prefLabel "SpatialBoundary"@en . - -:EMMO_9fa9ca88-2891-538a-a8dd-ccb8a08b9890 a owl:Class ; - emmo:EMMO_21ae69b4_235e_479d_8dd8_4f756f694c1b "A"@en, - "Just"@en, - "Test"@en ; - emmo:EMMO_967080e5_2f42_4eb2_a3a9_c58143e835f9 "NEED elucidation"@en ; - rdfs:subClassOf :EMMO_cd254842-c697-55f6-917d-9805c77b9187 ; - core:prefLabel "SpatioTemporalPattern"@en . + skos:prefLabel "SpatialBoundary"@en . -:EMMO_cd254842-c697-55f6-917d-9805c77b9187 a owl:Class ; +:EMMO_80bf0979-a0ec-529c-b9a1-d4aa3032e037 a owl:Class ; emmo:EMMO_967080e5_2f42_4eb2_a3a9_c58143e835f9 "everything that can be perceived or measured"@en ; rdfs:comment " this definition is much broader than definition of pattern such as \"the regular and repeated way in which something happens or is\""@en, "a pattern is defined from a contrast"@en ; rdfs:subClassOf emmo:EMMO_649bf97b_4397_4005_90d9_219755d92e34 ; - core:prefLabel "Pattern"@en . + skos:prefLabel "SpecialPattern"@en . + +:EMMO_9fa9ca88-2891-538a-a8dd-ccb8a08b9890 a owl:Class ; + emmo:EMMO_967080e5_2f42_4eb2_a3a9_c58143e835f9 "NEED elucidation"@en ; + rdfs:subClassOf :EMMO_80bf0979-a0ec-529c-b9a1-d4aa3032e037 ; + skos:altLabel "A"@en, + "Just"@en, + "Test"@en ; + skos:prefLabel "SpatioTemporalPattern"@en . :EMMO_4b32833e-0833-56a7-903c-28a6a8191fe8 a owl:Class ; emmo:EMMO_967080e5_2f42_4eb2_a3a9_c58143e835f9 "Pattern occuring within a boundary in the 4D space"@en ; @@ -139,5 +139,5 @@ rdfs:subClassOf [ a owl:Restriction ; owl:onProperty emmo:EMMO_17e27c22_37e1_468c_9dd7_95e137f73e7f ; owl:someValuesFrom :EMMO_1b2bfe71-5da9-5c46-b137-be45c3e3f9c3 ], - :EMMO_cd254842-c697-55f6-917d-9805c77b9187 ; - core:prefLabel "FinitePattern"@en . + :EMMO_80bf0979-a0ec-529c-b9a1-d4aa3032e037 ; + skos:prefLabel "FinitePattern"@en . diff --git a/tests/test_excelparser/test_excelparser.py b/tests/test_excelparser/test_excelparser.py index 220596dec..0131b591d 100644 --- a/tests/test_excelparser/test_excelparser.py +++ b/tests/test_excelparser/test_excelparser.py @@ -32,7 +32,7 @@ def test_excelparser(repo_dir: "Path") -> None: repo_dir / "tests" / "test_excelparser" / "onto_update.xlsx" ) ontology, catalog, errors = create_ontology_from_excel(xlspath, force=True) - ontology.save("test.ttl") + # ontology.save("test.ttl") # used for printing new ontology when debugging assert onto == ontology assert errors.keys() == { "already_defined", @@ -69,7 +69,7 @@ def test_excelparser(repo_dir: "Path") -> None: "data_prop_errors_in_range", "data_prop_errors_in_domain", } - assert errors["already_defined"] == {"Pattern"} + assert errors["already_defined"] == {"SpecialPattern"} assert errors["in_imported_ontologies"] == {"Atom"} assert errors["wrongly_defined"] == {"Temporal Boundary"} assert errors["missing_subClassOf"] == {"SpatioTemporalBoundary"} @@ -79,7 +79,7 @@ def test_excelparser(repo_dir: "Path") -> None: "SubgrainBoundary", } assert errors["nonadded_concepts"] == { - "Pattern", + "SpecialPattern", "Temporal Boundary", } @@ -116,8 +116,11 @@ def test_excelparser_only_classes(repo_dir: "Path") -> None: / "onto_update_only_classes.xlsx" ) ontology, catalog, errors = create_ontology_from_excel(xlspath, force=True) + # Used for printing new ontology when debugging + # ontology.save("test_only_classes.ttl") + assert onto == ontology - assert errors["already_defined"] == {"Pattern"} + assert errors["already_defined"] == {"SpecialPattern"} assert errors["in_imported_ontologies"] == {"Atom"} assert errors["wrongly_defined"] == {"Temporal Boundary"} assert errors["missing_subClassOf"] == {"SpatioTemporalBoundary"} @@ -127,7 +130,7 @@ def test_excelparser_only_classes(repo_dir: "Path") -> None: "SubgrainBoundary", } assert errors["nonadded_concepts"] == { - "Pattern", + "SpecialPattern", "Temporal Boundary", } diff --git a/tests/test_generation_search.py b/tests/test_generation_search.py index 3afe2c17a..f3ecaad54 100755 --- a/tests/test_generation_search.py +++ b/tests/test_generation_search.py @@ -147,3 +147,8 @@ def test_ancestors(emmo: "Ontology", repo_dir: "Path") -> None: onto.NorwaySpruce, onto.Avocado, } + + assert ( + onto.get_wu_palmer_measure(onto.NorwaySpruce, onto.Avocado) + == 0.5714285714285714 + ) diff --git a/tests/test_get_by_label.py b/tests/test_get_by_label.py index 20057f718..5b84a5281 100644 --- a/tests/test_get_by_label.py +++ b/tests/test_get_by_label.py @@ -1,15 +1,13 @@ import pytest -from ontopy import get_ontology -from ontopy.ontology import NoSuchLabelError - def test_get_by_label_onto(repo_dir) -> None: """Test that label annotations are added correctly if they are not added before using get_by_label """ + from ontopy import get_ontology + from ontopy.ontology import NoSuchLabelError, DEFAULT_LABEL_ANNOTATIONS import owlready2 - from ontopy.ontology import DEFAULT_LABEL_ANNOTATIONS # create ontology with one class and check that it is found testonto = get_ontology("http://domain_ontology/new_ontology") @@ -52,7 +50,7 @@ def test_get_by_label_onto(repo_dir) -> None: assert testonto.Klasse.prefLabel == ["Klasse"] testonto.new_entity("UnderKlasse", testonto.Klasse) - assert testonto.UnderKlasse.prefLabel == ["UnderKlasse"] + assert testonto.UnderKlasse.prefLabel.en == ["UnderKlasse"] assert testonto.get_by_label_all("*") == { testonto.prefLabel, @@ -102,7 +100,11 @@ def test_get_by_label_onto(repo_dir) -> None: def test_get_by_label_emmo(emmo: "Ontology") -> None: # Loading emmo-inferred where everything is sqashed into one ontology - emmo = get_ontology().load() + from emmopy import get_emmo + from ontopy import get_ontology + from ontopy.ontology import NoSuchLabelError + + emmo = get_emmo() assert emmo[emmo.Atom.name] == emmo.Atom assert emmo[emmo.Atom.iri] == emmo.Atom @@ -110,7 +112,7 @@ def test_get_by_label_emmo(emmo: "Ontology") -> None: onto = get_ontology( "https://raw.githubusercontent.com/BIG-MAP/BattINFO/master/battinfo.ttl" ).load() - assert onto.Electrolyte.prefLabel.first() == "Electrolyte" + assert onto.Electrolyte.prefLabel.en.first() == "Electrolyte" # Check colon_in_name argument onto.Atom.altLabel.append("Element:X") diff --git a/tests/test_load.py b/tests/test_load.py index e549b0e0e..665586254 100755 --- a/tests/test_load.py +++ b/tests/test_load.py @@ -12,28 +12,28 @@ def test_load(repo_dir: "Path", testonto: "Ontology") -> None: # Check that the defaults works emmo = get_ontology("emmo").load() # ttl format - assert emmo.Atom.prefLabel.first() == "Atom" + assert str(emmo.Atom.prefLabel.first()) == "Atom" emmo = get_ontology("emmo-inferred").load() - assert emmo.Atom.prefLabel.first() == "Atom" + assert str(emmo.Atom.prefLabel.first()) == "Atom" emmo = get_ontology("emmo-development").load() # ttl format - assert emmo.Atom.prefLabel.first() == "Atom" + assert str(emmo.Atom.prefLabel.first()) == "Atom" emmo = get_ontology( "https://emmo-repo.github.io/latest-stable/" "emmo-inferred.owl" ).load() # owl format - assert emmo.Atom.prefLabel.first() == "Atom" + assert str(emmo.Atom.prefLabel.first()) == "Atom" # Load a local ontology with catalog - assert testonto.TestClass.prefLabel.first() == "TestClass" + assert str(testonto.TestClass.prefLabel.first()) == "TestClass" # Use catalog file when downloading from web onto = get_ontology( "https://raw.githubusercontent.com/BIG-MAP/BattINFO/master/" "battinfo.ttl" ).load() - assert onto.Electrolyte.prefLabel.first() == "Electrolyte" + assert str(onto.Electrolyte.prefLabel.first()) == "Electrolyte" with pytest.raises( EMMOntoPyException, diff --git a/tests/ontopy_tests/testutils.py b/tests/utilities/utilities.py similarity index 78% rename from tests/ontopy_tests/testutils.py rename to tests/utilities/utilities.py index 6b18c4953..c4dc9667e 100644 --- a/tests/ontopy_tests/testutils.py +++ b/tests/utilities/utilities.py @@ -1,6 +1,15 @@ -"""Test utility functions.""" +from pathlib import Path +from typing import TYPE_CHECKING +import pytest + +if TYPE_CHECKING: + from ontopy.ontology import Ontology + from typing import Sequence + + +# Utilities def abbreviate(onto, iri, must_exist=True): """Returns existing Owlready2 storid for `iri`.""" if iri is None: @@ -38,3 +47,7 @@ def has_triple(onto, s=None, p=None, o=None) -> bool: return bool(get_triples(onto, s, p, o)) except ValueError: return False + + +def setassert(values: "Sequence(str)", expected: "Sequence(str)") -> None: + assert set(str(val) for val in values) == set(str(val) for val in expected)