{ "cells": [ { "cell_type": "markdown", "id": "a188d65b-f5c3-405f-a051-de5585312b4e", "metadata": {}, "source": [ "# Referencing Standard Name Tables\n", "\n", "There are multiple ways of associating tables to other objects such as a project or an HDF5 file" ] }, { "cell_type": "code", "execution_count": 1, "id": "9916f965-732f-4f14-b8fd-c829b6178f6c", "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "typing.Optional requires a single type. Got (, typing.List[ontolutils.classes.thing.LangString]).", "output_type": "error", "traceback": [ "\u001b[31m---------------------------------------------------------------------------\u001b[39m", "\u001b[31mTypeError\u001b[39m Traceback (most recent call last)", "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[1]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[38;5;28;01mimport\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mssnolib\u001b[39;00m\n", "\u001b[36mFile \u001b[39m\u001b[32m~\\Documents\\GitHub\\ssnolib\\ssnolib\\__init__.py:8\u001b[39m\n\u001b[32m 5\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01m.\u001b[39;00m\u001b[34;01mssno\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m StandardNameTable, Qualification, VectorQualification, Transformation, Character, AgentRole, \\\n\u001b[32m 6\u001b[39m VectorStandardName, StandardName, ScalarStandardName, DomainConceptSet\n\u001b[32m 7\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01m.\u001b[39;00m\u001b[34;01mutils\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m get_cache_dir\n\u001b[32m----> \u001b[39m\u001b[32m8\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01m.\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m schema\n\u001b[32m 9\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01m.\u001b[39;00m\u001b[34;01mssno\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mstandard_name_table\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m parse_table\n\u001b[32m 11\u001b[39m CACHE_DIR = get_cache_dir()\n", "\u001b[36mFile \u001b[39m\u001b[32m~\\Documents\\GitHub\\ssnolib\\ssnolib\\schema\\__init__.py:1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01m.\u001b[39;00m\u001b[34;01mproject\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m Project, ResearchProject\n\u001b[32m 3\u001b[39m __all__ = (\u001b[33m\"\u001b[39m\u001b[33mProject\u001b[39m\u001b[33m\"\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33mResearchProject\u001b[39m\u001b[33m\"\u001b[39m)\n", "\u001b[36mFile \u001b[39m\u001b[32m~\\Documents\\GitHub\\ssnolib\\ssnolib\\schema\\project.py:19\u001b[39m\n\u001b[32m 7\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mssnolib\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m Organization, Person, StandardNameTable\n\u001b[32m 8\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mssnolib\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mdcat\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m Dataset\n\u001b[32m 11\u001b[39m \u001b[38;5;129;43m@namespaces\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mschema\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mhttps://schema.org/\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 12\u001b[39m \u001b[43m \u001b[49m\u001b[43mssno\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mhttps://matthiasprobst.github.io/ssno#\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[32m 13\u001b[39m \u001b[38;5;129;43m@urirefs\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mProject\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43mschema:Project\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 14\u001b[39m \u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43mschema:name\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 15\u001b[39m \u001b[43m \u001b[49m\u001b[43midentifier\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43mschema:identifier\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 16\u001b[39m \u001b[43m \u001b[49m\u001b[43mfunder\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43mschema:funder\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 17\u001b[39m \u001b[43m \u001b[49m\u001b[43musesStandardnameTable\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43mssno:usesStandardnameTable\u001b[39;49m\u001b[33;43m'\u001b[39;49m\n\u001b[32m 18\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m---> \u001b[39m\u001b[32m19\u001b[39m \u001b[38;5;28;43;01mclass\u001b[39;49;00m\u001b[38;5;250;43m \u001b[39;49m\u001b[34;43;01mProject\u001b[39;49;00m\u001b[43m(\u001b[49m\u001b[43mThing\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[32m 20\u001b[39m \u001b[38;5;250;43m \u001b[39;49m\u001b[33;43;03m\"\"\"Implementation of schema:Project\"\"\"\u001b[39;49;00m\n\u001b[32m 21\u001b[39m \u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mOptional\u001b[49m\u001b[43m[\u001b[49m\u001b[43mLangString\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mList\u001b[49m\u001b[43m[\u001b[49m\u001b[43mLangString\u001b[49m\u001b[43m]\u001b[49m\u001b[43m]\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43mField\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdefault\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\n", "\u001b[36mFile \u001b[39m\u001b[32m~\\Documents\\GitHub\\ssnolib\\ssnolib\\schema\\project.py:21\u001b[39m, in \u001b[36mProject\u001b[39m\u001b[34m()\u001b[39m\n\u001b[32m 11\u001b[39m \u001b[38;5;129m@namespaces\u001b[39m(schema=\u001b[33m\"\u001b[39m\u001b[33mhttps://schema.org/\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m 12\u001b[39m ssno=\u001b[33m\"\u001b[39m\u001b[33mhttps://matthiasprobst.github.io/ssno#\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 13\u001b[39m \u001b[38;5;129m@urirefs\u001b[39m(Project=\u001b[33m'\u001b[39m\u001b[33mschema:Project\u001b[39m\u001b[33m'\u001b[39m,\n\u001b[32m (...)\u001b[39m\u001b[32m 18\u001b[39m )\n\u001b[32m 19\u001b[39m \u001b[38;5;28;01mclass\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mProject\u001b[39;00m(Thing):\n\u001b[32m 20\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"Implementation of schema:Project\"\"\"\u001b[39;00m\n\u001b[32m---> \u001b[39m\u001b[32m21\u001b[39m name: \u001b[43mOptional\u001b[49m\u001b[43m[\u001b[49m\u001b[43mLangString\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mList\u001b[49m\u001b[43m[\u001b[49m\u001b[43mLangString\u001b[49m\u001b[43m]\u001b[49m\u001b[43m]\u001b[49m = Field(default=\u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[32m 22\u001b[39m identifier: Optional[Union[\u001b[38;5;28mstr\u001b[39m, HttpUrl]] = Field(default=\u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[32m 23\u001b[39m funder: Optional[Union[Person, Organization]] = Field(default=\u001b[38;5;28;01mNone\u001b[39;00m)\n", "\u001b[36mFile \u001b[39m\u001b[32m~\\anaconda3\\envs\\ssnolib\\Lib\\typing.py:379\u001b[39m, in \u001b[36m_tp_cache..decorator..inner\u001b[39m\u001b[34m(*args, **kwds)\u001b[39m\n\u001b[32m 377\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m:\n\u001b[32m 378\u001b[39m \u001b[38;5;28;01mpass\u001b[39;00m \u001b[38;5;66;03m# All real errors (not unhashable args) are raised below.\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m379\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwds\u001b[49m\u001b[43m)\u001b[49m\n", "\u001b[36mFile \u001b[39m\u001b[32m~\\anaconda3\\envs\\ssnolib\\Lib\\typing.py:502\u001b[39m, in \u001b[36m_SpecialForm.__getitem__\u001b[39m\u001b[34m(self, parameters)\u001b[39m\n\u001b[32m 500\u001b[39m \u001b[38;5;129m@_tp_cache\u001b[39m\n\u001b[32m 501\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m__getitem__\u001b[39m(\u001b[38;5;28mself\u001b[39m, parameters):\n\u001b[32m--> \u001b[39m\u001b[32m502\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_getitem\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparameters\u001b[49m\u001b[43m)\u001b[49m\n", "\u001b[36mFile \u001b[39m\u001b[32m~\\anaconda3\\envs\\ssnolib\\Lib\\typing.py:726\u001b[39m, in \u001b[36mOptional\u001b[39m\u001b[34m(self, parameters)\u001b[39m\n\u001b[32m 723\u001b[39m \u001b[38;5;129m@_SpecialForm\u001b[39m\n\u001b[32m 724\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mOptional\u001b[39m(\u001b[38;5;28mself\u001b[39m, parameters):\n\u001b[32m 725\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"Optional[X] is equivalent to Union[X, None].\"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m726\u001b[39m arg = \u001b[43m_type_check\u001b[49m\u001b[43m(\u001b[49m\u001b[43mparameters\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[33;43mf\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[33;43m requires a single type.\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[32m 727\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m Union[arg, \u001b[38;5;28mtype\u001b[39m(\u001b[38;5;28;01mNone\u001b[39;00m)]\n", "\u001b[36mFile \u001b[39m\u001b[32m~\\anaconda3\\envs\\ssnolib\\Lib\\typing.py:197\u001b[39m, in \u001b[36m_type_check\u001b[39m\u001b[34m(arg, msg, is_argument, module, allow_special_forms)\u001b[39m\n\u001b[32m 195\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mPlain \u001b[39m\u001b[38;5;132;01m{\u001b[39;00marg\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m is not valid as type argument\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 196\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mtype\u001b[39m(arg) \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28mtuple\u001b[39m:\n\u001b[32m--> \u001b[39m\u001b[32m197\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mmsg\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m Got \u001b[39m\u001b[38;5;132;01m{\u001b[39;00marg\u001b[38;5;132;01m!r:\u001b[39;00m\u001b[33m.100\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m.\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 198\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m arg\n", "\u001b[31mTypeError\u001b[39m: typing.Optional requires a single type. Got (, typing.List[ontolutils.classes.thing.LangString])." ] } ], "source": [ "import ssnolib" ] }, { "cell_type": "markdown", "id": "4b118d9a-4439-4039-9083-e87ebb9b02a8", "metadata": {}, "source": [ "## Referencing to a Project\n", "\n", "The vocabulary/ontology classes we want to reference to are `schema:Project` or `schema:ResearchProject`\n", "\n", "In this example, we want to describe a Standard Name Table, which has been published on [Zenodo](https://zenodo.org/).\n", "\n", "In fact, this is very simple, because it does *not* require the `SSNO` ontology but rather the `DCAT` vocabulary. However, the `ssnolib` library provides the necessary classes.\n", "\n", "Later, by associating a *thing*, e.g. a project or an HDF5 file, we will use `ssno:usesStandardNameTable`, which may point to either `ssno:StandardNameTable` or the `dcat:Dataset` we define below." ] }, { "cell_type": "code", "execution_count": null, "id": "de63248d-0c60-431d-9555-1c4a13317c62", "metadata": {}, "outputs": [], "source": [ "snt_dist = ssnolib.dcat.Distribution(\n", " downloadURL=\"https://sandbox.zenodo.org/records/123202/files/Standard_Name_Table_for_the_Property_Descriptions_of_Centrifugal_Fans.jsonld\",\n", " media_type=\"application/json+ld\"\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "5a595e23-4039-4075-9b2c-6c093a2552ac", "metadata": {}, "outputs": [], "source": [ "dataset = ssnolib.dcat.Dataset(\n", " identifier=\"https://sandbox.zenodo.org/uploads/123202\",\n", " distribution=snt_dist\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "995e0b77-604d-4c4a-88d0-dd00918b2cb2", "metadata": {}, "outputs": [], "source": [ "print(dataset.model_dump_ttl())" ] }, { "cell_type": "markdown", "id": "996e6b08-32f1-42ed-a4f5-7f3898d427c8", "metadata": {}, "source": [ "Now let's associate a Project with a standard name table file published on Zenodo:" ] }, { "cell_type": "code", "execution_count": null, "id": "df870153-0d8b-47dc-94d2-c719df77cb1f", "metadata": {}, "outputs": [], "source": [ "from ssnolib.schema import Project, ResearchProject" ] }, { "cell_type": "code", "execution_count": null, "id": "1ae388bb-f33e-463c-9199-3311aa3a387a", "metadata": {}, "outputs": [], "source": [ "proj = Project(name=\"My Project@en\", usesStandardnameTable=dataset)\n", "research_proj = ResearchProject(name=\"My Project\", usesStandardnameTable=dataset)" ] }, { "cell_type": "code", "execution_count": null, "id": "8f8d03b5-0b3b-4d78-b4ff-643d6016514e", "metadata": {}, "outputs": [], "source": [ "print(proj.model_dump_ttl())" ] }, { "cell_type": "markdown", "id": "91bef358-6b77-44cc-bdce-101884af4a14", "metadata": {}, "source": [ "## Referencing to an HDF5 file\n", "\n", "We use the ontology http://purl.allotrope.org/ontologies/hdf5/1.8# to reference the table to a `hdf5:File`" ] }, { "cell_type": "code", "execution_count": null, "id": "2d553bfb-cc39-4472-8628-fbb5248cf6a3", "metadata": {}, "outputs": [], "source": [ "from ssnolib import hdf5" ] }, { "cell_type": "code", "execution_count": null, "id": "863af1c3-b181-4fbc-8fe4-ee9b4e591a70", "metadata": {}, "outputs": [], "source": [ "file = hdf5.File(uses_standard_name_table=dataset)" ] }, { "cell_type": "code", "execution_count": null, "id": "e35bebe7-622c-4dd4-8187-4e5c74f688e6", "metadata": {}, "outputs": [], "source": [ "print(file.model_dump_ttl())" ] }, { "cell_type": "code", "execution_count": null, "id": "c36209d4-5869-4119-a8b9-1a591a505a9c", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.11" } }, "nbformat": 4, "nbformat_minor": 5 }