[
  {
    "path": ".github/ISSUE_TEMPLATE/new_sssom_element.md",
    "content": "---\ntitle: \"[New metadata element]: \"\nname: Add new SSSOM metadata element\nabout: New metadata element suggestion for SSSOM\nassignees: matentzn \nlabels: 'new metadata element request'\n---\n\n**Element id (e.g. creator_id, mapping_tool_version):**\n(Must be lower case and contain only letters and underscores.)\n\n```\nelement_id_example\n```\n\n**Value data type (e.g. URI, URL, text, xsd:boolean):**\n\n```\nxsd:string\n```\n\n**Description**\n(Provide a human-readable description that clarifies the intended use of the metadata element.)\n\nExample description.\n\n**Complete example to a SSSOM file with this element**\n(This example can be given as a markdown table or a linked SSSOM file, feel free to edit the markdown table below)\n\n```\n# curie_map:\n#   HP: http://purl.obolibrary.org/obo/FBbt_\n#   MP: http://purl.obolibrary.org/obo/UBERON_\n#   owl: http://www.w3.org/2002/07/owl#\n#   rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns#\n#   rdfs: http://www.w3.org/2000/01/rdf-schema#\n#   semapv: https://w3id.org/semapv/vocab/\n#   skos: http://www.w3.org/2004/02/skos/core#\n#   sssom: https://w3id.org/sssom/\n# license: https://w3id.org/sssom/license/unspecified\n# mapping_set_id: https://w3id.org/sssom/mappings/ac9e1878-73f4-4767-8402-a6c40e1b0835\n```\n\n| subject_id\t| predicate_id\t  | object_id\t  | mapping_justification   | element_id_example\t| \n| ----------- | --------------- | ----------- | ----------------------- | ------------------- |\n| HP:0009124\t| skos:exactMatch\t| MP:0000003\t| semapv:LexicalMatching\t| YOUR EXAMPLE VALUE\t| \n| HP:0008551\t| skos:exactMatch\t| MP:0000018\t| semapv:LexicalMatching\t| YOUR EXAMPLE VALUE\t|\n"
  },
  {
    "path": ".github/pull_request_template.md",
    "content": "Resolves [#ISSUE, #ISSUE]\n\n- [ ] `docs/` have been added/updated if necessary\n- [ ] `make test` has been run locally\n- [ ] tests have been added/updated (if applicable)\n- [ ] [CHANGELOG.md](https://github.com/mapping-commons/sssom/blob/master/CHANGELOG.md) has been updated.\n\nIf you are proposing a change to the SSSOM metadata model, you must \n\n- [ ] provide a full, working and valid example in `examples/`\n- [ ] provide a link to the related GitHub issue in the `see_also` field of the linkml model\n- [ ] provide a link to a valid example in the `see_also` field of the linkml model\n- [ ] update the \"Model changes across versions\" (in `src/docs/spec-models.md`) accordingly\n- [ ] run SSSOM-Py test suite against the updated model\n\n\n[Add a description, mentioning at least relevant #ISSUE and how it was addressed. A bulleted list of all changes performed by the PR is is helpful.]\n"
  },
  {
    "path": ".github/workflows/build.yml",
    "content": "name: Build\non:\n  workflow_dispatch:\n  #push:\n  #  branches: [ master ]\n  #  paths:\n  #    - 'src/linkml/sssom.yaml'\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Check out repository\n        uses: actions/checkout@v4.2.2\n        with:\n          persist-credentials: false # otherwise, the token used is the GITHUB_TOKEN, instead of your personal token\n          fetch-depth: 0 # otherwise, you will fail to push refs to dest repo\n\n      - name: Install uv\n        uses: astral-sh/setup-uv@cec208311dfd045dd5311c1add060b2062131d57 # v8.0.0\n\n      - name: Set up Python\n        run: uv python install 3.10\n\n      - name: Install dependencies\n        run: uv sync --all-groups\n\n      - name: Create local changes\n        run: |\n          make all\n\n      - name: Commit files\n        run: |\n          git config --local user.email \"action@github.com\"\n          git config --local user.name \"GitHub Action\"\n          git commit -m \"Rebuilding documentation and generated files with Github Action\" -a\n\n      - name: Push changes\n        uses: ad-m/github-push-action@master\n        with:\n          github_token: ${{ secrets.GITHUB_TOKEN }}\n          branch: ${{ github.ref }}\n"
  },
  {
    "path": ".github/workflows/codespell.yml",
    "content": "# Codespell configuration is within pyproject.toml\n---\nname: Codespell\n\non:\n  push:\n    branches: [master]\n  pull_request:\n    branches: [master]\n\npermissions:\n  contents: read\n\njobs:\n  codespell:\n    name: Check for spelling errors\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4.2.2\n      - name: Annotate locations with typos\n        uses: codespell-project/codespell-problem-matcher@9ba2c57125d4908eade4308f32c4ff814c184633\n      - name: Codespell\n        uses: codespell-project/actions-codespell@94259cd8be02ad2903ba34a22d9c13de21a74461\n"
  },
  {
    "path": ".github/workflows/deploy_documentation.yml",
    "content": "name: Deploy Documentation\n\n# Controls when the action will run. Triggers the workflow on push\non:\n  workflow_dispatch:\n  push:\n    branches:\n      - master\n\n    paths:\n      - \"src/docs/*\"\n      - \"src/sssom_schema/schema/sssom_schema.yaml\"\n      - \"mkdocs.yml\"\n\n# A workflow run is made up of one or more jobs that can run sequentially or in parallel\njobs:\n  build-docs:\n    # The type of runner that the job will run on\n    runs-on: ubuntu-latest\n\n    permissions:\n      contents: write\n\n    # Steps represent a sequence of tasks that will be executed as part of the job\n    steps:\n      #----------------------------------------------\n      #       check-out repo and set-up python\n      #----------------------------------------------\n      - name: Check out repository\n        uses: actions/checkout@v4.2.2\n        with:\n          # persist-credentials: false # otherwise, the token used is the GITHUB_TOKEN, instead of your personal token\n          fetch-depth: 0 # otherwise, you will fail to push refs to dest repo\n\n      - name: Install uv\n        uses: astral-sh/setup-uv@cec208311dfd045dd5311c1add060b2062131d57 # v8.0.0\n\n      - name: Set up Python\n        run: uv python install 3.10\n\n      - name: Install dependencies\n        run: uv sync --all-groups\n\n      #----------------------------------------------\n      #           generate markdown files\n      #----------------------------------------------\n      - name: Create local docs\n        run: |\n          mkdir -p docs\n          touch docs/.nojekyll\n          make gendoc\n\n      #----------------------------------------------\n      #           deploy website to gh-pages\n      #----------------------------------------------\n      - name: Deploy web-based documentation to GitHub Pages\n        run: |\n          git config user.name mike-bot\n          git config user.email mike-bot@sssom.invalid\n          make deploy-doc\n"
  },
  {
    "path": ".github/workflows/main.yaml",
    "content": "# Built from:\n# https://docs.github.com/en/actions/guides/building-and-testing-python\n\nname: Build and test sssom\n\non:\n  pull_request:\n    branches: [master]\n    types: [opened, synchronize, reopened]\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        python-version: [\"3.10\", \"3.14\"]\n\n    steps:\n      - name: Check out repository\n        uses: actions/checkout@v4.2.2\n        with:\n          fetch-depth: 0\n\n      - name: Install uv\n        uses: astral-sh/setup-uv@cec208311dfd045dd5311c1add060b2062131d57 # v8.0.0\n\n      - name: Set up Python ${{ matrix.python-version }}\n        run: uv python install ${{ matrix.python-version }}\n\n      - name: Install dependencies\n        run: uv sync --all-groups\n\n      - name: Run tests\n        run: make test\n\n      #----------------------------------------------\n      #              YAML linting\n      #----------------------------------------------\n      - name: Install Prettier\n        run: npm install prettier\n      - name: Lint YML\n        run: npx prettier --check --prose-wrap always \"**/*.yml\"\n      - name: Lint YAML\n        run: npx prettier --check --prose-wrap always \"**/*.yaml\"\n"
  },
  {
    "path": ".github/workflows/pypi-publish.yaml",
    "content": "name: Publish Python Package\n# Upload to PyPI is triggered by creating & publishing a release in GitHub UI\n\non:\n  release:\n    # Run when a release is published or a prerelease is published (not on draft creation)\n    types: [published]\n\njobs:\n  build:\n    name: Build Python 🐍 distributions 📦 for publishing to PyPI\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4.2.2\n        with:\n          # Checkout the code including tags required for dynamic versioning\n          fetch-depth: 0\n\n      - name: Install uv\n        uses: astral-sh/setup-uv@cec208311dfd045dd5311c1add060b2062131d57 # v8.0.0\n\n      - name: Set up Python\n        run: uv python install 3.10\n\n      - name: Build source and wheel archives\n        run: uv build\n\n      - name: Store built distribution\n        uses: actions/upload-artifact@v4.6.2\n        with:\n          name: distribution-files\n          path: dist/\n\n  pypi-publish:\n    name: Build and publish Python 🐍 package 📦 to PyPI\n    needs: build\n    runs-on: ubuntu-latest\n    # Uses trusted publishing. https://docs.pypi.org/trusted-publishers/adding-a-publisher/\n    environment:\n      name: pypi-release\n      url: https://pypi.org/p/sssom-schema\n    permissions:\n      id-token: write # This permission is mandatory for trusted publishing.\n    steps:\n      - name: Download built distribution\n        uses: actions/download-artifact@v4.3.0\n        with:\n          name: distribution-files\n          path: dist\n\n      - name: Publish package 📦 to PyPI\n        uses: pypa/gh-action-pypi-publish@v1.12.4\n        with:\n          verbose: true\n          skip-existing: true\n"
  },
  {
    "path": ".gitignore",
    "content": "/docs/\n/project/docs/\n\n# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\npip-wheel-metadata/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n.python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# PEP 582; used by e.g. github.com/David-OConnor/pyflow\n__pypackages__/\n\n# Celery stuff\ncelerybeat-schedule\ncelerybeat.pid\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n.DS_Store\ntmp/\n/node_modules\npackage-lock.json\n"
  },
  {
    "path": ".prettierignore",
    "content": "project/prefixmap/sssom_schema.yaml\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Changelog for SSSOM\n\n## Next\n\n- Add `composed entity expression` as a new value in the `EntityType` enumeration ([issue](https://github.com/mapping-commons/sssom/issues/402)).\n- Add `predicate_type` slot (previously defined but unused) to the `Mapping` and `MappingSet` classes ([issue](https://github.com/mapping-commons/sssom/issues/404)).\n- Add `similarity_measure` slot to the `MappingSet` class ([issue](https://github.com/mapping-commons/sssom/issues/411)).\n- Add `sssom_version` slot to the `MappingSet` class ([issue](https://github.com/mapping-commons/sssom/issues/439)).\n- Change the type of the `see_also` slot to `xsd:anyURI` ([issue](https://github.com/mapping-commons/sssom/issues/422)).\n- Add `mapping_set_confidence` slot to the `MappingSet` class ([issue](https://github.com/mapping-commons/sssom/issues/438)).\n- Updated the RDF binding of sssom:publication_date from dcterms:created to dcterms:issued, which is the more appropriate property to use in this case.\n- Add `mapping_tool_id` slot to the `Mapping` and `MappingSet` classes ([issue](https://github.com/mapping-commons/sssom/issues/449)).\n- Add `record_id` slot to the `Mapping` class ([issue](https://github.com/mapping-commons/sssom/issues/359)).\n- Change all URI-typed slots to clarify that they expect _non-relative_ URIs as values ([issue](https://github.com/mapping-commons/sssom/issues/448)).\n- Add `curation_rule` and `curation_rule_text` to the `MappingSet` class and made propagatable ([issue](https://github.com/mapping-commons/sssom/issues/464)).\n- Add `cardinality_scope` slot ([issue](https://github.com/mapping-commons/sssom/issues/467)).\n- Add new value `0:0` to the `mapping_cardinality_enum` ([issue](https://github.com/mapping-commons/sssom/issues/477)).\n- Add specification for the RDF serialisation ([discussion](https://github.com/mapping-commons/sssom/discussions/454)).\n- Development snapshots of SSSOM schema can now be released using GitHub's pre-release feature ([issue](https://github.com/mapping-commons/sssom/issues/490)).\n- Add `review_date` slot ([issue](https://github.com/mapping-commons/sssom/issues/511))\n- Add `reviewer_agreement` slot ([issue](https://github.com/mapping-commons/sssom/issues/510))\n- Allow encoding pipe characters in multi-valued slots in SSSOM/TSV format ([issue](https://github.com/mapping-commons/sssom/issues/429)).\n- Specify a standard SSSOM hashing function ([issue](https://github.com/mapping-commons/sssom/issues/436)).\n\n## SSSOM version 1.0.0\n\n- Add the concept of \"propagatable slots\".\n- Add the `curie_map` to the model (instead of it being a specificity of the SSSOM/TSV format).\n- Add the concept of \"extension slots\".\n- Add the concept of \"literal mappings\".\n- Add the entity reference `sssom:NoTermFound` to express the concept of an \"unmapped entity\" ([issue](https://github.com/mapping-commons/sssom/issues/28))\n- Replace `semantic_similarity_score` with `similarity_score` and `semantic_similarity_measure` with `similarity_measure` in the data model ([issue](https://github.com/mapping-commons/sssom/issues/385))\n\n## SSSOM version 0.15.1\n\n- Add recommendation to sort the keys in the YAML metadata block.\n- Double-typed slots explicitly constrained to the [0.0,1.0] range, as per their description.\n\n## SSSOM version 0.15.0\n\n- Add issue_tracker_item and issue_tracker [model elements](https://github.com/mapping-commons/sssom/pull/259).\n\n## SSSOM version 0.13.0\n\n- The necessity of the \"canonical column ordering\" was downgraded from MUST to SHOULD (https://github.com/mapping-commons/sssom/pull/285)\n- Documents clearly that built-in prefixes MUST NOT be redefined (https://github.com/mapping-commons/sssom/pull/285)\n\n## SSSOM version 0.11.0\n\n- see https://github.com/mapping-commons/sssom/releases/tag/0.11.0\n\n### Summary\n\n#### New elements:\n- `mapping_set_title` to capture a human readable title for a mapping set\n- `registry_title` and `registry_description` to capture the human readable title and description of an SSSOM mapping set registry\n- `curation_rule` to capture a (potentially) complex (set of) condition(s) executed by an agent (usually human) that led to the establishment of a mapping. \n\n#### Updated elements:\n- Adding mapping_source slot to Mapping by @matentzn in #230\n- Improve documentation for `subject_category` and `object_category` elements\n\n#### Documentation\n- Compiled a list of all SSSOM talks: https://mapping-commons.github.io/sssom/presentations/\n- Document chaining rules: https://mapping-commons.github.io/sssom/chaining_rules/\n\n#### Quality control and Technical infrastructure\n\n- Make adding a concrete SSSOM example part of the new element request\n- Adding QC checks for example SSSOM files hosted in the repo\n\n## SSSOM version 0.10.1\n\n- see https://github.com/mapping-commons/sssom/releases/tag/0.10.1\n\n## SSSOM version 0.9.4\n\n- see https://github.com/mapping-commons/sssom/releases/tag/0.9.4\n\n## SSSOM version 0.9.3\n\n- see https://github.com/mapping-commons/sssom/releases/tag/0.9.3\n- Major change: Changed `match_type` logic to `mapping_justification` ([issue](https://github.com/mapping-commons/sssom/issues/150)).\n\n\n## SSSOM version 0.9.2\n\n- see https://github.com/mapping-commons/sssom/releases/tag/0.9.2\n\n## SSSOM version 0.9.1\n\n- see https://github.com/mapping-commons/sssom/releases/tag/0.9.1\n\n## SSSOM version 0.9.0\n- Initial release\n- see https://github.com/mapping-commons/sssom/releases/tag/0.9.0\n"
  },
  {
    "path": "CITATION.cff",
    "content": "cff-version: '1.1.0'\nmessage: 'Please cite the following works when using this software.'\nabstract: \"<jats:title>Abstract</jats:title>\\n               <jats:p>Despite progress in the development of standards for describing and exchanging scientific information, the lack of easy-to-use standards for mapping between different representations of the same or similar objects in different databases poses a major impediment to data integration and interoperability. Mappings often lack the metadata needed to be correctly interpreted and applied. For example, are two terms equivalent or merely related? Are they narrow or broad matches? Or are they associated in some other way? Such relationships between the mapped terms are often not documented, which leads to incorrect assumptions and makes them hard to use in scenarios that require a high degree of precision (such as diagnostics or risk prediction). Furthermore, the lack of descriptions of how mappings were done makes it hard to combine and reconcile mappings, particularly curated and automated ones. We have developed the Simple Standard for Sharing Ontological Mappings (SSSOM) which addresses these problems by: (i) Introducing a machine-readable and extensible vocabulary to describe metadata that makes imprecision, inaccuracy and incompleteness in mappings explicit. (ii) Defining an easy-to-use simple table-based format that can be integrated into existing data science pipelines without the need to parse or query ontologies, and that integrates seamlessly with Linked Data principles. (iii) Implementing open and community-driven collaborative workflows that are designed to evolve the standard continuously to address changing requirements and mapping practices. (iv) Providing reference tools and software libraries for working with the standard. In this paper, we present the SSSOM standard, describe several use cases in detail and survey some of the existing work on standardizing the exchange of mappings, with the goal of making mappings Findable, Accessible, Interoperable and Reusable (FAIR). The SSSOM specification can be found at http://w3id.org/sssom/spec.</jats:p>\\n               <jats:p>Database URL: http://w3id.org/sssom/spec</jats:p>\"\nauthors:\n  - family-names: 'Matentzoglu'\n    given-names: 'Nicolas'\n  - family-names: 'Balhoff'\n    given-names: 'James P'\n  - family-names: 'Bello'\n    given-names: 'Susan M'\n  - family-names: 'Bizon'\n    given-names: 'Chris'\n  - family-names: 'Brush'\n    given-names: 'Matthew'\n  - family-names: 'Callahan'\n    given-names: 'Tiffany J'\n  - family-names: 'Chute'\n    given-names: 'Christopher G'\n  - family-names: 'Duncan'\n    given-names: 'William D'\n  - family-names: 'Evelo'\n    given-names: 'Chris T'\n  - family-names: 'Gabriel'\n    given-names: 'Davera'\n  - family-names: 'Graybeal'\n    given-names: 'John'\n  - family-names: 'Gray'\n    given-names: 'Alasdair'\n  - family-names: 'Gyori'\n    given-names: 'Benjamin M'\n  - family-names: 'Haendel'\n    given-names: 'Melissa'\n  - family-names: 'Harmse'\n    given-names: 'Henriette'\n  - family-names: 'Harris'\n    given-names: 'Nomi L'\n  - family-names: 'Harrow'\n    given-names: 'Ian'\n  - family-names: 'Hegde'\n    given-names: 'Harshad B'\n  - family-names: 'Hoyt'\n    given-names: 'Amelia L'\n  - family-names: 'Hoyt'\n    given-names: 'Charles T'\n  - family-names: 'Jiao'\n    given-names: 'Dazhi'\n  - family-names: 'Jiménez-Ruiz'\n    given-names: 'Ernesto'\n  - family-names: 'Jupp'\n    given-names: 'Simon'\n  - family-names: 'Kim'\n    given-names: 'Hyeongsik'\n  - family-names: 'Koehler'\n    given-names: 'Sebastian'\n  - family-names: 'Liener'\n    given-names: 'Thomas'\n  - family-names: 'Long'\n    given-names: 'Qinqin'\n  - family-names: 'Malone'\n    given-names: 'James'\n  - family-names: 'McLaughlin'\n    given-names: 'James A'\n  - family-names: 'McMurry'\n    given-names: 'Julie A'\n  - family-names: 'Moxon'\n    given-names: 'Sierra'\n  - family-names: 'Munoz-Torres'\n    given-names: 'Monica C'\n  - family-names: 'Osumi-Sutherland'\n    given-names: 'David'\n  - family-names: 'Overton'\n    given-names: 'James A'\n  - family-names: 'Peters'\n    given-names: 'Bjoern'\n  - family-names: 'Putman'\n    given-names: 'Tim'\n  - family-names: 'Queralt-Rosinach'\n    given-names: 'Núria'\n  - family-names: 'Shefchek'\n    given-names: 'Kent'\n  - family-names: 'Solbrig'\n    given-names: 'Harold'\n  - family-names: 'Thessen'\n    given-names: 'Anne'\n  - family-names: 'Tudorache'\n    given-names: 'Tania'\n  - family-names: 'Vasilevsky'\n    given-names: 'Nicole'\n  - family-names: 'Wagner'\n    given-names: 'Alex H'\n  - family-names: 'Mungall'\n    given-names: 'Christopher J'\ndoi: '10.1093/database/baac035'\nidentifiers:\n  - type: 'doi'\n    value: '10.1093/database/baac035'\n  - type: 'url'\n    value: 'http://dx.doi.org/10.1093/database/baac035'\n  - type: 'other'\n    value: 'urn:issn:1758-0463'\ntitle: 'A Simple Standard for Sharing Ontological Mappings (SSSOM)'\nurl: 'http://dx.doi.org/10.1093/database/baac035'\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to make participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment include:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or advances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or electronic address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be reported by [contacting the project team](contact.md). All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.\n\n## Attribution\n\nThis code of conduct has been derived from the excellent code of conduct of the [ATOM project](https://github.com/atom/atom/blob/master/CODE_OF_CONDUCT.md) which in turn is adapted from the [Contributor Covenant][homepage], version 1.4, available at [https://contributor-covenant.org/version/1/4][version]\n\n[homepage]: https://contributor-covenant.org\n[version]: https://contributor-covenant.org/version/1/4/\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing to SSSOM\n\n:+1: First of all: Thank you for taking the time to contribute!\n\nThe following is a set of guidelines for contributing to SSSOM. They are derived\nfrom the excellent contribution guidelines for the\n[ATOM Editor](https://github.com/atom/atom/blob/master/CONTRIBUTING.md) and are\nmostly guidelines, not rules. Use your best judgment, and feel free to propose\nchanges to this document in a pull request.\n\n#### Table Of Contents\n\n[Code of Conduct](#code-of-conduct)\n\n[I don't want to read this whole thing, I just have a question!!!](#i-dont-want-to-read-this-whole-thing-i-just-have-a-question)\n\n[What should I know before I get started?](#what-should-i-know-before-i-get-started)\n\n[How Can I Contribute?](#how-can-i-contribute)\n\n- [Reporting Bugs](#reporting-bugs)\n- [Your First Code Contribution](#your-first-code-contribution)\n- [Pull Requests](#pull-requests)\n- [Local Testing](#local-testing)\n- [Making a release](#making-a-release)\n\n[Style Guides](#styleguides)\n\n- [Git Commit Messages](#git-commit-messages)\n- [Documentation Styleguide](#documentation-styleguide)\n\n[Additional Notes](#additional-notes)\n\n- [Issue and Pull Request Labels](#issue-and-pull-request-labels)\n\n## Code of Conduct\n\nThis project and everyone participating in it is governed by the\n[SSSOM Code of Conduct](CODE_OF_CONDUCT.md). By participating, you are expected\nto uphold this code. Please report unacceptable behavior to\n[a member of the SSSOM core team](https://mapping-commons.github.io/sssom/contact/).\n\n## I don't want to read this whole thing I just have a question!!!\n\nWe have an official message board with a detailed FAQ and where the community\nchimes in with helpful advice if you have questions.\n\n- [GitGub Discussions](https://github.com/mapping-commons/sssom/discussions)\n- [SSSOM FAQ](https://mapping-commons.github.io/sssom/faq/)\n\n## What should I know before I get started?\n\n- Read the [introduction](https://mapping-commons.github.io/sssom/introduction/)\n- Do the [SSSOM tutorial](https://mapping-commons.github.io/sssom/tutorial/)\n- Read about the [SSSOM toolkit](https://mapping-commons.github.io/sssom-py),\n  which is managed\n  [in a different repo](https://github.com/mapping-commons/sssom-py)\n\n## How Can I Contribute?\n\n### Reporting Bugs\n\nThis section guides you through submitting a bug report for SSSOM. Following\nthese guidelines helps maintainers and the community understand your report\n:pencil:, reproduce the behavior :computer: :computer:, and find related reports\n:mag_right:.\n\nBefore creating bug reports, please check\n[this list](#before-submitting-a-bug-report) as you might find out that you\ndon't need to create one. When you are creating a bug report, please include as\nmany details as possible. Wherever available, use\n[existing issue tracker templates](https://github.com/mapping-commons/sssom/issues/new/choose),\nthe information it asks for helps us resolve issues faster.\n\n> **Note:** If you find a **Closed** issue that seems like it is the same thing\n> that you're experiencing, open a new issue and include a link to the original\n> issue in the body of your new one.\n\n#### Before Submitting A Bug Report\n\n- **Check the\n  [discussions](https://github.com/mapping-commons/sssom/discussions)** for a\n  list of common questions and problems.\n- **Decide whether the issue should be reported in the tracker for the\n  [SSSOM data model](https://github.com/mapping-commons/sssom/issues) or the\n  tracker for the\n  [SSSOM toolkit](https://github.com/mapping-commons/sssom-py/issues)**.\n- **Perform a\n  [cursory search](https://github.com/mapping-commons/sssom/issues)** to see if\n  the problem has already been reported. If it has **and the issue is still\n  open**, add a comment to the existing issue instead of opening a new one.\n\n#### How Do I Submit A (Good) Bug Report or Feature request?\n\nBugs and feature requests are tracked as\n[GitHub issues](https://guides.github.com/features/issues/). After you've\ndetermined which repository your bug or feature is related to, create an issue\non that repository providing the information required by\n[the appropriate template](https://github.com/mapping-commons/sssom/issues/new/choose).\n\nExplain the problem and include additional details to help maintainers reproduce\nthe problem:\n\n- **Use a clear and descriptive title** for the issue to identify the\n  problem/requests.\n- **Describe the exact steps which reproduce the problem** in as many details as\n  possible. For example, start by explaining how you started SSSOM, e.g. which\n  command exactly you used in the terminal, or how you started SSSOM otherwise.\n  When listing steps, **don't just say what you did, but explain how you did\n  it**. For example, if you moved the cursor to the end of a line, explain if\n  you used the mouse, or a keyboard shortcut or an SSSOM command, and if so\n  which one?\n- **Provide specific examples to demonstrate the steps**. Include links to files\n  or GitHub projects, or copy/pasteable snippets, which you use in those\n  examples. If you're providing snippets in the issue, use\n  [Markdown code blocks](https://help.github.com/articles/markdown-basics/#multiple-lines).\n- **Describe the behavior you observed after following the steps** and point out\n  what exactly is the problem with that behavior.\n- **Explain which behavior you expected to see instead and why.**\n\nInclude details about your configuration and environment:\n\n- **Which version of SSSOM toolkit/model are you using?** You can get the exact\n  version by running `sssom --version` in your terminal\n- **What's the name and version of the OS you're using**?\n\n### Your First Code Contribution\n\nUnsure where to begin contributing to SSSOM? You can start by looking through\nthese `beginner` and `help-wanted` issues:\n\n- [Beginner issues][beginner] - issues which should only require a few lines of\n  code, and a test or two.\n- [Help wanted issues][help-wanted] - issues which should be a bit more involved\n  than `beginner` issues.\n\n### Considerations when proposing changes to the model\n\nNow that SSSOM 1.0 has been released, and until we start working on a\nhypothetical SSSOM 2.0, any proposed change to the SSSOM model must consider the\nissue of backwards compatibility.\n\nThe key point is that _a set that is compliant with version 1.0 of the\nspecification must be usable “as is” with an implementation compliant with any\n1.x version_.\n\nThis is automatically achieved if all the proposed changes do is _adding_ new\n_optional_ slots, or _new_ enumeration values. For that reason, it is strongly\nrecommended that evolution of the 1.x branch be limited to this type of changes\nonly, and that other changes be reserved for a hypothetical version 2.0.\n\nIn addition, new slots must be marked with a `added_in` annotation indicating\nthe version in which the slot will be introduced, as in the following example:\n\n```yaml\nmy_new_slot:\n  instantiates:\n    - sssom:Versionable\n  annotations:\n    added_in: \"1.1\"\n```\n\n### Pull Requests\n\nThe process described here has several goals:\n\n- Maintain SSSOM's quality\n- Fix problems that are important to users\n- Engage the community in working toward the best possible data model and\n  toolkit\n- Enable a sustainable system for SSSOM's maintainers to review contributions\n\nPlease follow these steps to have your contribution considered by the\nmaintainers:\n\n1. Follow all instructions in the pull request template (you will see them when\n   you open a pull request).\n2. Follow the [style guides](#styleguides)\n3. After you submit your pull request, verify that all\n   [status checks](https://help.github.com/articles/about-status-checks/) are\n   passing <details><summary>What if the status checks are failing?</summary>If\n   a status check is failing, and you believe that the failure is unrelated to\n   your change, please leave a comment on the pull request explaining why you\n   believe the failure is unrelated. A maintainer will re-run the status check\n   for you. If we conclude that the failure was a false positive, then we will\n   open an issue to track that problem with our status check suite.</details>\n\nWhile the prerequisites above must be satisfied prior to having your pull\nrequest reviewed, the reviewer(s) may ask you to complete additional design\nwork, tests, or other changes before your pull request can be ultimately\naccepted.\n\n### Local testing\n\nContributors are strongly advised to run the test suite locally even before\nsubmitting a pull request.\n\nPrepare the testing environment by running:\n\n```console\n$ make install\n```\n\nThis only needs to be run once after cloning the repository. After that, the\ntest suite can be run anytime with\n\n```console\n$ make test\n```\n\nIf you are making a change to the documentation/specification, you should also\ncheck how your changes are rendered, by running\n\n```console\n$ make serve\n```\n\nand opening `http://127.0.0.1:8000/sssom/` with your browser.\n\nFurthermore, any change to the LinkML model should also be tested against\nSSSOM-Py. To do so:\n\n1. In the current `sssom` repository, build the Python files derived from the\n   LinkML:\n\n   ```console\n   $ make all\n   ```\n\n2. Clone the SSSOM-Py repository somewhere (outside your current checkout of\n   `sssom`):\n\n   ```console\n   $ git clone https://github.com/mapping-commons/sssom-py.git\n   ```\n\n3. Initialize environment inside the newly cloned repository:\n\n   ```console\n   $ uv sync\n   ```\n\n4. Forcefully install your _local_ version of `sssom-schema` in the newly\n   initialized environment:\n\n   ```sh\n   $ uv pip install /path/to/your/sssom/repository\n   ```\n\n   You may get a warning about “incompatible sssom-schema versions”; this is due\n   to the fact that your local copy of `sssom` has a version number set to\n   `0.0.0` (the “real” version number is set at release time, when the package\n   is published to PyPI) and can be safely ignored.\n\n5. Run SSSOM-Py’s test suite:\n\n   ```sh\n   $ uv run --all-extras pytest\n   ```\n\n### Making a release\n\n<a id=\"releasing\"></a>\n\nBefore making a release, check that all the files that are derived from the\nLinkML schema are up-to-date. If they are not:\n\n- re-generate them by running `make all`;\n- commit all the files that were modified as a result of that command.\n\nUpdate any other file as needed (e.g. changelog, README, copyright notices,\netc.), and commit the corresponding changes.\n\nOnce the repository is ready for a release, tag the head commit of the main\nbranch with a version number tag. If the release is intended to be published on\nthe Python Package Index (which it normally should), the version tag MUST be of\nthe form `vVERSION` (`v` prefix followed by the actual intended version number).\n\nPush all changes to the main GitHub repository (including the tag), and create\nthe release from the new tag.\n\nBe careful that any new release that bumps either the major or the minor version\nnumber, and that is not a _pre_ release, will be interpreted not merely as a new\nversion of the `sssom_schema` Python package, but as a new version of the SSSOM\nspecification!\n\n## Styleguides\n\n### Git Commit Messages\n\n- Use the present tense (\"Add feature\" not \"Added feature\")\n- Use the imperative mood (\"Move cursor to...\" not \"Moves cursor to...\")\n- Limit the first line to 72 characters or less\n- Reference issues and pull requests liberally after the first line\n- Consider starting the commit message with an applicable emoji:\n  - :art: `:art:` when improving the format/structure of the code\n  - :racehorse: `:racehorse:` when improving performance\n  - :non-potable_water: `:non-potable_water:` when plugging memory leaks\n  - :memo: `:memo:` when writing docs\n  - :penguin: `:penguin:` when fixing something on Linux\n  - :apple: `:apple:` when fixing something on macOS\n  - :checkered_flag: `:checkered_flag:` when fixing something on Windows\n  - :bug: `:bug:` when fixing a bug\n  - :fire: `:fire:` when removing code or files\n  - :green_heart: `:green_heart:` when fixing the CI build\n  - :white_check_mark: `:white_check_mark:` when adding tests\n  - :lock: `:lock:` when dealing with security\n  - :arrow_up: `:arrow_up:` when upgrading dependencies\n  - :arrow_down: `:arrow_down:` when downgrading dependencies\n  - :shirt: `:shirt:` when removing linter warnings\n\n### Documentation Styleguide\n\n- Use [Markdown](https://daringfireball.net/projects/markdown).\n\n## Additional Notes\n\n### Issue and Pull Request Labels\n\nThis section lists the labels we use to help us track and manage issues and pull\nrequests. Most labels are used across all mapping commons repositories.\n\n#### Type of Issue and Issue State\n\n| Label name                | `mapping-commons/sssom` :mag_right:                       | `sssom`‑org :mag_right:                                            | Description                                                                                                                           |\n| ------------------------- | --------------------------------------------------------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------- |\n| `enhancement`             | [search][search-sssom-repo-label-enhancement]             | [search][search-mapping-commons-org-label-enhancement]             | Feature requests.                                                                                                                     |\n| `bug`                     | [search][search-sssom-repo-label-bug]                     | [search][search-mapping-commons-org-label-bug]                     | Confirmed bugs or reports that are very likely to be bugs.                                                                            |\n| `question`                | [search][search-sssom-repo-label-question]                | [search][search-mapping-commons-org-label-question]                | Questions more than bug reports or feature requests (e.g. how do I do X).                                                             |\n| `feedback`                | [search][search-sssom-repo-label-feedback]                | [search][search-mapping-commons-org-label-feedback]                | General feedback more than bug reports or feature requests.                                                                           |\n| `help-wanted`             | [search][search-sssom-repo-label-help-wanted]             | [search][search-mapping-commons-org-label-help-wanted]             | The SSSOM core team would appreciate help from the community in resolving these issues.                                               |\n| `beginner`                | [search][search-sssom-repo-label-beginner]                | [search][search-mapping-commons-org-label-beginner]                | Less complex issues which would be good first issues to work on for users who want to contribute to SSSOM.                            |\n| `more-information-needed` | [search][search-sssom-repo-label-more-information-needed] | [search][search-mapping-commons-org-label-more-information-needed] | More information needs to be collected about these problems or feature requests (e.g. steps to reproduce).                            |\n| `needs-reproduction`      | [search][search-sssom-repo-label-needs-reproduction]      | [search][search-mapping-commons-org-label-needs-reproduction]      | Likely bugs, but haven't been reliably reproduced.                                                                                    |\n| `blocked`                 | [search][search-sssom-repo-label-blocked]                 | [search][search-mapping-commons-org-label-blocked]                 | Issues blocked on other issues.                                                                                                       |\n| `duplicate`               | [search][search-sssom-repo-label-duplicate]               | [search][search-mapping-commons-org-label-duplicate]               | Issues which are duplicates of other issues, i.e. they have been reported before.                                                     |\n| `wontfix`                 | [search][search-sssom-repo-label-wontfix]                 | [search][search-mapping-commons-org-label-wontfix]                 | The SSSOM core team has decided not to fix these issues for now, either because they're working as intended or for some other reason. |\n\n[search-sssom-repo-label-enhancement]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Aenhancement\n[search-mapping-commons-org-label-enhancement]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Aenhancement\n[search-sssom-repo-label-bug]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Abug\n[search-mapping-commons-org-label-bug]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Abug\n[search-sssom-repo-label-question]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Aquestion\n[search-mapping-commons-org-label-question]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Aquestion\n[search-sssom-repo-label-feedback]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Afeedback\n[search-mapping-commons-org-label-feedback]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Afeedback\n[search-sssom-repo-label-help-wanted]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Ahelp-wanted\n[search-mapping-commons-org-label-help-wanted]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Ahelp-wanted\n[search-sssom-repo-label-beginner]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Abeginner\n[search-mapping-commons-org-label-beginner]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Abeginner\n[search-sssom-repo-label-more-information-needed]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Amore-information-needed\n[search-mapping-commons-org-label-more-information-needed]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Amore-information-needed\n[search-sssom-repo-label-needs-reproduction]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Aneeds-reproduction\n[search-mapping-commons-org-label-needs-reproduction]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Aneeds-reproduction\n[search-sssom-repo-label-triage-help-needed]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Atriage-help-needed\n[search-mapping-commons-org-label-triage-help-needed]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Atriage-help-needed\n[search-sssom-repo-label-windows]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Awindows\n[search-mapping-commons-org-label-windows]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Awindows\n[search-sssom-repo-label-linux]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Alinux\n[search-mapping-commons-org-label-linux]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Alinux\n[search-sssom-repo-label-mac]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Amac\n[search-mapping-commons-org-label-mac]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Amac\n[search-sssom-repo-label-documentation]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Adocumentation\n[search-mapping-commons-org-label-documentation]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Adocumentation\n[search-sssom-repo-label-performance]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Aperformance\n[search-mapping-commons-org-label-performance]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Aperformance\n[search-sssom-repo-label-security]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Asecurity\n[search-mapping-commons-org-label-security]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Asecurity\n[search-sssom-repo-label-ui]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Aui\n[search-mapping-commons-org-label-ui]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Aui\n[search-sssom-repo-label-api]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Aapi\n[search-mapping-commons-org-label-api]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Aapi\n[search-sssom-repo-label-crash]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Acrash\n[search-mapping-commons-org-label-crash]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Acrash\n[search-sssom-repo-label-auto-indent]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Aauto-indent\n[search-mapping-commons-org-label-auto-indent]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Aauto-indent\n[search-sssom-repo-label-encoding]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Aencoding\n[search-mapping-commons-org-label-encoding]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Aencoding\n[search-sssom-repo-label-network]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Anetwork\n[search-mapping-commons-org-label-network]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Anetwork\n[search-sssom-repo-label-uncaught-exception]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Auncaught-exception\n[search-mapping-commons-org-label-uncaught-exception]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Auncaught-exception\n[search-sssom-repo-label-git]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Agit\n[search-mapping-commons-org-label-git]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Agit\n[search-sssom-repo-label-blocked]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Ablocked\n[search-mapping-commons-org-label-blocked]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Ablocked\n[search-sssom-repo-label-duplicate]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Aduplicate\n[search-mapping-commons-org-label-duplicate]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Aduplicate\n[search-sssom-repo-label-wontfix]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Awontfix\n[search-mapping-commons-org-label-wontfix]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Awontfix\n[search-sssom-repo-label-invalid]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Ainvalid\n[search-mapping-commons-org-label-invalid]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Ainvalid\n[search-sssom-repo-label-package-idea]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Apackage-idea\n[search-mapping-commons-org-label-package-idea]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Apackage-idea\n[search-sssom-repo-label-wrong-repo]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Awrong-repo\n[search-mapping-commons-org-label-wrong-repo]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Awrong-repo\n[search-sssom-repo-label-editor-rendering]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Aeditor-rendering\n[search-mapping-commons-org-label-editor-rendering]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Aeditor-rendering\n[search-sssom-repo-label-build-error]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Abuild-error\n[search-mapping-commons-org-label-build-error]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Abuild-error\n[search-sssom-repo-label-error-from-pathwatcher]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Aerror-from-pathwatcher\n[search-mapping-commons-org-label-error-from-pathwatcher]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Aerror-from-pathwatcher\n[search-sssom-repo-label-error-from-save]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Aerror-from-save\n[search-mapping-commons-org-label-error-from-save]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Aerror-from-save\n[search-sssom-repo-label-error-from-open]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Aerror-from-open\n[search-mapping-commons-org-label-error-from-open]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Aerror-from-open\n[search-sssom-repo-label-installer]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Ainstaller\n[search-mapping-commons-org-label-installer]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Ainstaller\n[search-sssom-repo-label-auto-updater]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Aauto-updater\n[search-mapping-commons-org-label-auto-updater]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Aauto-updater\n[search-sssom-repo-label-deprecation-help]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+repo%3Amapping-commons%2Fsssom+label%3Adeprecation-help\n[search-mapping-commons-org-label-deprecation-help]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Adeprecation-help\n[search-sssom-repo-label-electron]:\n  https://github.com/search?q=is%3Aissue+repo%3Amapping-commons%2Fsssom+is%3Aopen+label%3Aelectron\n[search-mapping-commons-org-label-electron]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+user%3Amapping-commons+label%3Aelectron\n[search-sssom-repo-label-work-in-progress]:\n  https://github.com/search?q=is%3Aopen+is%3Apr+repo%3Amapping-commons%2Fsssom+label%3Awork-in-progress\n[search-mapping-commons-org-label-work-in-progress]:\n  https://github.com/search?q=is%3Aopen+is%3Apr+user%3Amapping-commons+label%3Awork-in-progress\n[search-sssom-repo-label-needs-review]:\n  https://github.com/search?q=is%3Aopen+is%3Apr+repo%3Amapping-commons%2Fsssom+label%3Aneeds-review\n[search-mapping-commons-org-label-needs-review]:\n  https://github.com/search?q=is%3Aopen+is%3Apr+user%3Amapping-commons+label%3Aneeds-review\n[search-sssom-repo-label-under-review]:\n  https://github.com/search?q=is%3Aopen+is%3Apr+repo%3Amapping-commons%2Fsssom+label%3Aunder-review\n[search-mapping-commons-org-label-under-review]:\n  https://github.com/search?q=is%3Aopen+is%3Apr+user%3Amapping-commons+label%3Aunder-review\n[search-sssom-repo-label-requires-changes]:\n  https://github.com/search?q=is%3Aopen+is%3Apr+repo%3Amapping-commons%2Fsssom+label%3Arequires-changes\n[search-mapping-commons-org-label-requires-changes]:\n  https://github.com/search?q=is%3Aopen+is%3Apr+user%3Amapping-commons+label%3Arequires-changes\n[search-sssom-repo-label-needs-testing]:\n  https://github.com/search?q=is%3Aopen+is%3Apr+repo%3Amapping-commons%2Fsssom+label%3Aneeds-testing\n[search-mapping-commons-org-label-needs-testing]:\n  https://github.com/search?q=is%3Aopen+is%3Apr+user%3Amapping-commons+label%3Aneeds-testing\n[beginner]:\n  https://github.com/search?utf8=%E2%9C%93&q=is%3Aopen+is%3Aissue+label%3Abeginner+label%3Ahelp-wanted+user%3Amapping-commons+sort%3Acomments-desc\n[help-wanted]:\n  https://github.com/search?q=is%3Aopen+is%3Aissue+label%3Ahelp-wanted+user%3Amapping-commons+sort%3Acomments-desc+-label%3Abeginner\n[contributing-to-official-sssom-packages]:\n  https://flight-manual.sssom.io/hacking-sssom/sections/contributing-to-official-sssom-packages/\n[hacking-on-sssom-core]:\n  https://flight-manual.sssom.io/hacking-sssom/sections/hacking-on-sssom-core/\n"
  },
  {
    "path": "LICENSE",
    "content": "BSD 3-Clause License\n\nCopyright (c) 2022, Nico Matentzoglu\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its\n   contributors may be used to endorse or promote products derived from\n   this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
  },
  {
    "path": "Makefile",
    "content": "MAKEFLAGS += --warn-undefined-variables\nSHELL := bash\n.SHELLFLAGS := -eu -o pipefail -c\n.DEFAULT_GOAL := help\n.DELETE_ON_ERROR:\n.SUFFIXES:\n.SECONDARY:\n\nRUN = uv run\n# get values from about.yaml file\nSCHEMA_NAME = sssom_schema\nSOURCE_SCHEMA_PATH = src/sssom_schema/schema/sssom_schema.yaml\nSRC = src\nDEST = project\nPYMODEL = $(SRC)/$(SCHEMA_NAME)/datamodel\nDOCDIR = docs\nTEMPLATE_DIR = $(SRC)/doc-templates\n\n# basename of a YAML file in model/\n.PHONY: all clean\n\nhelp: status\n\t@echo \"\"\n\t@echo \"make all -- makes site locally\"\n\t@echo \"make install -- install dependencies\"\n\t@echo \"make setup -- initial setup\"\n\t@echo \"make test -- runs tests\"\n\t@echo \"make testdoc -- builds docs and runs local test server\"\n\t@echo \"make deploy -- deploys site\"\n\t@echo \"make update -- updates linkml version\"\n\t@echo \"make help -- show this help\"\n\t@echo \"\"\n\nstatus: check-config\n\t@echo \"Project: $(SCHEMA_NAME)\"\n\t@echo \"Source: $(SOURCE_SCHEMA_PATH)\"\n\nsetup: install gen-project gendoc git-init-add\n\ninstall:\n\tuv sync\n.PHONY: install\n\nall: gen-project gendoc gen-excel get-context\n%.yaml: gen-project\ndeploy: all mkd-gh-deploy\n\n# generates all project files\ngen-project: $(PYMODEL)\n\t$(RUN) gen-project \\\n\t\t--exclude owl \\\n\t\t-d $(DEST) $(SOURCE_SCHEMA_PATH) && mv $(DEST)/*.py $(PYMODEL)\n\ntest: validate-schema\n\t$(RUN) gen-project \\\n\t\t--exclude owl \\\n\t\t-d tmp $(SOURCE_SCHEMA_PATH) \n\t$(RUN) pytest\n\nvalidate-schema: $(SOURCE_SCHEMA_PATH)\n\t$(RUN) linkml lint --validate --validate-only $<\n\ncheck-config:\n\t@(grep my-datamodel about.yaml > /dev/null && printf \"\\n**Project not configured**:\\n\\n  - Remember to edit 'about.yaml'\\n\\n\" || exit 0)\n\nconvert-examples-to-%:\n\t$(patsubst %, $(RUN) linkml-convert  % -s $(SOURCE_SCHEMA_PATH) -C Person, $(shell find src/data/examples -name \"*.yaml\")) \n\nget-context:\n\tmkdir -p $(SRC)/$(SCHEMA_NAME)/context\n\tcp $(DEST)/jsonld/* $(SRC)/$(SCHEMA_NAME)/context\n\nexamples/%.yaml: src/data/examples/%.yaml\n\t$(RUN) linkml-convert -s $(SOURCE_SCHEMA_PATH) -C Person $< -o $@\nexamples/%.json: src/data/examples/%.yaml\n\t$(RUN) linkml-convert -s $(SOURCE_SCHEMA_PATH) -C Person $< -o $@\nexamples/%.ttl: src/data/examples/%.yaml\n\t$(RUN) linkml-convert -P EXAMPLE=http://example.org/ -s $(SOURCE_SCHEMA_PATH) -C Person $< -o $@\n\nupgrade:\n\tuv add linkml --upgrade-package linkml\n\n# Test documentation locally\nserve: mkd-serve\n\n# Python datamodel\n$(PYMODEL):\n\tmkdir -p $@\n\n\n$(DOCDIR):\n\tmkdir -p $@\n\ngendoc: $(DOCDIR)\n\tcp -rf $(SRC)/docs/* $(DOCDIR) ; \\\n\t$(RUN) jinjanate $(SRC)/doc-templates/frontpage.md.jinja2 $(SOURCE_SCHEMA_PATH) -o $(DOCDIR)/index.md\n\t$(RUN) gen-doc -d $(DOCDIR) $(SOURCE_SCHEMA_PATH) --template-directory $(TEMPLATE_DIR) --index-name linkml-index\n\ntestdoc: gendoc serve\n\nMKDOCS = $(RUN) --all-groups mkdocs\nmkd-%:\n\t$(MKDOCS) $*\n\ndeploy-doc:\n\t$(RUN) mike deploy --push dev\n\nPROJECT_FOLDERS = sqlschema shex shacl protobuf prefixmap owl jsonschema jsonld graphql excel\ngit-init-add: git-init git-add git-commit git-status\ngit-init:\n\tgit init\ngit-add:\n\tgit add .gitignore .github Makefile LICENSE *.md examples utils about.yaml mkdocs.yml uv.lock project.Makefile pyproject.toml src/linkml/*yaml src/*/datamodel/*py src/data\n\tgit add $(patsubst %, project/%, $(PROJECT_FOLDERS))\ngit-commit:\n\tgit commit -m 'Initial commit' -a\ngit-status:\n\tgit status\n\nclean:\n\trm -rf $(DEST)\n\trm -rf tmp\n\nyaml-lint-all:\n\tnpx --yes prettier --check --prose-wrap always --write \"**/*.yaml\"\n\tnpx --yes prettier --check --prose-wrap always --write \"**/*.yml\"\n\ninclude project.Makefile\n"
  },
  {
    "path": "README.md",
    "content": "<!--[![DOI](https://zenodo.org/badge/13996/mapping-commons/sssom.svg)](https://zenodo.org/badge/latestdoi/13996/mapping-commons/sssom)-->\n\n# A Simple Standard for Sharing Ontological Mappings (SSSOM)\n\n<img src=\"src/docs/images/sssom-banner.png\" />\n\n\nSSSOM is a Simple Standard for Sharing Ontological Mappings, providing \n\n1. a TSV-based representation for ontology term mappings\n1. a comprehensive set of standard metadata elements to describe mappings and \n1. a standard translation between the TSV and the Web Ontology Language (OWL). \n\nThe SSSOM TSV format in particular is geared towards the needs of the wider bioinformatics community as a way to safely exchange mappings in an easily readable yet semantically well-specified manner. Consider this example of a simple mapping file:\n\n| subject_id\t| predicate_id\t| object_id\t| mapping_justification | subject_label\t| object_label |\n| --- | --- | --- | --- | --- | --- |\n| HP:0009124\t| skos:exactMatch\t| MP:0000003\t| semapv:LexicalMatching\t| Abnormal adipose tissue morphology\t| abnormal adipose tissue morphology |\n| HP:0008551\t| skos:exactMatch\t| MP:0000018\t| semapv:LexicalMatching\t| Microtia\t| small ears |\n| HP:0000411\t| skos:exactMatch\t| MP:0000021\t| semapv:LexicalMatching\t| Protruding ear\t| prominent ears |\n\nSSSOM specifies all its metadata elements:\n\n- subject_id\n- predicate_id\n- object_id\n- mapping_justification (*NOTE: Since June 2022* `match_type` is being replaced by `mapping_justification` see [here](https://github.com/mapping-commons/sssom/issues/150))\n- subject_label\n- object_label\n\nincluding clear definitions, examples of use and controlled vocabulary where necessary, along with 30 other optional metadata elements to provide additional provenance.\n\nSSSOM further provides a standard way to \n- augment the TSV file with mapping set - level metadata, such as creator_id, mapping_date or license and\n- translate a SSSOM compliant TSV files into _OWL reified axioms_. This will allow the easy loading, and merging of SSSOM mapping tables into existing ontologies using standard tools such as ROBOT (under development).\n\nNote that SSSOM is currently under development and subject to change. Please leave us a comment on the [issue tracker](https://github.com/OBOFoundry/SSSOM/issues) if you want to be involved. The full specification can be found [here](https://w3id.org/sssom/spec).\n\n## Citation\n\nIf you have found SSSOM to be helpful in your work, please consider citing:\n\nNicolas Matentzoglu, James P Balhoff, Susan M Bello, Chris Bizon, Matthew Brush, Tiffany J Callahan, Christopher G Chute, William D Duncan, Chris T Evelo, Davera Gabriel, John Graybeal, Alasdair Gray, Benjamin M Gyori, Melissa Haendel, Henriette Harmse, Nomi L Harris, Ian Harrow, Harshad B Hegde, Amelia L Hoyt, Charles T Hoyt, Dazhi Jiao, Ernesto Jiménez-Ruiz, Simon Jupp, Hyeongsik Kim, Sebastian Koehler, Thomas Liener, Qinqin Long, James Malone, James A McLaughlin, Julie A McMurry, Sierra Moxon, Monica C Munoz-Torres, David Osumi-Sutherland, James A Overton, Bjoern Peters, Tim Putman, Núria Queralt-Rosinach, Kent Shefchek, Harold Solbrig, Anne Thessen, Tania Tudorache, Nicole Vasilevsky, Alex H Wagner, Christopher J Mungall, A Simple Standard for Sharing Ontological Mappings (SSSOM), Database, Volume 2022, 2022, baac035, https://doi.org/10.1093/database/baac035\n\n```bibtex\n@article{10.1093/database/baac035,\n    author = {Matentzoglu, Nicolas and Balhoff, James P and Bello, Susan M and Bizon, Chris and Brush, Matthew and Callahan, Tiffany J and Chute, Christopher G and Duncan, William D and Evelo, Chris T and Gabriel, Davera and Graybeal, John and Gray, Alasdair and Gyori, Benjamin M and Haendel, Melissa and Harmse, Henriette and Harris, Nomi L and Harrow, Ian and Hegde, Harshad B and Hoyt, Amelia L and Hoyt, Charles T and Jiao, Dazhi and Jiménez-Ruiz, Ernesto and Jupp, Simon and Kim, Hyeongsik and Koehler, Sebastian and Liener, Thomas and Long, Qinqin and Malone, James and McLaughlin, James A and McMurry, Julie A and Moxon, Sierra and Munoz-Torres, Monica C and Osumi-Sutherland, David and Overton, James A and Peters, Bjoern and Putman, Tim and Queralt-Rosinach, Núria and Shefchek, Kent and Solbrig, Harold and Thessen, Anne and Tudorache, Tania and Vasilevsky, Nicole and Wagner, Alex H and Mungall, Christopher J},\n    title = \"{A Simple Standard for Sharing Ontological Mappings (SSSOM)}\",\n    journal = {Database},\n    volume = {2022},\n    year = {2022},\n    month = {05},\n    abstract = \"{Despite progress in the development of standards for describing and exchanging scientific information, the lack of easy-to-use standards for mapping between different representations of the same or similar objects in different databases poses a major impediment to data integration and interoperability. Mappings often lack the metadata needed to be correctly interpreted and applied. For example, are two terms equivalent or merely related? Are they narrow or broad matches? Or are they associated in some other way? Such relationships between the mapped terms are often not documented, which leads to incorrect assumptions and makes them hard to use in scenarios that require a high degree of precision (such as diagnostics or risk prediction). Furthermore, the lack of descriptions of how mappings were done makes it hard to combine and reconcile mappings, particularly curated and automated ones. We have developed the Simple Standard for Sharing Ontological Mappings (SSSOM) which addresses these problems by: (i) Introducing a machine-readable and extensible vocabulary to describe metadata that makes imprecision, inaccuracy and incompleteness in mappings explicit. (ii) Defining an easy-to-use simple table-based format that can be integrated into existing data science pipelines without the need to parse or query ontologies, and that integrates seamlessly with Linked Data principles. (iii) Implementing open and community-driven collaborative workflows that are designed to evolve the standard continuously to address changing requirements and mapping practices. (iv) Providing reference tools and software libraries for working with the standard. In this paper, we present the SSSOM standard, describe several use cases in detail and survey some of the existing work on standardizing the exchange of mappings, with the goal of making mappings Findable, Accessible, Interoperable and Reusable (FAIR). The SSSOM specification can be found at http://w3id.org/sssom/spec.Database URL: http://w3id.org/sssom/spec}\",\n    issn = {1758-0463},\n    doi = {10.1093/database/baac035},\n    url = {https://doi.org/10.1093/database/baac035},\n    note = {baac035},\n    eprint = {https://academic.oup.com/database/article-pdf/doi/10.1093/database/baac035/43832024/baac035.pdf},\n}\n```\n\nA [second report with updates since the primary SSSOM publication](https://ceur-ws.org/Vol-3324/om2022_LTpaper6.pdf) above was published as part of the proceedings of the Ontology Matching Workshop 2022.\n\n## Copying\n\nSSSOM is distributed under the terms of the 3-clause BSD license, as included in the [LICENSE](LICENSE) file of the source distribution.\n\nBy exception, the following files are _not_ covered by the 3-clause BSD license:\n\n* [sssom-banner.png](src/docs/images/sssom-banner.png): That file may only be used by members of the internal Monarch team and collaborators on Monarch flagship products.\n\n"
  },
  {
    "path": "SSSOM.md",
    "content": "This page has moved here:\n\nhttps://mapping-commons.github.io/sssom/spec/"
  },
  {
    "path": "about.yaml",
    "content": "name: sssom_schema\ndescription: A Simple Standard for Sharing Ontology Mappings (SSSOM)\nsource_schema_path: src/sssom_schema/schema/sssom_schema.yaml\n"
  },
  {
    "path": "examples/README.md",
    "content": "# Examples of use of sssom\n\nThis folder contains example data conforming to sssom\n\nThe source for these is in [src/data](../src/data/examples)"
  },
  {
    "path": "examples/embedded/foodie-inc-2022-05-01.sssom.tsv",
    "content": "# comment: We could map to FOODON:00004187 instead which more specifically refers to\n#   'raw' Pink apples. Decided against to be consistent with other mapping choices.\n# curie_map:\n#   FOODON: http://purl.obolibrary.org/obo/FOODON_\n#   KF_FOOD: https://kewl-foodie.inc/food/\n#   orcid: https://orcid.org/\n#   owl: http://www.w3.org/2002/07/owl#\n#   rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns#\n#   rdfs: http://www.w3.org/2000/01/rdf-schema#\n#   semapv: https://w3id.org/semapv/vocab/\n#   skos: http://www.w3.org/2004/02/skos/core#\n#   sssom: https://w3id.org/sssom/\n#   wikidata: https://www.wikidata.org/wiki/\n# license: https://creativecommons.org/licenses/by/4.0/\n# mapping_date: '2022-05-02'\n# mapping_set_description: Manually curated alignment of KEWL FOODIE INC internal food\n#   and nutrition database with Food Ontology (FOODON). Intended to be used for ontological\n#   analysis and grouping of KEWL FOODIE INC related data.\n# mapping_set_id: https://w3id.org/sssom/tutorial/example1.sssom.tsv\n# mapping_set_version: '2022-05-01'\n# object_source: wikidata:Q55118395\n# object_source_version: http://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl\n# subject_source: KF_FOOD:DB\nsubject_id\tsubject_label\tpredicate_id\tobject_id\tobject_label\tmapping_justification\tauthor_id\tobject_source_version\tmapping_date\tconfidence\tcomment\nKF_FOOD:F001\tapple\tskos:exactMatch\tFOODON:00002473\tapple (whole)\tsemapv:ManualMappingCuration\torcid:0000-0002-7356-1779\thttp://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl\t2022-05-02\t0.95\t\"We could map to FOODON:03310788 instead to cover sliced apples, but only \"\"whole\"\" apple types exist.\"\nKF_FOOD:F002\tgala\tskos:exactMatch\tFOODON:00003348\tGala apple (whole)\tsemapv:ManualMappingCuration\torcid:0000-0002-7356-1779\thttp://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl\t2022-05-02\t1.0\t\nKF_FOOD:F003\tpink\tskos:exactMatch\tFOODON:00004187\tPink apple (whole, raw)\tsemapv:ManualMappingCuration\torcid:0000-0002-7356-1779\thttp://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl\t2022-05-02\t0.9\t\"We could map to FOODON:00004187 instead which more specifically refers to \"\"raw\"\" Pink apples. Decided against to be consistent with other mapping choices.\"\nKF_FOOD:F004\tbraeburn\tskos:exactMatch\tsssom:NoMapping\t\tsemapv:ManualMappingCuration\torcid:0000-0002-7356-1779\thttp://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl\t2022-05-02\t1.0\t\nKF_FOOD:F004\tbraeburn\tskos:broadMatch\tFOODON:00002473\tapple (whole)\tsemapv:ManualMappingCuration\torcid:0000-0002-7356-1779\thttp://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl\t2022-05-02\t1.0\t\n\n"
  },
  {
    "path": "examples/embedded/mp-hp-exact-0.0.1.sssom.tsv",
    "content": "# curie_map:\n#   HP: http://purl.obolibrary.org/obo/HP_\n#   MP: http://purl.obolibrary.org/obo/MP_\n#   owl: http://www.w3.org/2002/07/owl#\n#   rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns#\n#   rdfs: http://www.w3.org/2000/01/rdf-schema#\n#   semapv: https://w3id.org/semapv/vocab/\n#   skos: http://www.w3.org/2004/02/skos/core#\n#   sssom: https://w3id.org/sssom/\n# license: https://creativecommons.org/publicdomain/zero/1.0/\n# mapping_provider: http://purl.obolibrary.org/obo/upheno.owl\n# mapping_set_id: https://w3id.org/sssom/mappings/27f85fe9-8a72-4e76-909b-7ba4244d9ede\nsubject_id\tsubject_label\tpredicate_id\tobject_id\tobject_label\tmapping_justification\nHP:0000175\tCleft palate\tskos:exactMatch\tMP:0000111\tcleft palate\tsemapv:LexicalMatching\nHP:0000252\tMicrocephaly\tskos:exactMatch\tMP:0000433\tmicrocephaly\tsemapv:LexicalMatching\nHP:0000260\tWide anterior fontanel\tskos:exactMatch\tMP:0000085\tlarge anterior fontanelle\tsemapv:LexicalMatching\nHP:0000375\tAbnormal cochlea morphology\tskos:exactMatch\tMP:0000031\tabnormal cochlea morphology\tsemapv:LexicalMatching\nHP:0000411\tProtruding ear\tskos:exactMatch\tMP:0000021\tprominent ears\tsemapv:LexicalMatching\nHP:0000822\tHypertension\tskos:exactMatch\tMP:0000231\thypertension\tsemapv:LexicalMatching\nHP:0001336\tMyoclonus\tskos:exactMatch\tMP:0000243\tmyoclonus\tsemapv:LexicalMatching\nHP:0001363\tCraniosynostosis\tskos:exactMatch\tMP:0000081\tpremature cranial suture closure\tsemapv:LexicalMatching\nHP:0001596\tAlopecia\tskos:exactMatch\tMP:0000414\talopecia\tsemapv:LexicalMatching\nHP:0001627\tAbnormal heart morphology\tskos:exactMatch\tMP:0000266\tabnormal heart morphology\tsemapv:LexicalMatching\nHP:0001633\tAbnormal mitral valve morphology\tskos:exactMatch\tMP:0000286\tabnormal mitral valve morphology\tsemapv:LexicalMatching\nHP:0001667\tRight ventricular hypertrophy\tskos:exactMatch\tMP:0000276\theart right ventricle hypertrophy\tsemapv:LexicalMatching\nHP:0001679\tAbnormal aortic morphology\tskos:exactMatch\tMP:0000272\tabnormal aorta morphology\tsemapv:LexicalMatching\nHP:0001719\tDouble outlet right ventricle\tskos:exactMatch\tMP:0000284\tdouble outlet right ventricle\tsemapv:LexicalMatching\nHP:0001882\tLeukopenia\tskos:exactMatch\tMP:0000221\tdecreased leukocyte cell number\tsemapv:LexicalMatching\nHP:0001913\tGranulocytopenia\tskos:exactMatch\tMP:0000334\tdecreased granulocyte number\tsemapv:LexicalMatching\nHP:0001974\tLeukocytosis\tskos:exactMatch\tMP:0000218\tincreased leukocyte cell number\tsemapv:LexicalMatching\nHP:0001978\tExtramedullary hematopoiesis\tskos:exactMatch\tMP:0000240\textramedullary hematopoiesis\tsemapv:LexicalMatching\nHP:0001981\tSchistocytosis\tskos:exactMatch\tMP:0000314\tschistocytosis\tsemapv:LexicalMatching\nHP:0002212\tCurly hair\tskos:exactMatch\tMP:0000410\twaved hair\tsemapv:LexicalMatching\nHP:0002659\tIncreased susceptibility to fractures\tskos:exactMatch\tMP:0000061\tfragile skeleton\tsemapv:LexicalMatching\nHP:0002763\tAbnormal cartilage morphology\tskos:exactMatch\tMP:0000163\tabnormal cartilage morphology\tsemapv:LexicalMatching\nHP:0003307\tHyperlordosis\tskos:exactMatch\tMP:0000162\tlordosis\tsemapv:LexicalMatching\nHP:0004349\tReduced bone mineral density\tskos:exactMatch\tMP:0000063\tdecreased bone mineral density\tsemapv:LexicalMatching\nHP:0006288\tAdvanced eruption of teeth\tskos:exactMatch\tMP:0000122\tpremature tooth eruption\tsemapv:LexicalMatching\nHP:0008551\tMicrotia\tskos:exactMatch\tMP:0000018\tsmall ears\tsemapv:LexicalMatching\nHP:0009124\tAbnormal adipose tissue morphology\tskos:exactMatch\tMP:0000003\tabnormal adipose tissue morphology\tsemapv:LexicalMatching\nHP:0009910\tAplasia of the middle ear ossicles\tskos:exactMatch\tMP:0000040\tabsent middle ear ossicles\tsemapv:LexicalMatching\nHP:0009939\tMandibular aplasia\tskos:exactMatch\tMP:0000087\tabsent mandible\tsemapv:LexicalMatching\nHP:0011002\tOsteopetrosis\tskos:exactMatch\tMP:0000067\tosteopetrosis\tsemapv:LexicalMatching\nHP:0011457\tLoss of eyelashes\tskos:exactMatch\tMP:0000425\tloss of eyelid cilia\tsemapv:LexicalMatching\nHP:0011897\tNeutrophilia\tskos:exactMatch\tMP:0000219\tincreased neutrophil cell number\tsemapv:LexicalMatching\nHP:0012234\tAgranulocytosis\tskos:exactMatch\tMP:0000334\tdecreased granulocyte number\tsemapv:LexicalMatching\nHP:0012543\tHemosiderinuria\tskos:exactMatch\tMP:0000327\themosiderinuria\tsemapv:LexicalMatching\nHP:0025065\tAbnormal mean corpuscular volume\tskos:exactMatch\tMP:0000226\tabnormal mean corpuscular volume\tsemapv:LexicalMatching\nHP:0025084\tFolliculitis\tskos:exactMatch\tMP:0000376\tfolliculitis\tsemapv:LexicalMatching\nHP:0031377\tAbnormal cell proliferation\tskos:exactMatch\tMP:0000350\tabnormal cell proliferation\tsemapv:LexicalMatching\nHP:0031851\tReduced hematocrit\tskos:exactMatch\tMP:0000208\tdecreased hematocrit\tsemapv:LexicalMatching\nHP:0032310\tGranulocytosis\tskos:exactMatch\tMP:0000322\tincreased granulocyte number\tsemapv:LexicalMatching\nHP:0100629\tMidline facial cleft\tskos:exactMatch\tMP:0000108\tmidline facial cleft\tsemapv:LexicalMatching\nHP:0100671\tAbnormal trabecular bone morphology\tskos:exactMatch\tMP:0000130\tabnormal trabecular bone morphology\tsemapv:LexicalMatching\nHP:0400001\tChin with vertical crease\tskos:exactMatch\tMP:0000114\tcleft chin\tsemapv:LexicalMatching\n\n"
  },
  {
    "path": "examples/external/example1.sssom.tsv",
    "content": "subject_id\tsubject_label\tpredicate_id\tobject_id\tobject_label\tmapping_justification\tauthor_id\tobject_source_version\tmapping_date\tconfidence\tcomment\r\nKF_FOOD:F001\tapple\tskos:exactMatch\tFOODON:00002473\tapple (whole)\tsemapv:ManualMappingCuration\torcid:0000-0002-7356-1779\thttp://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl\t2022-05-02\t0.95\t\"We could map to FOODON:03310788 instead to cover sliced apples, but only \"\"whole\"\" apple types exist.\"\r\nKF_FOOD:F002\tgala\tskos:exactMatch\tFOODON:00003348\tGala apple (whole)\tsemapv:ManualMappingCuration\torcid:0000-0002-7356-1779\thttp://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl\t2022-05-02\t1.0\t\r\nKF_FOOD:F003\tpink\tskos:exactMatch\tFOODON:00004187\tPink apple (whole, raw)\tsemapv:ManualMappingCuration\torcid:0000-0002-7356-1779\thttp://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl\t2022-05-02\t0.9\t\"We could map to FOODON:00004187 instead which more specifically refers to \"\"raw\"\" Pink apples. Decided against to be consistent with other mapping choices.\"\r\nKF_FOOD:F004\tbraeburn\tskos:exactMatch\tsssom:NoMapping\t\tsemapv:ManualMappingCuration\torcid:0000-0002-7356-1779\thttp://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl\t2022-05-02\t1.0\t\r\nKF_FOOD:F004\tbraeburn\tskos:broadMatch\tFOODON:00002473\tapple (whole)\tsemapv:ManualMappingCuration\torcid:0000-0002-7356-1779\thttp://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl\t2022-05-02\t1.0\t\r\n"
  },
  {
    "path": "examples/external/example1.sssom.yml",
    "content": "comment:\n  We could map to FOODON:00004187 instead which more specifically refers to\n  'raw' Pink apples. Decided against to be consistent with other mapping\n  choices.\ncurie_map:\n  FOODON: http://purl.obolibrary.org/obo/FOODON_\n  KF_FOOD: https://kewl-foodie.inc/food/\n  orcid: https://orcid.org/\n  owl: http://www.w3.org/2002/07/owl#\n  rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns#\n  rdfs: http://www.w3.org/2000/01/rdf-schema#\n  semapv: https://w3id.org/semapv/vocab/\n  skos: http://www.w3.org/2004/02/skos/core#\n  sssom: https://w3id.org/sssom/\n  wikidata: https://www.wikidata.org/wiki/\nlicense: https://creativecommons.org/licenses/by/4.0/\nmapping_date: \"2022-05-02\"\nmapping_set_description:\n  Manually curated alignment of KEWL FOODIE INC internal food and nutrition\n  database with Food Ontology (FOODON). Intended to be used for ontological\n  analysis and grouping of KEWL FOODIE INC related data.\nmapping_set_id: https://w3id.org/sssom/tutorial/example1.sssom.tsv\nmapping_set_version: \"2022-05-01\"\nobject_source: wikidata:Q55118395\nobject_source_version: http://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl\nsubject_source: KF_FOOD:DB\n"
  },
  {
    "path": "examples/external/mp-hp-exact-0.0.1.sssom.tsv",
    "content": "subject_id\tsubject_label\tpredicate_id\tobject_id\tobject_label\tmapping_justification\r\nHP:0000175\tCleft palate\tskos:exactMatch\tMP:0000111\tcleft palate\tsemapv:LexicalMatching\r\nHP:0000252\tMicrocephaly\tskos:exactMatch\tMP:0000433\tmicrocephaly\tsemapv:LexicalMatching\r\nHP:0000260\tWide anterior fontanel\tskos:exactMatch\tMP:0000085\tlarge anterior fontanelle\tsemapv:LexicalMatching\r\nHP:0000375\tAbnormal cochlea morphology\tskos:exactMatch\tMP:0000031\tabnormal cochlea morphology\tsemapv:LexicalMatching\r\nHP:0000411\tProtruding ear\tskos:exactMatch\tMP:0000021\tprominent ears\tsemapv:LexicalMatching\r\nHP:0000822\tHypertension\tskos:exactMatch\tMP:0000231\thypertension\tsemapv:LexicalMatching\r\nHP:0001336\tMyoclonus\tskos:exactMatch\tMP:0000243\tmyoclonus\tsemapv:LexicalMatching\r\nHP:0001363\tCraniosynostosis\tskos:exactMatch\tMP:0000081\tpremature cranial suture closure\tsemapv:LexicalMatching\r\nHP:0001596\tAlopecia\tskos:exactMatch\tMP:0000414\talopecia\tsemapv:LexicalMatching\r\nHP:0001627\tAbnormal heart morphology\tskos:exactMatch\tMP:0000266\tabnormal heart morphology\tsemapv:LexicalMatching\r\nHP:0001633\tAbnormal mitral valve morphology\tskos:exactMatch\tMP:0000286\tabnormal mitral valve morphology\tsemapv:LexicalMatching\r\nHP:0001667\tRight ventricular hypertrophy\tskos:exactMatch\tMP:0000276\theart right ventricle hypertrophy\tsemapv:LexicalMatching\r\nHP:0001679\tAbnormal aortic morphology\tskos:exactMatch\tMP:0000272\tabnormal aorta morphology\tsemapv:LexicalMatching\r\nHP:0001719\tDouble outlet right ventricle\tskos:exactMatch\tMP:0000284\tdouble outlet right ventricle\tsemapv:LexicalMatching\r\nHP:0001882\tLeukopenia\tskos:exactMatch\tMP:0000221\tdecreased leukocyte cell number\tsemapv:LexicalMatching\r\nHP:0001913\tGranulocytopenia\tskos:exactMatch\tMP:0000334\tdecreased granulocyte number\tsemapv:LexicalMatching\r\nHP:0001974\tLeukocytosis\tskos:exactMatch\tMP:0000218\tincreased leukocyte cell number\tsemapv:LexicalMatching\r\nHP:0001978\tExtramedullary hematopoiesis\tskos:exactMatch\tMP:0000240\textramedullary hematopoiesis\tsemapv:LexicalMatching\r\nHP:0001981\tSchistocytosis\tskos:exactMatch\tMP:0000314\tschistocytosis\tsemapv:LexicalMatching\r\nHP:0002212\tCurly hair\tskos:exactMatch\tMP:0000410\twaved hair\tsemapv:LexicalMatching\r\nHP:0002659\tIncreased susceptibility to fractures\tskos:exactMatch\tMP:0000061\tfragile skeleton\tsemapv:LexicalMatching\r\nHP:0002763\tAbnormal cartilage morphology\tskos:exactMatch\tMP:0000163\tabnormal cartilage morphology\tsemapv:LexicalMatching\r\nHP:0003307\tHyperlordosis\tskos:exactMatch\tMP:0000162\tlordosis\tsemapv:LexicalMatching\r\nHP:0004349\tReduced bone mineral density\tskos:exactMatch\tMP:0000063\tdecreased bone mineral density\tsemapv:LexicalMatching\r\nHP:0006288\tAdvanced eruption of teeth\tskos:exactMatch\tMP:0000122\tpremature tooth eruption\tsemapv:LexicalMatching\r\nHP:0008551\tMicrotia\tskos:exactMatch\tMP:0000018\tsmall ears\tsemapv:LexicalMatching\r\nHP:0009124\tAbnormal adipose tissue morphology\tskos:exactMatch\tMP:0000003\tabnormal adipose tissue morphology\tsemapv:LexicalMatching\r\nHP:0009910\tAplasia of the middle ear ossicles\tskos:exactMatch\tMP:0000040\tabsent middle ear ossicles\tsemapv:LexicalMatching\r\nHP:0009939\tMandibular aplasia\tskos:exactMatch\tMP:0000087\tabsent mandible\tsemapv:LexicalMatching\r\nHP:0011002\tOsteopetrosis\tskos:exactMatch\tMP:0000067\tosteopetrosis\tsemapv:LexicalMatching\r\nHP:0011457\tLoss of eyelashes\tskos:exactMatch\tMP:0000425\tloss of eyelid cilia\tsemapv:LexicalMatching\r\nHP:0011897\tNeutrophilia\tskos:exactMatch\tMP:0000219\tincreased neutrophil cell number\tsemapv:LexicalMatching\r\nHP:0012234\tAgranulocytosis\tskos:exactMatch\tMP:0000334\tdecreased granulocyte number\tsemapv:LexicalMatching\r\nHP:0012543\tHemosiderinuria\tskos:exactMatch\tMP:0000327\themosiderinuria\tsemapv:LexicalMatching\r\nHP:0025065\tAbnormal mean corpuscular volume\tskos:exactMatch\tMP:0000226\tabnormal mean corpuscular volume\tsemapv:LexicalMatching\r\nHP:0025084\tFolliculitis\tskos:exactMatch\tMP:0000376\tfolliculitis\tsemapv:LexicalMatching\r\nHP:0031377\tAbnormal cell proliferation\tskos:exactMatch\tMP:0000350\tabnormal cell proliferation\tsemapv:LexicalMatching\r\nHP:0031851\tReduced hematocrit\tskos:exactMatch\tMP:0000208\tdecreased hematocrit\tsemapv:LexicalMatching\r\nHP:0032310\tGranulocytosis\tskos:exactMatch\tMP:0000322\tincreased granulocyte number\tsemapv:LexicalMatching\r\nHP:0100629\tMidline facial cleft\tskos:exactMatch\tMP:0000108\tmidline facial cleft\tsemapv:LexicalMatching\r\nHP:0100671\tAbnormal trabecular bone morphology\tskos:exactMatch\tMP:0000130\tabnormal trabecular bone morphology\tsemapv:LexicalMatching\r\nHP:0400001\tChin with vertical crease\tskos:exactMatch\tMP:0000114\tcleft chin\tsemapv:LexicalMatching\r\n"
  },
  {
    "path": "examples/external/mp-hp-exact-0.0.1.sssom.yml",
    "content": "curie_map:\n  HP: http://purl.obolibrary.org/obo/HP_\n  MP: http://purl.obolibrary.org/obo/MP_\n  owl: http://www.w3.org/2002/07/owl#\n  rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns#\n  rdfs: http://www.w3.org/2000/01/rdf-schema#\n  semapv: https://w3id.org/semapv/vocab/\n  skos: http://www.w3.org/2004/02/skos/core#\n  sssom: https://w3id.org/sssom/\nlicense: https://creativecommons.org/publicdomain/zero/1.0/\nmapping_provider: http://purl.obolibrary.org/obo/upheno.owl\nmapping_set_id: https://w3id.org/sssom/mappings/27f85fe9-8a72-4e76-909b-7ba4244d9ede\n"
  },
  {
    "path": "examples/schema/cardinality-scope-empty.sssom.tsv",
    "content": "#curie_map:\n#  COMENT: https://example.com/entities/\n#  NETENT: https://example.net/entities/\n#  ORGENT: https://example.org/entities/\n#  SRC: https://example.org/sources/\n#mapping_set_id: https://example.org/sets/cardinality-scope-empty\n#license: https://creativecommons.org/licenses/by/4.0/\nsubject_id\tsubject_label\tpredicate_id\tobject_id\tobject_label\tmapping_justification\tobject_source\tmapping_cardinality\nORGENT:0001\talice\tskos:closeMatch\tCOMENT:0011\talpha\tsemapv:ManualMappingCuration\tSRC:com\t1:n\nORGENT:0001\talice\tskos:closeMatch\tNETENT:0111\talpha\tsemapv:ManualMappingCuration\tSRC:net\t1:n\nORGENT:0002\tbob\tskos:closeMatch\tCOMENT:0012\tbeta\tsemapv:ManualMappingCuration\tSRC:com\t1:n\nORGENT:0002\tbob\tskos:closeMatch\tNETENT:0112\tbravo\tsemapv:ManualMappingCuration\tSRC:net\t1:n\nORGENT:0007\tgavin\tskos:closeMatch\tNETENT:0117\tgolf\tsemapv:ManualMappingCuration\tSRC:net\t1:n\nORGENT:0007\tgavin\tskos:exactMatch\tCOMENT:0013\tgamma\tsemapv:ManualMappingCuration\tSRC:com\t1:n\n"
  },
  {
    "path": "examples/schema/cardinality-scope-predicate+object_source.sssom.tsv",
    "content": "#curie_map:\n#  COMENT: https://example.com/entities/\n#  NETENT: https://example.net/entities/\n#  ORGENT: https://example.org/entities/\n#  SRC: https://example.org/sources/\n#mapping_set_id: https://example.org/sets/cardinality-scope-predicate+object_source\n#license: https://creativecommons.org/licenses/by/4.0/\n#cardinality_scope:\n#  - predicate_id\n#  - object_source\nsubject_id\tsubject_label\tpredicate_id\tobject_id\tobject_label\tmapping_justification\tobject_source\tmapping_cardinality\nORGENT:0001\talice\tskos:closeMatch\tCOMENT:0011\talpha\tsemapv:ManualMappingCuration\tSRC:com\t1:1\nORGENT:0001\talice\tskos:closeMatch\tNETENT:0111\talpha\tsemapv:ManualMappingCuration\tSRC:net\t1:1\nORGENT:0002\tbob\tskos:closeMatch\tCOMENT:0012\tbeta\tsemapv:ManualMappingCuration\tSRC:com\t1:1\nORGENT:0002\tbob\tskos:closeMatch\tNETENT:0112\tbravo\tsemapv:ManualMappingCuration\tSRC:net\t1:1\nORGENT:0007\tgavin\tskos:closeMatch\tNETENT:0117\tgolf\tsemapv:ManualMappingCuration\tSRC:net\t1:1\nORGENT:0007\tgavin\tskos:exactMatch\tCOMENT:0013\tgamma\tsemapv:ManualMappingCuration\tSRC:com\t1:1\n"
  },
  {
    "path": "examples/schema/cardinality-scope-predicate.sssom.tsv",
    "content": "#curie_map:\n#  COMENT: https://example.com/entities/\n#  NETENT: https://example.net/entities/\n#  ORGENT: https://example.org/entities/\n#  SRC: https://example.org/sources/\n#mapping_set_id: https://example.org/sets/cardinality-scope-predicate\n#license: https://creativecommons.org/licenses/by/4.0/\n#cardinality_scope:\n#  - predicate_id\nsubject_id\tsubject_label\tpredicate_id\tobject_id\tobject_label\tmapping_justification\tobject_source\tmapping_cardinality\nORGENT:0001\talice\tskos:closeMatch\tCOMENT:0011\talpha\tsemapv:ManualMappingCuration\tSRC:com\t1:n\nORGENT:0001\talice\tskos:closeMatch\tNETENT:0111\talpha\tsemapv:ManualMappingCuration\tSRC:net\t1:n\nORGENT:0002\tbob\tskos:closeMatch\tCOMENT:0012\tbeta\tsemapv:ManualMappingCuration\tSRC:com\t1:n\nORGENT:0002\tbob\tskos:closeMatch\tNETENT:0112\tbravo\tsemapv:ManualMappingCuration\tSRC:net\t1:n\nORGENT:0007\tgavin\tskos:closeMatch\tNETENT:0117\tgolf\tsemapv:ManualMappingCuration\tSRC:net\t1:1\nORGENT:0007\tgavin\tskos:exactMatch\tCOMENT:0013\tgamma\tsemapv:ManualMappingCuration\tSRC:com\t1:1\n"
  },
  {
    "path": "examples/schema/cardinality-with-unmapped-entities.sssom.tsv",
    "content": "#curie_map:\n#  OBJ: https://example.org/object/\n#  SRC: https://example.org/sources/\n#  SUBJ: https://example.org/subject/\n#mapping_set_id: https://example.org/sets/cardinality-with-unmapped-entities\n#license: https://creativecommons.org/licenses/by/4.0/\nsubject_id\tpredicate_id\tobject_id\tmapping_justification\tsubject_source\tobject_source\tmapping_cardinality\tcomment\nSUBJ:0001\tskos:exactMatch\tsssom:NoTermFound\tsemapv:ManualMappingCuration\tSRC:A\tSRC:B\t1:0\tS1 in vocabulary A has no exact match in vocabulary B\nSUBJ:0001\tskos:closeMatch\tOBJ:0001\tsemapv:ManualMappingCuration\tSRC:A\tSRC:B\t1:1\tS1 mapped only to O1, O1 mapped only to S1 -- the record involving sssom:NoTermFound does not count, as it is an absence of match rather than an actual mapping\nsssom:NoTermFound\tskos:exactMatch\tOBJ:0002\tsemapv:ManualMappingCuration\tSRC:C\tSRC:D\t0:1\tO2 in vocabulary D has no exact match in vocabulary C\nsssom:NoTermFound\tskos:exactMatch\tsssom:NoTermFound\tsemapv:ManualMappingCuration\tSRC:E\tSRC:F\t0:0\tNo exact match between any term from vocabulary E and any term for vocabulary F (in other words, the two vocabularies are completely disjoint, at least as far as exact matches are considered)\n"
  },
  {
    "path": "examples/schema/cardinality.sssom.tsv",
    "content": "#curie_map:\n#  OBJ: https://example.org/object/\n#  SUBJ: https://example.org/subject/\n#mapping_set_id: https://example.org/sets/cardinality\n#license: https://creativecommons.org/licenses/by/4.0/\nsubject_id\tpredicate_id\tobject_id\tmapping_justification\tmapping_cardinality\tcomment\nSUBJ:0001\tskos:exactMatch\tOBJ:0001\tsemapv:LexicalMatching\t1:1\tS1 and O1 only mapped to each other\nSUBJ:0001\tskos:exactMatch\tOBJ:0001\tsemapv:MappingReview\t1:1\tS1 and O1 only mapped to each other\nSUBJ:0002\tskos:exactMatch\tOBJ:0002\tsemapv:LexicalMatching\t1:n\tS2 mapped to both O2 and O3, O2 mapped only to S2\nSUBJ:0002\tskos:exactMatch\tOBJ:0003\tsemapv:LexicalMatching\t1:n\tS2 mapped to both O2 and O3, O3 mapped only to S2\nSUBJ:0003\tskos:exactMatch\tOBJ:0004\tsemapv:LexicalMatching\tn:1\tS3 and S4 both mapped to only O4\nSUBJ:0004\tskos:exactMatch\tOBJ:0004\tsemapv:LexicalMatching\tn:1\tS3 and S4 both mapped to only O4\nSUBJ:0005\tskos:exactMatch\tOBJ:0005\tsemapv:LexicalMatching\tn:n\tS5 mapped to O5 and O6, O5 mapped to S5 and S6\nSUBJ:0005\tskos:exactMatch\tOBJ:0006\tsemapv:LexicalMatching\t1:n\tS5 mapped to O5 and O6, O6 mapped only to S5\nSUBJ:0006\tskos:exactMatch\tOBJ:0005\tsemapv:LexicalMatching\tn:1\tS6 mapped only to O5, O5 mapped to both S5 and S6\n"
  },
  {
    "path": "examples/schema/composite-entities.sssom.tsv",
    "content": "#curie_map:\n#  HP: http://purl.obolibrary.org/obo/HP_\n#  MONDO: http://purl.obolibrary.org/obo/MONDO_\n#  MP: http://purl.obolibrary.org/obo/MP_\n#  SCHEMA: http://example.org/schema\n#mapping_set_id: https://w3id.org/sssom/commons/examples/composite-entities.sssom.tsv\n#license: https://creativecommons.org/publicdomain/zero/1.0/\n#comment: This is an example file for the SSSOM for illustration only. Its contents are entirely fabricated.\nsubject_id\tpredicate_id\tobject_id\tmapping_justification\tsubject_type\nSCHEMA:0001/(disease:'MONDO:0005148',phenotype:'HP:0009124')\tskos:exactMatch\tMP:0000003\tsemapv:ManualMappingCuration\tcomposed entity expression\nSCHEMA:0001/(disease:'MONDO:0005149',phenotype:'HP:0008551')\tskos:exactMatch\tMP:0000018\tsemapv:ManualMappingCuration\tcomposed entity expression\nSCHEMA:0001/(disease:'MONDO:0005150',phenotype:'HP:0000411')\tskos:exactMatch\tMP:0000018\tsemapv:ManualMappingCuration\tcomposed entity expression\n"
  },
  {
    "path": "examples/schema/curation_rule-propagated.sssom.tsv",
    "content": "#curie_map:\r\n#  HP: http://purl.obolibrary.org/obo/HP_\r\n#  MP: http://purl.obolibrary.org/obo/MP_\r\n#  orcid: https://orcid.org/\r\n#  DISEASE_MAPPING_COMMONS_RULES: https://w3id.org/sssom/commons/disease/curation-rules/\r\n#mapping_set_id: https://w3id.org/sssom/commons/examples/curation_rule.sssom.tsv\r\n#mapping_set_description: \"This example illustrates how to express that all mappings in a mapping set have been curated according to a specific curation rule\"\r\n#license: \"https://creativecommons.org/publicdomain/zero/1.0/\"\r\n#creator_id: \r\n#  - orcid:0000-0002-7356-1779\r\n#mapping_provider: \"https://w3id.org/sssom/core_team\"\r\n#curation_rule:\r\n#  - DISEASE_MAPPING_COMMONS_RULES:MPR2\r\n#comment: This is an example file for the SSSOM for illustration only. Its contents are entirely fabricated.\r\nsubject_id\tpredicate_id\tobject_id\tmapping_justification\r\nHP:0009124\tskos:exactMatch\tMP:0000003\tsemapv:ManualMappingCuration\r\nHP:0008551\tskos:exactMatch\tMP:0000018\tsemapv:ManualMappingCuration\r\nHP:0000411\tskos:exactMatch\tMP:0000021\tsemapv:ManualMappingCuration\r\n"
  },
  {
    "path": "examples/schema/curation_rule.sssom.tsv",
    "content": "#curie_map:\r\n#  HP: http://purl.obolibrary.org/obo/HP_\r\n#  MP: http://purl.obolibrary.org/obo/MP_\r\n#  orcid: https://orcid.org/\r\n#  DISEASE_MAPPING_COMMONS_RULES: https://w3id.org/sssom/commons/disease/curation-rules/\r\n#mapping_set_id: https://w3id.org/sssom/commons/examples/curation_rule.sssom.tsv\r\n#license: \"https://creativecommons.org/publicdomain/zero/1.0/\"\r\n#creator_id:\r\n#  - orcid:0000-0002-7356-1779\r\n#mapping_provider: \"https://w3id.org/sssom/core_team\"\r\n#comment: This is an example file for the SSSOM for illustration only. Its contents are entirely fabricated.\r\nsubject_id\tpredicate_id\tobject_id\tmapping_justification\tcuration_rule\tsee_also\r\nHP:0009124\tskos:exactMatch\tMP:0000003\tsemapv:ManualMappingCuration\tDISEASE_MAPPING_COMMONS_RULES:MPR2\thttps://github.com/mapping-commons/disease-mappings/issues/16\r\nHP:0008551\tskos:exactMatch\tMP:0000018\tsemapv:ManualMappingCuration\tDISEASE_MAPPING_COMMONS_RULES:MPR3\thttps://github.com/mapping-commons/disease-mappings/issues/16\r\nHP:0000411\tskos:exactMatch\tMP:0000021\tsemapv:ManualMappingCuration\tDISEASE_MAPPING_COMMONS_RULES:MPR3\thttps://github.com/mapping-commons/disease-mappings/issues/16\r\n"
  },
  {
    "path": "examples/schema/curation_rule_text-propagated.sssom.tsv",
    "content": "#curie_map:\r\n#  HP: http://purl.obolibrary.org/obo/HP_\r\n#  MP: http://purl.obolibrary.org/obo/MP_\r\n#  orcid: https://orcid.org/\r\n#mapping_set_id: https://w3id.org/sssom/commons/examples/curation_rule.sssom.tsv\r\n#mapping_set_description: \"This example illustrates how to express that all mappings in a mapping set have been curated according to a specific curation rule\"\r\n#license: \"https://creativecommons.org/publicdomain/zero/1.0/\"\r\n#creator_id:\r\n#  - orcid:0000-0002-7356-1779\r\n#mapping_provider: \"https://w3id.org/sssom/core_team\"\r\n#curation_rule_text:\r\n#  - Human and mouse phenotypes that inhere in homologous structures and exhibit the same phenotypic quality are considered exact matches.\r\n#comment: This is an example file for the SSSOM for illustration only. Its contents are entirely fabricated.\r\nsubject_id\tpredicate_id\tobject_id\tmapping_justification\r\nHP:0009124\tskos:exactMatch\tMP:0000003\tsemapv:ManualMappingCuration\r\nHP:0008551\tskos:exactMatch\tMP:0000018\tsemapv:ManualMappingCuration\r\nHP:0000411\tskos:exactMatch\tMP:0000021\tsemapv:ManualMappingCuration\r\n"
  },
  {
    "path": "examples/schema/curation_rule_text.sssom.tsv",
    "content": "#curie_map:\r\n#  HP: http://purl.obolibrary.org/obo/HP_\r\n#  MP: http://purl.obolibrary.org/obo/MP_\r\n#  orcid: https://orcid.org/\r\n#  DISEASE_MAPPING_COMMONS_RULES: https://w3id.org/sssom/commons/disease/curation-rules/\r\n#mapping_set_id: https://w3id.org/sssom/commons/examples/curation_rule_text.sssom.tsv\r\n#license: \"https://creativecommons.org/publicdomain/zero/1.0/\"\r\n#creator_id:\r\n#  - orcid:0000-0002-7356-1779\r\n#mapping_provider: \"https://w3id.org/sssom/core_team\"\r\n#comment: This is an example file for the SSSOM for illustration only. Its contents are entirely fabricated.\r\nsubject_id\tpredicate_id\tobject_id\tmapping_justification\tcuration_rule_text\tsee_also\r\nHP:0009124\tskos:exactMatch\tMP:0000003\tsemapv:ManualMappingCuration\tThe two phenotypes inhere in homologous structures and exhibit the same phenotypic quality\thttps://github.com/mapping-commons/disease-mappings/issues/16\r\nHP:0008551\tskos:exactMatch\tMP:0000018\tsemapv:ManualMappingCuration\tThe two phenotypes inhere in homologous structures and exhibit the same phenotypic quality\thttps://github.com/mapping-commons/disease-mappings/issues/16\r\nHP:0000411\tskos:exactMatch\tMP:0000021\tsemapv:ManualMappingCuration\tThe two phenotypes are associated with the exact same set of diseases\thttps://github.com/mapping-commons/disease-mappings/issues/16\r\n"
  },
  {
    "path": "examples/schema/curation_rule_text2.sssom.tsv",
    "content": "#curie_map:\n#  WTO: http://purl.obolibrary.org/obo/WTO_\n#  CO321: \"http://www.cropontology.org/rdf/CO_321:\"\n#  ror: https://ror.org/\n#mapping_set_id: https://w3id.org/sssom/commons/examples/curation_rule_text2.sssom.tsv\n#license: \"https://www.etalab.gouv.fr/licence-ouverte-open-licence/\"\n#comment: This is an example file for the SSSOM for illustration only. This example was extracted from a real mapping set where the subject source (WTO) is an ontology used to annotate text (e.g. scientific literature) and the object source (CO321) is an ontology used to annotate the traits evaluated from observational data. The objective of the alignment is to allow information retrieval from both textual and experimental phenotypic dataset.\n#creator_id: ror:02kvxyf05\n#creator_label: \"INRAE\"\nsubject_id\tsubject_label\tpredicate_id\tobject_id\tobject_label\tmapping_justification\tcuration_rule_text\tcomment\nWTO:0000304\tcold resistance\tskos:closeMatch\tCO321:0000080\tCold tolerance\tsemapv:ManualMappingCuration\tRule 4: We consider that \"tolerance\" and \"resistance\" are almost equivalent when applied to abiotic environmental conditions. \nWTO:0000450\taluminium toxicity\tskos:closeMatch\tCO321:0000079\tAluminum tolerance\tsemapv:ManualMappingCuration\tRule 3: We consider that the user of the information retrieval function interested in plant traits related to metal toxicity  (WTO) also wants to retrieve observational data measuring the plant tolerance to the same metal (CO_321). The rule metal + toxicity (WTO) <-> metal + tolerance  (CO321) is valid for any kind of metal.\nWTO:0000065\tanther extrusion\tskos:exactMatch\tCO321:0000982\tAnther extrusion\tsemapv:ManualMappingCuration\t\t\nWTO:0000296\taphid resistance\tskos:closeMatch\tCO321:0000085\tAphid damage\tsemapv:ManualMappingCuration\tRule 2: We consider that the user of the information retrieval function interested in plant traits related to damages caused by some animal,  insect, nematode, etc. also wants to retrieve observational data mentioning resistance to the same living organism.\nWTO:0000281\tArmyworm resistance\tskos:closeMatch\tCO321:0000086\tArmyworm damage\tsemapv:ManualMappingCuration\tRule 2: We consider that the user of the information retrieval function interested in plant traits related to damages caused by some animal,  insect, nematode, etc. also wants to retrieve observational data mentioning resistance to the same living organism.\nWTO:0000125\tawn color\tskos:exactMatch\tCO321:0000960\tAwn color\tsemapv:ManualMappingCuration\t\t\nWTO:0000126\tawn length\tskos:exactMatch\tCO321:0000026\tAwn length\tsemapv:ManualMappingCuration\t\t\nWTO:0000452\tbacterial leaf blight resistance\tskos:closeMatch\tCO321:0000932\tBacterial leaf blight severity\tsemapv:ManualMappingCuration\tRule 1.3: We consider that the user of the information retrieval function, given a pathogen or a disease, would like to retrieve all data, independently of the way the affection is observed. In observational data, a severity score is represented by two digits representing the vertical disease progress and an estimate of severity. The capacity of resistance to a disease would be deduced from the severity of this one on the plant."
  },
  {
    "path": "examples/schema/curie_map.sssom.tsv",
    "content": "#curie_map:\r\n#  HP: http://purl.obolibrary.org/obo/HP_\r\n#  MP: http://purl.obolibrary.org/obo/MP_\r\n#  orcid: https://orcid.org/\r\n#mapping_set_id: https://w3id.org/sssom/commons/examples/curie_map.sssom.tsv\r\n#license: \"https://creativecommons.org/publicdomain/zero/1.0/\"\r\n#creator_id:\r\n#  - orcid:0000-0002-7356-1779\r\n#mapping_provider: \"https://w3id.org/sssom/core_team\"\r\n#comment: This is an example file for the SSSOM for illustration only. Its contents are entirely fabricated.\r\nsubject_id\tpredicate_id\tobject_id\tmapping_justification\r\nHP:0009124\tskos:exactMatch\tMP:0000003\tsemapv:ManualMappingCuration\r\nHP:0008551\tskos:exactMatch\tMP:0000018\tsemapv:ManualMappingCuration\r\nHP:0000411\tskos:exactMatch\tMP:0000021\tsemapv:ManualMappingCuration\r\n"
  },
  {
    "path": "examples/schema/cxsmiles_pipe.sssom.tsv",
    "content": "#curie_map:\n#  CHEBI: http://purl.obolibrary.org/obo/CHEBI_\n#  PUBCHEM.COMPOUND: http://rdf.ncbi.nlm.nih.gov/pubchem/compound/CID\n#  wikidata: http://www.wikidata.org/entity/\n#  orcid: https://orcid.org/\n#mapping_set_id: https://w3id.org/sssom/commons/examples/cxsmiles_pipe.sssom.tsv\n#mapping_set_description: \"Mappings between ChEBI and PubChem Compound established via structural matching. The ferrocene entry uses a CXSMILES match_string whose pipe-delimited extension block must be escaped to avoid being incorrectly split by a parser treating | as a multivalued separator.\"\n#license: https://creativecommons.org/publicdomain/zero/1.0/\n#creator_id:\n#  - orcid:0000-0002-7356-1779\n#mapping_provider: https://w3id.org/sssom/core_team\n#comment: This is an example file for SSSOM for illustration only.\nsubject_id\tpredicate_id\tobject_id\tmapping_justification\tmatch_string\tsubject_match_field\tobject_match_field\nCHEBI:30672\tskos:exactMatch\tPUBCHEM.COMPOUND:7611\tsemapv:LexicalMatching\tc12c3c4c5c1[Fe]23451234c5c1c2c3c45 \\|C:4.5,0.6,1.7,2.8,3.9,7.12,6.10,9.16,10.18,8.14\\|\twikidata:P10718\twikidata:P10718\n"
  },
  {
    "path": "examples/schema/extension-slots.sssom.tsv",
    "content": "#curie_map:\n#  COMENT: https://example.com/entities/\n#  EXPROP: https://example.org/properties/\n#  ORGENT: https://example.org/entities/\n#mapping_set_id: https://example.org/sets/exo2c-with-extensions\n#mapping_set_title: Sample set EXO2C with extension slots\n#license: https://creativecommons.org/licenses/by/4.0/\n#extension_definitions:\n#  - slot_name: ext_bar\n#    property: EXPROP:barProperty\n#    type_hint: xsd:integer\n#  - slot_name: ext_baz\n#    property: EXPROP:bazProperty\n#    type_hint: linkml:Uriorcurie\n#  - slot_name: ext_foo\n#    property: EXPROP:fooProperty\n#ext_foo: Foo A\n#ext_undeclared_foo: Foo B\nsubject_id\tsubject_label\tpredicate_id\tobject_id\tobject_label\tmapping_justification\text_bar\text_baz\text_undeclared_baz\nORGENT:0001\talice\tskos:closeMatch\tCOMENT:0011\talpha\tsemapv:ManualMappingCuration\t111\tORGENT:BAZ_0001\tBAZ A\nORGENT:0002\tbob\tskos:closeMatch\tCOMENT:0012\tbeta\tsemapv:ManualMappingCuration\t112\tORGENT:BAZ_0002\t\nORGENT:0004\tdaphne\tskos:closeMatch\tCOMENT:0014\tdelta\tsemapv:ManualMappingCuration\t114\t\tBaz C\nORGENT:0005\teve\tskos:closeMatch\tCOMENT:0015\tepsilon\tsemapv:ManualMappingCuration\t115\tORGENT:BAZ_0005\tBaz E\n"
  },
  {
    "path": "examples/schema/issue_tracker.sssom.tsv",
    "content": "#curie_map:\r\n#  HP: http://purl.obolibrary.org/obo/HP_\r\n#  MP: http://purl.obolibrary.org/obo/MP_\r\n#  orcid: https://orcid.org/\r\n#  MH_MAPPINGS_GITHUB_ISSUES: https://github.com/mapping-commons/mh_mapping_initiative/issues/\r\n#mapping_set_id: https://w3id.org/sssom/commons/examples/issue_tracker.sssom.tsv\r\n#license: \"https://creativecommons.org/publicdomain/zero/1.0/\"\r\n#creator_id:\r\n#  - orcid:0000-0002-7356-1779\r\n#mapping_provider: \"https://w3id.org/sssom/core_team\"\r\n#issue_tracker: \"https://github.com/mapping-commons/mh_mapping_initiative/issues\"\r\n#comment: This is an example file for the SSSOM for illustration only. Its contents are entirely fabricated.\r\nsubject_id\tpredicate_id\tobject_id\tmapping_justification\tissue_tracker_item\r\nHP:0009124\tskos:exactMatch\tMP:0000003\tsemapv:ManualMappingCuration\tMH_MAPPINGS_GITHUB_ISSUES:9123\r\nHP:0008551\tskos:exactMatch\tMP:0000018\tsemapv:ManualMappingCuration\t\r\nHP:0000411\tskos:exactMatch\tMP:0000021\tsemapv:ManualMappingCuration\tMH_MAPPINGS_GITHUB_ISSUES:9125\r\n"
  },
  {
    "path": "examples/schema/issue_tracker_item.sssom.tsv",
    "content": "#curie_map:\r\n#  HP: http://purl.obolibrary.org/obo/HP_\r\n#  MP: http://purl.obolibrary.org/obo/MP_\r\n#  orcid: https://orcid.org/\r\n#  MH_MAPPINGS_GITHUB_ISSUES: https://github.com/mapping-commons/mh_mapping_initiative/issues/\r\n#mapping_set_id: https://w3id.org/sssom/commons/examples/issue_tracker_item.sssom.tsv\r\n#license: \"https://creativecommons.org/publicdomain/zero/1.0/\"\r\n#creator_id:\r\n#  - orcid:0000-0002-7356-1779\r\n#mapping_provider: \"https://w3id.org/sssom/core_team\"\r\n#comment: This is an example file for the SSSOM for illustration only. Its contents are entirely fabricated.\r\nsubject_id\tpredicate_id\tobject_id\tmapping_justification\tissue_tracker_item\r\nHP:0009124\tskos:exactMatch\tMP:0000003\tsemapv:ManualMappingCuration\tMH_MAPPINGS_GITHUB_ISSUES:9123\r\nHP:0008551\tskos:exactMatch\tMP:0000018\tsemapv:ManualMappingCuration\t\r\nHP:0000411\tskos:exactMatch\tMP:0000021\tsemapv:ManualMappingCuration\tMH_MAPPINGS_GITHUB_ISSUES:9125\r\n"
  },
  {
    "path": "examples/schema/literals.sssom.tsv",
    "content": "#curie_map:\n#  COMENT: https://example.com/entities/\n#mapping_set_id: https://example.org/sets/literal-mappings\n#license: https://creativecommons.org/licenses/by/4.0/\nsubject_label\tpredicate_id\tobject_id\tobject_label\tmapping_justification\tsubject_type\nalice\tskos:closeMatch\tCOMENT:0011\talpha\tsemapv:ManualMappingCuration\trdfs literal\nbob\tskos:closeMatch\tCOMENT:0012\tbeta\tsemapv:ManualMappingCuration\trdfs literal\ndaphne\tskos:closeMatch\tCOMENT:0014\tdelta\tsemapv:ManualMappingCuration\trdfs literal\neve\tskos:closeMatch\tCOMENT:0015\tepsilon\tsemapv:ManualMappingCuration\trdfs literal\n"
  },
  {
    "path": "examples/schema/mapping_set_confidence.sssom.tsv",
    "content": "#sssom_version: \"1.1\"\r\n#curie_map:\r\n#  HP: http://purl.obolibrary.org/obo/HP_\r\n#  MP: http://purl.obolibrary.org/obo/MP_\r\n#  orcid: https://orcid.org/\r\n#mapping_set_id: https://w3id.org/sssom/commons/examples/curie_map.sssom.tsv\r\n#mapping_set_confidence: 0.8\r\n#license: \"https://creativecommons.org/publicdomain/zero/1.0/\"\r\n#creator_id:\r\n#  - orcid:0000-0002-7356-1779\r\n#mapping_provider: \"https://w3id.org/sssom/core_team\"\r\n#mapping_tool: AgreementMakerLight\r\n#comment: This is an example file for the SSSOM for illustration only. The mapping_set_confidence value expresses the confidence of the creator of the mapping into the agent that produced the mappings, i.e. AgreementMakerLight.\r\nsubject_id\tpredicate_id\tobject_id\tmapping_justification\r\nHP:0009124\tskos:exactMatch\tMP:0000003\tsemapv:LexicalMatching\r\nHP:0008551\tskos:exactMatch\tMP:0000018\tsemapv:LexicalMatching\r\n"
  },
  {
    "path": "examples/schema/mapping_tool_id.sssom.tsv",
    "content": "#curie_map:\r\n#  HP: http://purl.obolibrary.org/obo/HP_\r\n#  MP: http://purl.obolibrary.org/obo/MP_\r\n#  orcid: https://orcid.org/\r\n#  wikidata: https://www.wikidata.org/wiki/\r\n#mapping_set_id: https://w3id.org/sssom/commons/examples/mapping_tool_id.sssom.tsv\r\n#license: \"https://creativecommons.org/publicdomain/zero/1.0/\"\r\n#creator_id:\r\n#  - orcid:0000-0002-7356-1779\r\n#mapping_provider: \"https://w3id.org/sssom/core_team\"\r\n#issue_tracker: \"https://github.com/mapping-commons/mh_mapping_initiative/issues\"\r\n#comment: This is an example file for the SSSOM for illustration only. Its contents are entirely fabricated.\r\nsubject_id\tpredicate_id\tobject_id\tmapping_justification\tmapping_tool_id\r\nHP:0009124\tskos:exactMatch\tMP:0000003\tsemapv:ManualMappingCuration\twikidata:Q58057366\r\nHP:0008551\tskos:exactMatch\tMP:0000018\tsemapv:ManualMappingCuration\twikidata:Q58057366\r\n"
  },
  {
    "path": "examples/schema/no_term_found.sssom.tsv",
    "content": "#curie_map:\n#  HP: http://purl.obolibrary.org/obo/HP_\n#  MP: http://purl.obolibrary.org/obo/MP_\n#  obo: http://purl.obolibrary.org/obo/\n#  orcid: https://orcid.org/\n#mapping_set_id: https://w3id.org/sssom/commons/examples/no_term_found.sssom.tsv\n#creator_id:\n#  - orcid:0000-0002-7356-1779\n#subject_source: obo:hp\n#object_source: obo:mp\n#license: \"https://creativecommons.org/publicdomain/zero/1.0/\"\n#mapping_provider: \"https://w3id.org/sssom/core_team\"\n#comment: This is an example file for the SSSOM for illustration only. Its contents are entirely fabricated.\nsubject_id\tpredicate_id\tobject_id\tmapping_justification\nHP:0009124\tskos:exactMatch\tMP:0000003\tsemapv:ManualMappingCuration\nHP:0000411\tskos:exactMatch\tsssom:NoTermFound\tsemapv:ManualMappingCuration\n"
  },
  {
    "path": "examples/schema/pipe-escaping.sssom.tsv",
    "content": "#curie_map:\n#  COMENT: https://example.com/entities/\n#  ORGENT: https://example.org/entities/\n#mapping_set_id: https://example.org/sets/test-escaping-pipe\n#license: https://creativecommons.org/licenses/by/4.0/\n#comment: >-\n#  This mapping set is intended to demonstrate the backslash-based\n#  escaping mechanism for multi-valued slots.\n#  In this set, the author_label slot of the first record has two values:\n#  \"Alice|Bob\" and \"Charlie\" (NOT \"Alice\\\", \"Bob\", and \"Charlie\").\n#  The author_label slot of the second record has three values:\n#  \"Alice\\Bob\", \"Charlie\\\", and \"David\\|Eve\\\".\nsubject_id\tsubject_label\tpredicate_id\tobject_id\tobject_label\tmapping_justification\tauthor_label\nORGENT:0001\talice\tskos:closeMatch\tCOMENT:0011\talpha\tsemapv:ManualMappingCuration\tAlice\\|Bob|Charlie\nORGENT:0002\talice\tskos:closeMatch\tCOMENT:0011\talpha\tsemapv:ManualMappingCuration\tAlice\\\\Bob|Charlie\\\\|David\\\\\\|Eve\\\\\n"
  },
  {
    "path": "examples/schema/predicate-types.sssom.tsv",
    "content": "#curie_map:\n#  COMENT: https://example.com/entities/\n#  ORGENT: https://example.org/entities/\n#  ORGPRO: https://example.org/properties/\n#mapping_set_id: https://w3id.org/sssom/commons/examples/predicate-types.sssom.tsv\n#license: https://creativecommons.org/licenses/by/4.0/\nsubject_id\tsubject_label\tpredicate_id\tobject_id\tobject_label\tmapping_justification\tpredicate_type\nORGENT:0001\talice\tORGPRO:example_annot_property\tCOMENT:0011\talpha\tsemapv:ManualMappingCuration\towl annotation property\nORGENT:0002\tbob\tORGPRO:example_object_property\tCOMENT:0012\tbeta\tsemapv:ManualMappingCuration\towl object property\nORGENT:0004\tdaphne\tORGPRO:example_data_property\tCOMENT:0014\tdelta\tsemapv:ManualMappingCuration\towl data property\nORGENT:0005\teve\tORGPRO:example_rdf_property\tCOMENT:0015\tepsilon\tsemapv:ManualMappingCuration\trdf property\n"
  },
  {
    "path": "examples/schema/record-ids.sssom.tsv",
    "content": "# sssom_version: \"1.1\"\n# curie_map:\n#   HP: http://purl.obolibrary.org/obo/FBbt_\n#   MP: http://purl.obolibrary.org/obo/UBERON_\n#   RI: https://example.org/sets/record-id#\n# mapping_set_id: https://example.org/sets/record-id\n# license: https://creativecommons.org/publicdomain/zero/1.0/\nrecord_id\tsubject_id\tpredicate_id\tobject_id\tmapping_justification\nRI:0000001\tHP:0009124\tskos:exactMatch\tMP:0000003\tsemapv:LexicalMatching\nRI:0000002\tHP:0008551\tskos:exactMatch\tMP:0000018\tsemapv:LexicalMatching\nRI:0000003\tHP:0008551\tskos:exactMatch\tMP:0000018\tsemapv:ManualMappingCuration\n"
  },
  {
    "path": "examples/schema/review_date.sssom.tsv",
    "content": "# curie_map:\n#   CHEBI: http://purl.obolibrary.org/obo/CHEBI_\n#   mesh: http://id.nlm.nih.gov/mesh/\n#   orcid: https://orcid.org/\n#   semapv: https://w3id.org/semapv/vocab/\n#   skos: http://www.w3.org/2004/02/skos/core#\n# license: https://creativecommons.org/publicdomain/zero/1.0/\n# mapping_set_id: https://github.com/mapping-commons/sssom/blob/master/examples/schema/review_date.sssom.tsv\n# creator_id:\n#  - orcid:0000-0003-4423-4370\n# see_also:\n#  - https://github.com/mapping-commons/sssom/issues/511\n#  - https://github.com/mapping-commons/sssom/pull/514\n#  - https://mapping-commons.github.io/sssom/confidence-model\nsubject_id\tsubject_label\tpredicate_id\tobject_id\tobject_label\tmapping_justification\tauthor_id\treviewer_id\treview_date\nCHEBI:10001\tVisnadin\tskos:exactMatch\tmesh:C067604\tvisnadin\tsemapv:ManualMappingCuration\torcid:0000-0001-9439-5346\torcid:0000-0003-4423-4370\t2026-03-26\n"
  },
  {
    "path": "examples/schema/reviewer_agreement.sssom.tsv",
    "content": "# curie_map:\n#   CHEBI: http://purl.obolibrary.org/obo/CHEBI_\n#   mesh: http://id.nlm.nih.gov/mesh/\n#   orcid: https://orcid.org/\n#   semapv: https://w3id.org/semapv/vocab/\n#   skos: http://www.w3.org/2004/02/skos/core#\n# license: https://creativecommons.org/publicdomain/zero/1.0/\n# mapping_set_id: https://github.com/mapping-commons/sssom/blob/master/examples/schema/reviewer_agreement.sssom.tsv\n# creator_id:\n#  - orcid:0000-0003-4423-4370\n# see_also:\n#  - https://github.com/mapping-commons/sssom/issues/510\n#  - https://github.com/mapping-commons/sssom/pull/519\n#  - https://mapping-commons.github.io/sssom/confidence-model\nsubject_id\tsubject_label\tpredicate_id\tobject_id\tobject_label\tmapping_justification\tauthor_id\treviewer_id\treviewer_agreement\tcomment\nCHEBI:10001\tVisnadin\tskos:exactMatch\tmesh:C067604\tvisnadin\tsemapv:ManualMappingCuration\torcid:0000-0001-9439-5346\torcid:0000-0003-4423-4370\t0.99\tthe reviewer confidently agrees with the accuracy of the mapping\nCHEBI:127105\ttribromosalicylanilide\tskos:exactMatch\tmesh:C004361\ttribromsalan\tsemapv:LexicalMatching\t\torcid:0000-0003-4423-4370\t0.0\tthe reviewer is not sure whether the mapping is correct or incorrect\nCHEBI:10057\t9H-xanthene\tskos:exactMatch\tmesh:C002563\txanthan gum\tsemapv:ManualMappingCuration\t\torcid:0000-0003-4423-4370\t-0.99\tthe reviewer confidently disagrees with the accuracy of the mapping\n"
  },
  {
    "path": "examples/schema/similarity_score.sssom.tsv",
    "content": "#curie_map:\r\n#  HP: http://purl.obolibrary.org/obo/HP_\r\n#  MP: http://purl.obolibrary.org/obo/MP_\r\n#  orcid: https://orcid.org/\r\n#  wikidata: https://www.wikidata.org/entity/\r\n#mapping_set_id: https://w3id.org/sssom/commons/examples/similarity_score.sssom.tsv\r\n#license: \"https://creativecommons.org/publicdomain/zero/1.0/\"\r\n#creator_id:\r\n#  - orcid:0000-0002-7356-1779\r\n#mapping_provider: \"https://w3id.org/sssom/core_team\"\r\n#comment: This is an example file for the SSSOM for illustration only. Its contents are entirely fabricated.\r\nsubject_id\tpredicate_id\tobject_id\tmapping_justification\tsimilarity_score\tsimilarity_measure\r\nHP:0009124\tskos:exactMatch\tMP:0000003\tsemapv:LexicalSimilarityThresholdMatching\t0.8\twikidata:Q865360\r\nHP:0008551\tskos:exactMatch\tMP:0000018\tsemapv:LexicalSimilarityThresholdMatching\t0.4\twikidata:Q865360\r\nHP:0000411\tskos:exactMatch\tMP:0000021\tsemapv:SemanticSimilarityThresholdMatching\t1.0\twikidata:Q1784941\r\n"
  },
  {
    "path": "examples/schema/version.sssom.tsv",
    "content": "# sssom_version: \"1.1\"\n# curie_map:\n#   HP: http://purl.obolibrary.org/obo/FBbt_\n#   MP: http://purl.obolibrary.org/obo/UBERON_\n# license: https://w3id.org/sssom/license/unspecified\nsubject_id\tpredicate_id\tobject_id\tmapping_justification\nHP:0009124\tskos:exactMatch\tMP:0000003\tsemapv:LexicalMatching\nHP:0008551\tskos:exactMatch\tMP:0000018\tsemapv:LexicalMatching\n\n"
  },
  {
    "path": "mkdocs.yml",
    "content": "site_name: \"A Simple Standard for Sharing Ontology Mappings (SSSOM)\"\nsite_author: \"The SSSOM Community\"\ntheme:\n  name: material\n  analytics:\n    gtag: G-2SYBSJVZ23\n  #  palette:\n  #    scheme: slate\n  #    primary: cyan\n  features:\n    - content.tabs.link\nextra:\n  version:\n    provider: mike\nplugins:\n  - search\n  - mermaid2\nmarkdown_extensions:\n  - pymdownx.highlight:\n      use_pygments: true\n  - pymdownx.inlinehilite\n  - pymdownx.snippets\n  - pymdownx.tabbed:\n  - pymdownx.critic\n  - pymdownx.caret\n  - pymdownx.keys\n  - pymdownx.mark\n  - pymdownx.tilde\n  - pymdownx.arithmatex:\n      generic: true\n  - admonition\n  #- pymdownx.emoji:\n  #    emoji_index: !!python/name:material.extensions.emoji.twemoji\n  #    emoji_generator: !!python/name:material.extensions.emoji.to_svg\nextra_javascript:\n  - javascripts/mathjax.js\n  - https://unpkg.com/mathjax@3/es5/tex-mml-chtml.js\nnav:\n  - Home: index.md\n  - Introduction: introduction.md\n  - Getting started: getting-started.md\n  - Specification:\n      - Introduction: spec-intro.md\n      - Data model:\n          - Introduction: spec-model.md\n          - LinkML documentation: linkml-index.md\n      - Serialisations:\n          - Introduction: spec-formats.md\n          - SSSOM/TSV serialisation: spec-formats-tsv.md\n          - SSSOM/JSON serialisation: spec-formats-json.md\n          - SSSOM/RDF serialisation: spec-formats-rdf.md\n          - OWL/RDF serialisation: spec-formats-owl.md\n      - Support functions:\n          - Introduction: spec-support.md\n          - Hashing mapping records: spec-support-hashing.md\n          - Applying Chaining Rules: chaining-rules.md\n  - Resources for contributors: contributing.md\n  - Resources for users:\n      - FAQ: faq.md\n      - Community:\n          - Use Cases: usecases.md\n          - Workshops: workshops.md\n          - Presentations: presentations.md\n      - Training materials:\n          - Overview: training.md\n          - Basic Tutorial: tutorial.md\n      - How to:\n          - Mapping Justifications: mapping-justifications.md\n          - How to use mapping predicates: mapping-predicates.md\n          - Set up a mapping registry/commons: mapping-commons.md\n          - A basic guide for the SSSOM toolkit: toolkit.md\n          - 5-Star Entity Mappings - Cheatsheet: 5star-mappings.md\n          - Matching tool implementation guide: matching-tool-implementation-guide.md\n          - How to gradually enrich OMOP mappings with SSSOM: tutorials/omop-mappings.md\n          - How to assess mapping confidence: confidence-model.md\n          - Identifying mapping records: record-identifiers.md\n      - Reference:\n          - Glossary: glossary.md\n  - Related documentation: related-documentation.md\n  - Funding: funding.md\n\nsite_url: https://mapping-commons.github.io/sssom/\nrepo_url: https://github.com/mapping-commons/sssom/\nedit_uri: \"edit/master/src/docs/\"\n"
  },
  {
    "path": "project/graphql/sssom_schema.graphql",
    "content": "# metamodel_version: 1.7.0\nenum EntityTypeEnum\n  {\n    owl_class\n    owl_object_property\n    owl_data_property\n    owl_annotation_property\n    owl_named_individual\n    skos_concept\n    rdfs_resource\n    rdfs_class\n    rdfs_literal\n    rdfs_datatype\n    rdf_property\n    composed_entity_expression\n  }\n\nenum MappingCardinalityEnum\n  {\n    __1__COLON__1\n    __1__COLON__n\n    n__COLON__1\n    n__COLON__n\n    __1__COLON__0\n    __0__COLON__1\n    __0__COLON__0\n  }\n\nenum PredicateModifierEnum\n  {\n    Not\n  }\n\nenum SssomVersionEnum\n  {\n    __1__FULL_STOP__0\n    __1__FULL_STOP__1\n  }\n\ntype ExtensionDefinition\n  {\n    slotName: String!\n    property: String\n    typeHint: String\n  }\n\ntype Mapping\n  {\n    recordId: EntityReference\n    subjectId: EntityReference\n    subjectLabel: String\n    subjectCategory: String\n    predicateId: EntityReference!\n    predicateLabel: String\n    predicateModifier: PredicateModifierEnum\n    objectId: EntityReference\n    objectLabel: String\n    objectCategory: String\n    mappingJustification: EntityReference!\n    authorId: [EntityReference]\n    authorLabel: [String]\n    reviewerId: [EntityReference]\n    reviewerLabel: [String]\n    creatorId: [EntityReference]\n    creatorLabel: [String]\n    license: NonRelativeURI\n    subjectType: EntityTypeEnum\n    subjectSource: EntityReference\n    subjectSourceVersion: String\n    objectType: EntityTypeEnum\n    objectSource: EntityReference\n    objectSourceVersion: String\n    predicateType: EntityTypeEnum\n    mappingProvider: NonRelativeURI\n    mappingSource: EntityReference\n    mappingCardinality: MappingCardinalityEnum\n    cardinalityScope: [String]\n    mappingTool: String\n    mappingToolId: EntityReference\n    mappingToolVersion: String\n    mappingDate: String\n    publicationDate: String\n    reviewDate: String\n    confidence: Float\n    reviewerAgreement: Float\n    curationRule: [EntityReference]\n    curationRuleText: [String]\n    subjectMatchField: [EntityReference]\n    objectMatchField: [EntityReference]\n    matchString: [String]\n    subjectPreprocessing: [EntityReference]\n    objectPreprocessing: [EntityReference]\n    similarityScore: Float\n    similarityMeasure: String\n    seeAlso: [NonRelativeURI]\n    issueTrackerItem: EntityReference\n    other: String\n    comment: String\n  }\n\ntype MappingRegistry\n  {\n    mappingRegistryId: EntityReference!\n    mappingRegistryTitle: String\n    mappingRegistryDescription: String\n    imports: [NonRelativeURI]\n    mappingSetReferences: [MappingSetReference]\n    documentation: NonRelativeURI\n    homepage: NonRelativeURI\n    issueTracker: NonRelativeURI\n  }\n\ntype MappingSet\n  {\n    sssomVersion: SssomVersionEnum\n    curieMap: [Prefix]\n    mappings: [Mapping]\n    mappingSetId: NonRelativeURI!\n    mappingSetVersion: String\n    mappingSetSource: [NonRelativeURI]\n    mappingSetTitle: String\n    mappingSetDescription: String\n    mappingSetConfidence: Float\n    creatorId: [EntityReference]\n    creatorLabel: [String]\n    license: NonRelativeURI!\n    subjectType: EntityTypeEnum\n    subjectSource: EntityReference\n    subjectSourceVersion: String\n    objectType: EntityTypeEnum\n    objectSource: EntityReference\n    objectSourceVersion: String\n    predicateType: EntityTypeEnum\n    mappingProvider: NonRelativeURI\n    cardinalityScope: [String]\n    mappingTool: String\n    mappingToolId: EntityReference\n    mappingToolVersion: String\n    mappingDate: String\n    publicationDate: String\n    subjectMatchField: [EntityReference]\n    objectMatchField: [EntityReference]\n    subjectPreprocessing: [EntityReference]\n    objectPreprocessing: [EntityReference]\n    similarityMeasure: String\n    curationRule: [EntityReference]\n    curationRuleText: [String]\n    seeAlso: [NonRelativeURI]\n    issueTracker: NonRelativeURI\n    other: String\n    comment: String\n    extensionDefinitions: [ExtensionDefinition]\n  }\n\ntype MappingSetReference\n  {\n    mappingSetId: NonRelativeURI!\n    mirrorFrom: NonRelativeURI\n    registryConfidence: Float\n    mappingSetGroup: String\n    lastUpdated: String\n    localName: String\n  }\n\ntype NoTermFound\n  {\n  }\n\ntype Prefix\n  {\n    prefixName: String!\n    prefixUrl: String\n  }\n\ntype Propagatable\n  {\n    propagated: Boolean\n  }\n\ntype Versionable\n  {\n    addedIn: SssomVersionEnum\n  }\n"
  },
  {
    "path": "project/jsonld/sssom_schema.context.jsonld",
    "content": "{\n   \"@context\": {\n      \"xsd\": \"http://www.w3.org/2001/XMLSchema#\",\n      \"dcterms\": \"http://purl.org/dc/terms/\",\n      \"linkml\": \"https://w3id.org/linkml/\",\n      \"oboInOwl\": \"http://www.geneontology.org/formats/oboInOwl#\",\n      \"owl\": \"http://www.w3.org/2002/07/owl#\",\n      \"pav\": \"http://purl.org/pav/\",\n      \"prov\": \"http://www.w3.org/ns/prov#\",\n      \"rdf\": \"http://www.w3.org/1999/02/22-rdf-syntax-ns#\",\n      \"rdfs\": \"http://www.w3.org/2000/01/rdf-schema#\",\n      \"semapv\": \"https://w3id.org/semapv/vocab/\",\n      \"skos\": \"http://www.w3.org/2004/02/skos/core#\",\n      \"sssom\": \"https://w3id.org/sssom/\",\n      \"@vocab\": \"https://w3id.org/sssom/\",\n      \"author_id\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"pav:authoredBy\"\n      },\n      \"author_label\": {\n         \"@id\": \"author_label\"\n      },\n      \"cardinality_scope\": {\n         \"@id\": \"cardinality_scope\"\n      },\n      \"comment\": {\n         \"@id\": \"rdfs:comment\"\n      },\n      \"confidence\": {\n         \"@type\": \"xsd:double\",\n         \"@id\": \"confidence\"\n      },\n      \"creator_id\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"dcterms:creator\"\n      },\n      \"creator_label\": {\n         \"@id\": \"creator_label\"\n      },\n      \"curation_rule\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"curation_rule\"\n      },\n      \"curation_rule_text\": {\n         \"@id\": \"curation_rule_text\"\n      },\n      \"curie_map\": {\n         \"@type\": \"@id\",\n         \"@id\": \"curie_map\"\n      },\n      \"documentation\": {\n         \"@type\": \"xsd:anyURI\",\n         \"@id\": \"documentation\"\n      },\n      \"extension_definitions\": {\n         \"@type\": \"@id\",\n         \"@id\": \"extension_definitions\"\n      },\n      \"property\": {\n         \"@type\": \"xsd:anyURI\",\n         \"@id\": \"property\"\n      },\n      \"slot_name\": {\n         \"@id\": \"slot_name\"\n      },\n      \"type_hint\": {\n         \"@type\": \"xsd:anyURI\",\n         \"@id\": \"type_hint\"\n      },\n      \"homepage\": {\n         \"@type\": \"xsd:anyURI\",\n         \"@id\": \"homepage\"\n      },\n      \"imports\": {\n         \"@type\": \"xsd:anyURI\",\n         \"@id\": \"imports\"\n      },\n      \"issue_tracker\": {\n         \"@type\": \"xsd:anyURI\",\n         \"@id\": \"issue_tracker\"\n      },\n      \"issue_tracker_item\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"issue_tracker_item\"\n      },\n      \"last_updated\": {\n         \"@type\": \"xsd:date\",\n         \"@id\": \"last_updated\"\n      },\n      \"license\": {\n         \"@type\": \"xsd:anyURI\",\n         \"@id\": \"dcterms:license\"\n      },\n      \"local_name\": {\n         \"@id\": \"local_name\"\n      },\n      \"mapping_cardinality\": {\n         \"@context\": {\n            \"text\": \"skos:notation\",\n            \"description\": \"skos:prefLabel\",\n            \"meaning\": \"@id\"\n         },\n         \"@id\": \"mapping_cardinality\"\n      },\n      \"mapping_date\": {\n         \"@type\": \"xsd:date\",\n         \"@id\": \"dcterms:created\"\n      },\n      \"mapping_justification\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"mapping_justification\"\n      },\n      \"mapping_provider\": {\n         \"@type\": \"xsd:anyURI\",\n         \"@id\": \"mapping_provider\"\n      },\n      \"mapping_registry_description\": {\n         \"@id\": \"mapping_registry_description\"\n      },\n      \"mapping_registry_id\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"mapping_registry_id\"\n      },\n      \"mapping_registry_title\": {\n         \"@id\": \"mapping_registry_title\"\n      },\n      \"mapping_set_confidence\": {\n         \"@type\": \"xsd:double\",\n         \"@id\": \"mapping_set_confidence\"\n      },\n      \"mapping_set_description\": {\n         \"@id\": \"dcterms:description\"\n      },\n      \"mapping_set_group\": {\n         \"@id\": \"mapping_set_group\"\n      },\n      \"mapping_set_id\": {\n         \"@type\": \"xsd:anyURI\",\n         \"@id\": \"mapping_set_id\"\n      },\n      \"mapping_set_references\": {\n         \"@type\": \"@id\",\n         \"@id\": \"mapping_set_references\"\n      },\n      \"mapping_set_source\": {\n         \"@type\": \"xsd:anyURI\",\n         \"@id\": \"prov:wasDerivedFrom\"\n      },\n      \"mapping_set_title\": {\n         \"@id\": \"dcterms:title\"\n      },\n      \"mapping_set_version\": {\n         \"@id\": \"owl:versionInfo\"\n      },\n      \"mapping_source\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"mapping_source\"\n      },\n      \"mapping_tool\": {\n         \"@id\": \"mapping_tool\"\n      },\n      \"mapping_tool_id\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"mapping_tool_id\"\n      },\n      \"mapping_tool_version\": {\n         \"@id\": \"mapping_tool_version\"\n      },\n      \"mappings\": {\n         \"@type\": \"@id\",\n         \"@id\": \"mappings\"\n      },\n      \"match_string\": {\n         \"@id\": \"match_string\"\n      },\n      \"mirror_from\": {\n         \"@type\": \"xsd:anyURI\",\n         \"@id\": \"mirror_from\"\n      },\n      \"object_category\": {\n         \"@id\": \"object_category\"\n      },\n      \"object_id\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"owl:annotatedTarget\"\n      },\n      \"object_label\": {\n         \"@id\": \"object_label\"\n      },\n      \"object_match_field\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"object_match_field\"\n      },\n      \"object_preprocessing\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"object_preprocessing\"\n      },\n      \"object_source\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"object_source\"\n      },\n      \"object_source_version\": {\n         \"@id\": \"object_source_version\"\n      },\n      \"object_type\": {\n         \"@context\": {\n            \"text\": \"skos:notation\",\n            \"description\": \"skos:prefLabel\",\n            \"meaning\": \"@id\"\n         },\n         \"@id\": \"object_type\"\n      },\n      \"other\": {\n         \"@id\": \"other\"\n      },\n      \"predicate_id\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"owl:annotatedProperty\"\n      },\n      \"predicate_label\": {\n         \"@id\": \"predicate_label\"\n      },\n      \"predicate_modifier\": {\n         \"@context\": {\n            \"text\": \"skos:notation\",\n            \"description\": \"skos:prefLabel\",\n            \"meaning\": \"@id\"\n         },\n         \"@id\": \"predicate_modifier\"\n      },\n      \"predicate_type\": {\n         \"@context\": {\n            \"text\": \"skos:notation\",\n            \"description\": \"skos:prefLabel\",\n            \"meaning\": \"@id\"\n         },\n         \"@id\": \"predicate_type\"\n      },\n      \"prefix_name\": {\n         \"@id\": \"prefix_name\"\n      },\n      \"prefix_url\": {\n         \"@type\": \"xsd:anyURI\",\n         \"@id\": \"prefix_url\"\n      },\n      \"propagated\": {\n         \"@type\": \"xsd:boolean\",\n         \"@id\": \"propagated\"\n      },\n      \"publication_date\": {\n         \"@type\": \"xsd:date\",\n         \"@id\": \"dcterms:issued\"\n      },\n      \"record_id\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"record_id\"\n      },\n      \"registry_confidence\": {\n         \"@type\": \"xsd:double\",\n         \"@id\": \"registry_confidence\"\n      },\n      \"review_date\": {\n         \"@type\": \"xsd:date\",\n         \"@id\": \"review_date\"\n      },\n      \"reviewer_agreement\": {\n         \"@type\": \"xsd:double\",\n         \"@id\": \"reviewer_agreement\"\n      },\n      \"reviewer_id\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"reviewer_id\"\n      },\n      \"reviewer_label\": {\n         \"@id\": \"reviewer_label\"\n      },\n      \"see_also\": {\n         \"@type\": \"xsd:anyURI\",\n         \"@id\": \"rdfs:seeAlso\"\n      },\n      \"similarity_measure\": {\n         \"@id\": \"similarity_measure\"\n      },\n      \"similarity_score\": {\n         \"@type\": \"xsd:double\",\n         \"@id\": \"similarity_score\"\n      },\n      \"sssom_version\": {\n         \"@context\": {\n            \"text\": \"skos:notation\",\n            \"description\": \"skos:prefLabel\",\n            \"meaning\": \"@id\"\n         },\n         \"@id\": \"sssom_version\"\n      },\n      \"subject_category\": {\n         \"@id\": \"subject_category\"\n      },\n      \"subject_id\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"owl:annotatedSource\"\n      },\n      \"subject_label\": {\n         \"@id\": \"subject_label\"\n      },\n      \"subject_match_field\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"subject_match_field\"\n      },\n      \"subject_preprocessing\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"subject_preprocessing\"\n      },\n      \"subject_source\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"subject_source\"\n      },\n      \"subject_source_version\": {\n         \"@id\": \"subject_source_version\"\n      },\n      \"subject_type\": {\n         \"@context\": {\n            \"text\": \"skos:notation\",\n            \"description\": \"skos:prefLabel\",\n            \"meaning\": \"@id\"\n         },\n         \"@id\": \"subject_type\"\n      },\n      \"added_in\": {\n         \"@context\": {\n            \"text\": \"skos:notation\",\n            \"description\": \"skos:prefLabel\",\n            \"meaning\": \"@id\"\n         },\n         \"@id\": \"added_in\"\n      },\n      \"ExtensionDefinition\": {\n         \"@id\": \"ExtensionDefinition\"\n      },\n      \"Mapping\": {\n         \"@id\": \"owl:Axiom\"\n      },\n      \"MappingRegistry\": {\n         \"@id\": \"MappingRegistry\"\n      },\n      \"MappingSet\": {\n         \"@id\": \"MappingSet\"\n      },\n      \"MappingSetReference\": {\n         \"@id\": \"MappingSetReference\"\n      },\n      \"NoTermFound\": {\n         \"@id\": \"NoTermFound\"\n      },\n      \"Prefix\": {\n         \"@id\": \"Prefix\"\n      },\n      \"Propagatable\": {\n         \"@id\": \"Propagatable\"\n      },\n      \"Versionable\": {\n         \"@id\": \"Versionable\"\n      }\n   }\n}\n"
  },
  {
    "path": "project/jsonld/sssom_schema.jsonld",
    "content": "{\n  \"name\": \"sssom\",\n  \"description\": \"Datamodel for Simple Standard for Sharing Ontological Mappings (SSSOM)\",\n  \"see_also\": [\n    \"https://github.com/mapping-commons/sssom\",\n    \"https://mapping-commons.github.io/sssom/home/\"\n  ],\n  \"id\": \"https://w3id.org/sssom/schema/\",\n  \"imports\": [\n    \"linkml:types\"\n  ],\n  \"license\": \"https://creativecommons.org/publicdomain/zero/1.0/\",\n  \"prefixes\": [\n    {\n      \"prefix_prefix\": \"dcterms\",\n      \"prefix_reference\": \"http://purl.org/dc/terms/\"\n    },\n    {\n      \"prefix_prefix\": \"linkml\",\n      \"prefix_reference\": \"https://w3id.org/linkml/\"\n    },\n    {\n      \"prefix_prefix\": \"sssom\",\n      \"prefix_reference\": \"https://w3id.org/sssom/\"\n    },\n    {\n      \"prefix_prefix\": \"rdfs\",\n      \"prefix_reference\": \"http://www.w3.org/2000/01/rdf-schema#\"\n    },\n    {\n      \"prefix_prefix\": \"rdf\",\n      \"prefix_reference\": \"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n    },\n    {\n      \"prefix_prefix\": \"oboInOwl\",\n      \"prefix_reference\": \"http://www.geneontology.org/formats/oboInOwl#\"\n    },\n    {\n      \"prefix_prefix\": \"pav\",\n      \"prefix_reference\": \"http://purl.org/pav/\"\n    },\n    {\n      \"prefix_prefix\": \"prov\",\n      \"prefix_reference\": \"http://www.w3.org/ns/prov#\"\n    },\n    {\n      \"prefix_prefix\": \"skos\",\n      \"prefix_reference\": \"http://www.w3.org/2004/02/skos/core#\"\n    },\n    {\n      \"prefix_prefix\": \"xsd\",\n      \"prefix_reference\": \"http://www.w3.org/2001/XMLSchema#\"\n    },\n    {\n      \"prefix_prefix\": \"semapv\",\n      \"prefix_reference\": \"https://w3id.org/semapv/vocab/\"\n    }\n  ],\n  \"default_curi_maps\": [\n    \"semweb_context\",\n    \"obo_context\"\n  ],\n  \"default_prefix\": \"sssom\",\n  \"default_range\": \"string\",\n  \"types\": [\n    {\n      \"name\": \"EntityReference\",\n      \"definition_uri\": \"https://w3id.org/sssom/EntityReference\",\n      \"description\": \"A reference to an entity involved in the mapping.\\n\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://mapping-commons.github.io/sssom/spec/#tsv\"\n      ],\n      \"typeof\": \"uriorcurie\",\n      \"base\": \"str\",\n      \"uri\": \"http://www.w3.org/2000/01/rdf-schema#Resource\",\n      \"repr\": \"str\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"NonRelativeURI\",\n      \"definition_uri\": \"https://w3id.org/sssom/NonRelativeURI\",\n      \"description\": \"A URI as per RFC 3986, that is a string that matches the production of the \\\"URI\\\" rule defined in Appendix A of that RFC. Contrary to the underlying LinkML type, this specifically excludes _relative URI references_, which do not start with a scheme component. Relative URI references are forbidden because SSSOM has no built-in mechanism to provide the base URI that would be needed to resolve relative URI references into non-relative ones.\",\n      \"examples\": [\n        {\n          \"value\": \"https://example.org/path/to/file.txt#L4\",\n          \"description\": \"A URI that is URL to a HTTP resource.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"urn:oasis:names:tc:entity:xmlns:xml:catalog\",\n          \"description\": \"A URI that is the URN of the namespace for the OASIS XML Catalogs specification.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"ldap://example.org/cn=Alice,dc=example,dc=org?mail\",\n          \"description\": \"A URI that is a LDAP query URL.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"mailto:alice@example.org\",\n          \"description\": \"A URI that is an email address.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"file.txt\",\n          \"description\": \"An _invalid_ example, as it a relative URI (path only, no scheme).\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"/path/to/file.txt\",\n          \"description\": \"An _invalid_ example; though it appears to be an _absolute path_, it is a _relative URI_ because of the absence of a scheme.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"//example.org/path/to/file.txt\",\n          \"description\": \"An _invalid_ example; though it includes an authority component (example.org), it has no scheme and is therefore a _relative URI_.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/448\"\n      ],\n      \"typeof\": \"uri\",\n      \"base\": \"URI\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#anyURI\",\n      \"repr\": \"str\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"string\",\n      \"definition_uri\": \"https://w3id.org/linkml/String\",\n      \"description\": \"A character string\",\n      \"notes\": [\n        \"In RDF serializations, a slot with range of string is treated as a literal or type xsd:string.   If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"string\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"exact_mappings\": [\n        \"schema:Text\"\n      ],\n      \"base\": \"str\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#string\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"integer\",\n      \"definition_uri\": \"https://w3id.org/linkml/Integer\",\n      \"description\": \"An integer\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"integer\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"exact_mappings\": [\n        \"schema:Integer\"\n      ],\n      \"base\": \"int\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#integer\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"boolean\",\n      \"definition_uri\": \"https://w3id.org/linkml/Boolean\",\n      \"description\": \"A binary (true or false) value\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"boolean\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"exact_mappings\": [\n        \"schema:Boolean\"\n      ],\n      \"base\": \"Bool\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#boolean\",\n      \"repr\": \"bool\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"float\",\n      \"definition_uri\": \"https://w3id.org/linkml/Float\",\n      \"description\": \"A real number that conforms to the xsd:float specification\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"float\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"exact_mappings\": [\n        \"schema:Float\"\n      ],\n      \"base\": \"float\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#float\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"double\",\n      \"definition_uri\": \"https://w3id.org/linkml/Double\",\n      \"description\": \"A real number that conforms to the xsd:double specification\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"double\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"close_mappings\": [\n        \"schema:Float\"\n      ],\n      \"base\": \"float\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#double\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"decimal\",\n      \"definition_uri\": \"https://w3id.org/linkml/Decimal\",\n      \"description\": \"A real number with arbitrary precision that conforms to the xsd:decimal specification\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"decimal\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"broad_mappings\": [\n        \"schema:Number\"\n      ],\n      \"base\": \"Decimal\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#decimal\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"time\",\n      \"definition_uri\": \"https://w3id.org/linkml/Time\",\n      \"description\": \"A time object represents a (local) time of day, independent of any particular day\",\n      \"notes\": [\n        \"URI is dateTime because OWL reasoners do not work with straight date or time\",\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"time\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"exact_mappings\": [\n        \"schema:Time\"\n      ],\n      \"base\": \"XSDTime\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#time\",\n      \"repr\": \"str\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"date\",\n      \"definition_uri\": \"https://w3id.org/linkml/Date\",\n      \"description\": \"a date (year, month and day) in an idealized calendar\",\n      \"notes\": [\n        \"URI is dateTime because OWL reasoners don't work with straight date or time\",\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"date\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"exact_mappings\": [\n        \"schema:Date\"\n      ],\n      \"base\": \"XSDDate\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#date\",\n      \"repr\": \"str\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"datetime\",\n      \"definition_uri\": \"https://w3id.org/linkml/Datetime\",\n      \"description\": \"The combination of a date and time\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"datetime\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"exact_mappings\": [\n        \"schema:DateTime\"\n      ],\n      \"base\": \"XSDDateTime\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#dateTime\",\n      \"repr\": \"str\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"date_or_datetime\",\n      \"definition_uri\": \"https://w3id.org/linkml/DateOrDatetime\",\n      \"description\": \"Either a date or a datetime\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"date_or_datetime\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"base\": \"str\",\n      \"uri\": \"https://w3id.org/linkml/DateOrDatetime\",\n      \"repr\": \"str\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"uriorcurie\",\n      \"definition_uri\": \"https://w3id.org/linkml/Uriorcurie\",\n      \"description\": \"a URI or a CURIE\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"uriorcurie\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"base\": \"URIorCURIE\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#anyURI\",\n      \"repr\": \"str\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"curie\",\n      \"definition_uri\": \"https://w3id.org/linkml/Curie\",\n      \"conforms_to\": \"https://www.w3.org/TR/curie/\",\n      \"description\": \"a compact URI\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"curie\\\".\"\n      ],\n      \"comments\": [\n        \"in RDF serializations this MUST be expanded to a URI\",\n        \"in non-RDF serializations MAY be serialized as the compact representation\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"base\": \"Curie\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#string\",\n      \"repr\": \"str\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"uri\",\n      \"definition_uri\": \"https://w3id.org/linkml/Uri\",\n      \"conforms_to\": \"https://www.ietf.org/rfc/rfc3987.txt\",\n      \"description\": \"a complete URI\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"uri\\\".\"\n      ],\n      \"comments\": [\n        \"in RDF serializations a slot with range of uri is treated as a literal or type xsd:anyURI unless it is an identifier or a reference to an identifier, in which case it is translated directly to a node\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"close_mappings\": [\n        \"schema:URL\"\n      ],\n      \"base\": \"URI\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#anyURI\",\n      \"repr\": \"str\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"ncname\",\n      \"definition_uri\": \"https://w3id.org/linkml/Ncname\",\n      \"description\": \"Prefix part of CURIE\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"ncname\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"base\": \"NCName\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#string\",\n      \"repr\": \"str\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"objectidentifier\",\n      \"definition_uri\": \"https://w3id.org/linkml/Objectidentifier\",\n      \"description\": \"A URI or CURIE that represents an object in the model.\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"objectidentifier\\\".\"\n      ],\n      \"comments\": [\n        \"Used for inheritance and type checking\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"base\": \"ElementIdentifier\",\n      \"uri\": \"http://www.w3.org/ns/shex#iri\",\n      \"repr\": \"str\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"nodeidentifier\",\n      \"definition_uri\": \"https://w3id.org/linkml/Nodeidentifier\",\n      \"description\": \"A URI, CURIE or BNODE that represents a node in a model.\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"nodeidentifier\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"base\": \"NodeIdentifier\",\n      \"uri\": \"http://www.w3.org/ns/shex#nonLiteral\",\n      \"repr\": \"str\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"jsonpointer\",\n      \"definition_uri\": \"https://w3id.org/linkml/Jsonpointer\",\n      \"conforms_to\": \"https://datatracker.ietf.org/doc/html/rfc6901\",\n      \"description\": \"A string encoding a JSON Pointer. The value of the string MUST conform to JSON Point syntax and SHOULD dereference to a valid object within the current instance document when encoded in tree form.\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"jsonpointer\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"base\": \"str\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#string\",\n      \"repr\": \"str\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"jsonpath\",\n      \"definition_uri\": \"https://w3id.org/linkml/Jsonpath\",\n      \"conforms_to\": \"https://www.ietf.org/archive/id/draft-goessner-dispatch-jsonpath-00.html\",\n      \"description\": \"A string encoding a JSON Path. The value of the string MUST conform to JSON Point syntax and SHOULD dereference to zero or more valid objects within the current instance document when encoded in tree form.\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"jsonpath\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"base\": \"str\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#string\",\n      \"repr\": \"str\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"sparqlpath\",\n      \"definition_uri\": \"https://w3id.org/linkml/Sparqlpath\",\n      \"conforms_to\": \"https://www.w3.org/TR/sparql11-query/#propertypaths\",\n      \"description\": \"A string encoding a SPARQL Property Path. The value of the string MUST conform to SPARQL syntax and SHOULD dereference to zero or more valid objects within the current instance document when encoded as RDF.\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"sparqlpath\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"base\": \"str\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#string\",\n      \"repr\": \"str\",\n      \"@type\": \"TypeDefinition\"\n    }\n  ],\n  \"enums\": [\n    {\n      \"name\": \"sssom_version_enum\",\n      \"definition_uri\": \"https://w3id.org/sssom/SssomVersionEnum\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"permissible_values\": [\n        {\n          \"text\": \"1.0\",\n          \"description\": \"SSSOM specification version 1.0\",\n          \"meaning\": \"sssom:version1.0\"\n        },\n        {\n          \"text\": \"1.1\",\n          \"description\": \"SSSOM specification version 1.1\",\n          \"meaning\": \"sssom:version1.1\"\n        }\n      ]\n    },\n    {\n      \"name\": \"entity_type_enum\",\n      \"definition_uri\": \"https://w3id.org/sssom/EntityTypeEnum\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"permissible_values\": [\n        {\n          \"text\": \"owl class\",\n          \"meaning\": \"owl:Class\"\n        },\n        {\n          \"text\": \"owl object property\",\n          \"meaning\": \"owl:ObjectProperty\"\n        },\n        {\n          \"text\": \"owl data property\",\n          \"meaning\": \"owl:DataProperty\"\n        },\n        {\n          \"text\": \"owl annotation property\",\n          \"meaning\": \"owl:AnnotationProperty\"\n        },\n        {\n          \"text\": \"owl named individual\",\n          \"meaning\": \"owl:NamedIndividual\"\n        },\n        {\n          \"text\": \"skos concept\",\n          \"meaning\": \"skos:Concept\"\n        },\n        {\n          \"text\": \"rdfs resource\",\n          \"meaning\": \"rdfs:Resource\"\n        },\n        {\n          \"text\": \"rdfs class\",\n          \"meaning\": \"rdfs:Class\"\n        },\n        {\n          \"text\": \"rdfs literal\",\n          \"description\": \"This value indicates that the entity being mapped is not a semantic entity with a distinct identifier, but is instead represented entirely by its literal label. This value MUST NOT be used in the predicate_type slot.\",\n          \"meaning\": \"rdfs:Literal\",\n          \"see_also\": [\n            \"https://mapping-commons.github.io/sssom/spec-model/#literal-mappings\",\n            \"https://github.com/mapping-commons/sssom/issues/234\",\n            \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/literals.sssom.tsv\"\n          ]\n        },\n        {\n          \"text\": \"rdfs datatype\",\n          \"meaning\": \"rdfs:Datatype\"\n        },\n        {\n          \"text\": \"rdf property\",\n          \"meaning\": \"rdf:Property\"\n        },\n        {\n          \"text\": \"composed entity expression\",\n          \"description\": \"This value indicates that the entity ID does not represent a single entity, but a composite involving several individual entities. This value MUST NOT be used in the predicate_type slot. This specifications does not prescribe how an ID representing a composite entity should be interpreted; this is left at the discretion of applications.\",\n          \"meaning\": \"sssom:ComposedEntityExpression\",\n          \"see_also\": [\n            \"https://github.com/mapping-commons/sssom/issues/402\",\n            \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/composite-entities.sssom.tsv\"\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"predicate_modifier_enum\",\n      \"definition_uri\": \"https://w3id.org/sssom/PredicateModifierEnum\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"permissible_values\": [\n        {\n          \"text\": \"Not\",\n          \"description\": \"Negating the mapping predicate. The meaning of the triple becomes subject_id is not a predicate_id match to object_id.\",\n          \"meaning\": \"sssom:NegatedPredicate\"\n        }\n      ]\n    },\n    {\n      \"name\": \"mapping_cardinality_enum\",\n      \"definition_uri\": \"https://w3id.org/sssom/MappingCardinalityEnum\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"permissible_values\": [\n        {\n          \"text\": \"1:1\",\n          \"description\": \"Indicates the mapping record is about a one-to-one mapping, that is, the subject and the object are only mapped to each other, exclusive of any other subject or object.\"\n        },\n        {\n          \"text\": \"1:n\",\n          \"description\": \"Indicates the mapping record is about a one-to-many mapping, that is, the same subject is mapped to several different objects.\"\n        },\n        {\n          \"text\": \"n:1\",\n          \"description\": \"Indicates the mapping record is about a many-to-one mapping, that is, several different subjects are mapped to the same object.\"\n        },\n        {\n          \"text\": \"n:n\",\n          \"description\": \"Indicates the mapping record is about a many-to-many mapping, that is, the subject is mapped to several different objects and the object is mapped to several different subjects.\"\n        },\n        {\n          \"text\": \"1:0\",\n          \"description\": \"Indicates that the subject has no match in the object vocabulary. This value MUST only be used when the object_id is sssom:NoTermFound.\"\n        },\n        {\n          \"text\": \"0:1\",\n          \"description\": \"Indicates that the object has no match in the subject vocabulary. This value MUST only be used when the subject_id is sssom:NoTermFound.\"\n        },\n        {\n          \"text\": \"0:0\",\n          \"description\": \"Indicates that there is no match between the subject vocabulary and the object vocabulary. This value MUST only be used when both the subject_id and the object_id are sssom:NoTermFound.\"\n        }\n      ]\n    }\n  ],\n  \"slots\": [\n    {\n      \"name\": \"prefix_name\",\n      \"definition_uri\": \"https://w3id.org/sssom/prefix_name\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/prefix_name\",\n      \"key\": true,\n      \"owner\": \"Prefix\",\n      \"domain_of\": [\n        \"Prefix\"\n      ],\n      \"range\": \"ncname\",\n      \"required\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"prefix_url\",\n      \"definition_uri\": \"https://w3id.org/sssom/prefix_url\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/prefix_url\",\n      \"owner\": \"Prefix\",\n      \"domain_of\": [\n        \"Prefix\"\n      ],\n      \"range\": \"uri\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"sssom_version\",\n      \"definition_uri\": \"https://w3id.org/sssom/sssom_version\",\n      \"instantiates\": [\n        \"sssom:Versionable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"added_in\",\n          \"value\": \"1.1\",\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"The version of the SSSOM specification a mapping set is compliant with.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/439\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/version.sssom.tsv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/sssom_version\",\n      \"owner\": \"MappingSet\",\n      \"domain_of\": [\n        \"MappingSet\"\n      ],\n      \"range\": \"sssom_version_enum\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"curie_map\",\n      \"definition_uri\": \"https://w3id.org/sssom/curie_map\",\n      \"description\": \"A dictionary that contains prefixes as keys and their URI expansions as values.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/225\",\n        \"https://github.com/mapping-commons/sssom/pull/349\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/curie_map.sssom.tsv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/curie_map\",\n      \"owner\": \"MappingSet\",\n      \"domain_of\": [\n        \"MappingSet\"\n      ],\n      \"range\": \"Prefix\",\n      \"multivalued\": true,\n      \"inlined\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mirror_from\",\n      \"definition_uri\": \"https://w3id.org/sssom/mirror_from\",\n      \"description\": \"A URL location from which to obtain a resource, such as a mapping set.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/mirror_from\",\n      \"owner\": \"MappingSetReference\",\n      \"domain_of\": [\n        \"MappingSetReference\"\n      ],\n      \"range\": \"NonRelativeURI\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"registry_confidence\",\n      \"definition_uri\": \"https://w3id.org/sssom/registry_confidence\",\n      \"description\": \"This value is set by the creator/maintainer of the mapping registry and reflects the confidence the mapping registry has in the correctness (i.e., precision) of mappings in the mapping set.\\nWhen not explicitly specified, confidence estimation algorithms should consider the registry confidence in a mapping set to be 1.0 by default.\",\n      \"examples\": [\n        {\n          \"value\": \"0.95\",\n          \"description\": \"A confidence score of 0.95, indicating 95% confidence.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://mapping-commons.github.io/sssom/confidence-model\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/registry_confidence\",\n      \"owner\": \"MappingSetReference\",\n      \"domain_of\": [\n        \"MappingSetReference\"\n      ],\n      \"range\": \"double\",\n      \"minimum_value\": 0.0,\n      \"maximum_value\": 1.0,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"last_updated\",\n      \"definition_uri\": \"https://w3id.org/sssom/last_updated\",\n      \"description\": \"The date this reference was last updated.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/last_updated\",\n      \"owner\": \"MappingSetReference\",\n      \"domain_of\": [\n        \"MappingSetReference\"\n      ],\n      \"range\": \"date\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"local_name\",\n      \"definition_uri\": \"https://w3id.org/sssom/local_name\",\n      \"description\": \"The local name assigned to file that corresponds to the downloaded mapping set.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/local_name\",\n      \"owner\": \"MappingSetReference\",\n      \"domain_of\": [\n        \"MappingSetReference\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_set_references\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_set_references\",\n      \"description\": \"A list of mapping set references.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/mapping_set_references\",\n      \"owner\": \"MappingRegistry\",\n      \"domain_of\": [\n        \"MappingRegistry\"\n      ],\n      \"range\": \"MappingSetReference\",\n      \"recommended\": true,\n      \"multivalued\": true,\n      \"inlined\": true,\n      \"inlined_as_list\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_registry_id\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_registry_id\",\n      \"description\": \"The unique identifier of a mapping registry.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/mapping_registry_id\",\n      \"owner\": \"MappingRegistry\",\n      \"domain_of\": [\n        \"MappingRegistry\"\n      ],\n      \"range\": \"EntityReference\",\n      \"required\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_registry_title\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_registry_title\",\n      \"description\": \"The title of a mapping registry.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/mapping_registry_title\",\n      \"owner\": \"MappingRegistry\",\n      \"domain_of\": [\n        \"MappingRegistry\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_registry_description\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_registry_description\",\n      \"description\": \"The description of a mapping registry.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/mapping_registry_description\",\n      \"owner\": \"MappingRegistry\",\n      \"domain_of\": [\n        \"MappingRegistry\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"imports\",\n      \"definition_uri\": \"https://w3id.org/sssom/imports\",\n      \"description\": \"A list of registries that should be imported into this one.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/imports\",\n      \"owner\": \"MappingRegistry\",\n      \"domain_of\": [\n        \"MappingRegistry\"\n      ],\n      \"range\": \"NonRelativeURI\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"documentation\",\n      \"definition_uri\": \"https://w3id.org/sssom/documentation\",\n      \"description\": \"A URL to the documentation of this mapping commons.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/documentation\",\n      \"owner\": \"MappingRegistry\",\n      \"domain_of\": [\n        \"MappingRegistry\"\n      ],\n      \"range\": \"NonRelativeURI\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"homepage\",\n      \"definition_uri\": \"https://w3id.org/sssom/homepage\",\n      \"description\": \"A URL to a homepage of this mapping commons.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/homepage\",\n      \"owner\": \"MappingRegistry\",\n      \"domain_of\": [\n        \"MappingRegistry\"\n      ],\n      \"range\": \"NonRelativeURI\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mappings\",\n      \"definition_uri\": \"https://w3id.org/sssom/mappings\",\n      \"description\": \"Contains a list of mapping objects.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/mappings\",\n      \"owner\": \"MappingSet\",\n      \"domain_of\": [\n        \"MappingSet\"\n      ],\n      \"range\": \"Mapping\",\n      \"recommended\": true,\n      \"multivalued\": true,\n      \"inlined\": true,\n      \"inlined_as_list\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"subject_id\",\n      \"definition_uri\": \"https://w3id.org/sssom/subject_id\",\n      \"description\": \"The ID of the subject of the mapping.\",\n      \"examples\": [\n        {\n          \"value\": \"HP:0009894\",\n          \"description\": \"The CURIE denoting the Human Phenotype Ontology concept of 'Thickened ears'\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"http://www.w3.org/2002/07/owl#annotatedSource\",\n        \"http://www.w3.org/2002/07/owl#annotatedSource\"\n      ],\n      \"slot_uri\": \"http://www.w3.org/2002/07/owl#annotatedSource\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"subject_label\",\n      \"definition_uri\": \"https://w3id.org/sssom/subject_label\",\n      \"description\": \"The label of subject of the mapping.\",\n      \"examples\": [\n        {\n          \"value\": \"Thickened ears\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/subject_label\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"recommended\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"subject_category\",\n      \"definition_uri\": \"https://w3id.org/sssom/subject_category\",\n      \"description\": \"The conceptual category to which the subject belongs to. This can be a string denoting the category or a term from a controlled vocabulary. This slot is deliberately underspecified. Conceptual categories can range from those that are found in general upper ontologies such as BFO (e.g. process, temporal region, etc) to those that serve as upper ontologies in specific domains, such as COB or BioLink (e.g. gene, disease, chemical entity). The purpose of this optional field is documentation for human reviewers - when a category is known and documented clearly, the cost of interpreting and evaluating the mapping decreases.\",\n      \"examples\": [\n        {\n          \"value\": \"UBERON:0001062\",\n          \"description\": \"The CURIE of the Uberon term for \\\"anatomical entity\\\".\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"anatomical entity\",\n          \"description\": \"A string, rather than ID, describing the \\\"anatomical entity\\\" category. This is possible, but less preferred than using an ID.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"biolink:Gene\",\n          \"description\": \"The CURIE of the biolink class for genes.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/13\",\n        \"https://github.com/mapping-commons/sssom/issues/256\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/subject_category\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"subject_type\",\n      \"definition_uri\": \"https://w3id.org/sssom/subject_type\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"The type of entity that is being mapped.\",\n      \"examples\": [\n        {\n          \"value\": \"owl:Class\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/subject_type\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"entity_type_enum\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"predicate_id\",\n      \"definition_uri\": \"https://w3id.org/sssom/predicate_id\",\n      \"description\": \"The ID of the predicate or relation that relates the subject and object of this match.\",\n      \"examples\": [\n        {\n          \"value\": \"owl:sameAs\",\n          \"description\": \"The subject and the object are instances (owl individuals), and the two instances are the same.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"owl:equivalentClass\",\n          \"description\": \"The subject and the object are classes (owl class), and the two classes are the same.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"owl:equivalentProperty\",\n          \"description\": \"The subject and the object are properties (owl object, data, annotation properties), and the two properties are the same.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"rdfs:subClassOf\",\n          \"description\": \"The subject and the object are classes (owl class), and the subject is a subclass of the object.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"rdfs:subPropertyOf\",\n          \"description\": \"The subject and the object are properties (owl object, data, annotation properties), and the subject is a subproperty of the object.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"skos:relatedMatch\",\n          \"description\": \"The subject and the object are associated in some unspecified way.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"skos:closeMatch\",\n          \"description\": \"The subject and the object are sufficiently similar that they can be used interchangeably in some information retrieval applications.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"skos:exactMatch\",\n          \"description\": \"The subject and the object can, with a high degree of confidence, be used interchangeably across a wide range of information retrieval applications.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"skos:narrowMatch\",\n          \"description\": \"From the SKOS primer: A triple skos:narrower (and skos:narrowMatch) asserts that , the object of the triple, is a narrower concept than , the subject of the triple.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"skos:broadMatch\",\n          \"description\": \"From the SKOS primer: A triple skos:broader (and skos:broadMatch) asserts that , the object of the triple, is a broader concept than , the subject of the triple.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"oboInOwl:hasDbXref\",\n          \"description\": \"Two terms are related in some way. The meaning is frequently consistent across a single set of mappings. Note this property is often overloaded even where the terms are of a different nature (e.g. interpro2go).\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"rdfs:seeAlso\",\n          \"description\": \"The subject and the object are associated in some unspecified way. The object IRI often resolves to a resource on the web that provides additional information.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"http://www.w3.org/2002/07/owl#annotatedProperty\",\n        \"http://www.w3.org/2002/07/owl#annotatedProperty\"\n      ],\n      \"slot_uri\": \"http://www.w3.org/2002/07/owl#annotatedProperty\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"required\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"predicate_modifier\",\n      \"definition_uri\": \"https://w3id.org/sssom/predicate_modifier\",\n      \"description\": \"A modifier for negating the predicate. See https://github.com/mapping-commons/sssom/issues/40 for discussion\",\n      \"examples\": [\n        {\n          \"value\": \"Not\",\n          \"description\": \"Negates the predicate, see documentation of predicate_modifier_enum\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/107\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/predicate_modifier\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"predicate_modifier_enum\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"predicate_label\",\n      \"definition_uri\": \"https://w3id.org/sssom/predicate_label\",\n      \"description\": \"The label of the predicate/relation of the mapping.\",\n      \"examples\": [\n        {\n          \"value\": \"has cross-reference\",\n          \"description\": \"The label of the oboInOwl:hasDbXref property to represent cross-references.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/predicate_label\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"predicate_type\",\n      \"definition_uri\": \"https://w3id.org/sssom/predicate_type\",\n      \"instantiates\": [\n        \"sssom:Propagatable\",\n        \"sssom:Versionable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        },\n        {\n          \"tag\": \"added_in\",\n          \"value\": \"1.1\",\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"The type of the predicate used to map the subject and object entities.\",\n      \"examples\": [\n        {\n          \"value\": \"owl:AnnotationProperty\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"owl:ObjectProperty\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/143\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/predicate-types.sssom.tsv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/predicate_type\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"entity_type_enum\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"object_id\",\n      \"definition_uri\": \"https://w3id.org/sssom/object_id\",\n      \"description\": \"The ID of the object of the mapping.\",\n      \"examples\": [\n        {\n          \"value\": \"HP:0009894\",\n          \"description\": \"The CURIE denoting the Human Phenotype Ontology concept of 'Thickened ears'.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"http://www.w3.org/2002/07/owl#annotatedTarget\",\n        \"http://www.w3.org/2002/07/owl#annotatedTarget\"\n      ],\n      \"slot_uri\": \"http://www.w3.org/2002/07/owl#annotatedTarget\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"object_label\",\n      \"definition_uri\": \"https://w3id.org/sssom/object_label\",\n      \"description\": \"The label of object of the mapping.\",\n      \"examples\": [\n        {\n          \"value\": \"Thickened ears\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/object_label\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"recommended\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"object_category\",\n      \"definition_uri\": \"https://w3id.org/sssom/object_category\",\n      \"description\": \"The conceptual category to which the subject belongs to. This can be a string denoting the category or a term from a controlled vocabulary. This slot is deliberately underspecified. Conceptual categories can range from those that are found in general upper ontologies such as BFO (e.g. process, temporal region, etc) to those that serve as upper ontologies in specific domains, such as COB or BioLink (e.g. gene, disease, chemical entity). The purpose of this optional field is documentation for human reviewers - when a category is known and documented clearly, the cost of interpreting and evaluating the mapping decreases.\",\n      \"examples\": [\n        {\n          \"value\": \"UBERON:0001062\",\n          \"description\": \"The CURIE of the Uberon term for \\\"anatomical entity\\\".\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"anatomical entity\",\n          \"description\": \"A string, rather than ID, describing the \\\"anatomical entity\\\" category. This is possible, but less preferred than using an ID.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"biolink:Gene\",\n          \"description\": \"The CURIE of the biolink class for genes.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/13\",\n        \"https://github.com/mapping-commons/sssom/issues/256\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/object_category\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_justification\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_justification\",\n      \"description\": \"A mapping justification is an action (or the written representation of that action) of showing a mapping to be right or reasonable.\",\n      \"examples\": [\n        {\n          \"value\": \"semapv:LexicalMatching\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"semapv:ManualMappingCuration\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://mapping-commons.github.io/semantic-mapping-vocabulary/\",\n        \"https://www.ebi.ac.uk/ols4/ontologies/semapv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/mapping_justification\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"required\": true,\n      \"pattern\": \"^semapv:(MappingReview|ManualMappingCuration|LogicalReasoning|LexicalMatching|CompositeMatching|UnspecifiedMatching|SemanticSimilarityThresholdMatching|LexicalSimilarityThresholdMatching|MappingChaining|MappingInversion|StructuralMatching|InstanceBasedMatching|BackgroundKnowledgeBasedMatching)$\",\n      \"any_of\": [\n        {\n          \"equals_string\": \"semapv:LexicalMatching\",\n          \"@type\": \"AnonymousSlotExpression\"\n        },\n        {\n          \"equals_string\": \"semapv:LogicalReasoning\",\n          \"@type\": \"AnonymousSlotExpression\"\n        },\n        {\n          \"equals_string\": \"semapv:CompositeMatching\",\n          \"@type\": \"AnonymousSlotExpression\"\n        },\n        {\n          \"equals_string\": \"semapv:UnspecifiedMatching\",\n          \"@type\": \"AnonymousSlotExpression\"\n        },\n        {\n          \"equals_string\": \"semapv:SemanticSimilarityThresholdMatching\",\n          \"@type\": \"AnonymousSlotExpression\"\n        },\n        {\n          \"equals_string\": \"semapv:LexicalSimilarityThresholdMatching\",\n          \"@type\": \"AnonymousSlotExpression\"\n        },\n        {\n          \"equals_string\": \"semapv:MappingChaining\",\n          \"@type\": \"AnonymousSlotExpression\"\n        },\n        {\n          \"equals_string\": \"semapv:MappingReview\",\n          \"@type\": \"AnonymousSlotExpression\"\n        },\n        {\n          \"equals_string\": \"semapv:ManualMappingCuration\",\n          \"@type\": \"AnonymousSlotExpression\"\n        },\n        {\n          \"equals_string\": \"semapv:MappingInversion\",\n          \"@type\": \"AnonymousSlotExpression\"\n        },\n        {\n          \"equals_string\": \"semapv:StructuralMatching\",\n          \"@type\": \"AnonymousSlotExpression\"\n        },\n        {\n          \"equals_string\": \"semapv:InstanceBasedMatching\",\n          \"@type\": \"AnonymousSlotExpression\"\n        },\n        {\n          \"equals_string\": \"semapv:BackgroundKnowledgeBasedMatching\",\n          \"@type\": \"AnonymousSlotExpression\"\n        }\n      ],\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"object_type\",\n      \"definition_uri\": \"https://w3id.org/sssom/object_type\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"The type of entity that is being mapped.\",\n      \"examples\": [\n        {\n          \"value\": \"owl:Class\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/object_type\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"entity_type_enum\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_set_id\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_set_id\",\n      \"description\": \"A globally unique identifier for the mapping set (not each individual mapping). Should ideally be resolvable.\",\n      \"examples\": [\n        {\n          \"value\": \"http://purl.obolibrary.org/obo/mondo/mappings/mondo_exactmatch_ncit.sssom.tsv\",\n          \"description\": \"A persistent URI pointing to the latest version of the Mondo - NCIT mapping in the Mondo namespace.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/mapping_set_id\",\n      \"owner\": \"MappingSetReference\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"MappingSetReference\"\n      ],\n      \"range\": \"NonRelativeURI\",\n      \"required\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_set_version\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_set_version\",\n      \"description\": \"A version string for the mapping.\",\n      \"examples\": [\n        {\n          \"value\": \"2020-01-01\",\n          \"description\": \"A date-based version that indicates that the mapping was published on the 1st January in 2021.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"1.2.1\",\n          \"description\": \"(A semantic version tag that indicates that this is the 1st major, 2nd minor version, patch 1 (https://semver.org/).)\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"http://www.w3.org/2002/07/owl#versionInfo\"\n      ],\n      \"slot_uri\": \"http://www.w3.org/2002/07/owl#versionInfo\",\n      \"owner\": \"MappingSet\",\n      \"domain_of\": [\n        \"MappingSet\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_set_group\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_set_group\",\n      \"description\": \"Set by the owners of the mapping registry. A way to group related mapping sets for example for UI purposes.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/mapping_set_group\",\n      \"owner\": \"MappingSetReference\",\n      \"domain_of\": [\n        \"MappingSetReference\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_set_title\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_set_title\",\n      \"description\": \"The display name of a mapping set.\",\n      \"examples\": [\n        {\n          \"value\": \"The Mondo-OMIM mappings by Monarch Initiative.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"http://purl.org/dc/terms/title\"\n      ],\n      \"slot_uri\": \"http://purl.org/dc/terms/title\",\n      \"owner\": \"MappingSet\",\n      \"domain_of\": [\n        \"MappingSet\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_set_description\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_set_description\",\n      \"description\": \"A description of the mapping set.\",\n      \"examples\": [\n        {\n          \"value\": \"This mapping set was produced to integrate human and mouse phenotype data at the IMPC. It is primarily used for making mouse phenotypes searchable by human synonyms at https://mousephenotype.org/.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"http://purl.org/dc/terms/description\"\n      ],\n      \"slot_uri\": \"http://purl.org/dc/terms/description\",\n      \"owner\": \"MappingSet\",\n      \"domain_of\": [\n        \"MappingSet\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_set_confidence\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_set_confidence\",\n      \"instantiates\": [\n        \"sssom:Versionable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"added_in\",\n          \"value\": \"1.1\",\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"Mapping-set level confidence is assigned by the creator of the mapping set to indicate their overall confidence in the correctness (i.e., precision) of mappings in the mapping set. Mapping set confidence is intended to be used in cases were the creator wants to express an overall confidence into the agent that curated the individual mappings, for example a lexical matching tool, or a group of students.\\nWhen not explicitly specified, confidence estimation algorithms should consider the mapping set confidence to be 1.0 by default.\",\n      \"examples\": [\n        {\n          \"value\": \"0.95\",\n          \"description\": \"A confidence score of 0.95, indicating 95% confidence that the mappings in the mapping set are correct.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://mapping-commons.github.io/sssom/confidence-model\",\n        \"https://github.com/mapping-commons/sssom/issues/438\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/mapping_set_confidence.sssom.tsv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/mapping_set_confidence\",\n      \"owner\": \"MappingSet\",\n      \"domain_of\": [\n        \"MappingSet\"\n      ],\n      \"range\": \"double\",\n      \"minimum_value\": 0.0,\n      \"maximum_value\": 1.0,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"creator_id\",\n      \"definition_uri\": \"https://w3id.org/sssom/creator_id\",\n      \"description\": \"Identifies the persons or groups responsible for the creation of the mapping. The creator is the agent that put the mapping in its published form, which may be different from the author, which is a person that was actively involved in the assertion of the mapping. Recommended to be a list of ORCIDs or otherwise identifying URIs.\",\n      \"examples\": [\n        {\n          \"value\": \"orcid:0000-0002-7356-1779|orcid:0000-0002-6601-2165\",\n          \"description\": \"The ORCID of the (multiple) creators of the mapping. Note that this is how the example would look like specifically in the SSSOM/TSV format, where multivalued slots such as `creator_id` are represented as single strings containing `|`-separated values.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"orcid:0000-0002-7356-1779\",\n          \"description\": \"The ORCID of the creator of the mapping.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"http://purl.org/dc/terms/creator\"\n      ],\n      \"slot_uri\": \"http://purl.org/dc/terms/creator\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"creator_label\",\n      \"definition_uri\": \"https://w3id.org/sssom/creator_label\",\n      \"description\": \"A string representing the creator of this mapping. This should only be used in the absence of a proper semantic identifier (which would be stored in creator_id) for that creator. It is not expected that there should be any link between creator_id and creator_label; in particular, creator_label is not intended to provide a human-friendly version of an identifier in creator_id.\",\n      \"examples\": [\n        {\n          \"value\": \"Nicolas Matentzoglu|Chris Mungall\",\n          \"description\": \"The human-readable names of the (multiple) creators of the mapping. Note that this is how the example would look like specifically in the SSSOM/TSV format, where multivalued slots such as `creator_label` are represented as single strings containing `|`-separated values.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"Nicolas Matentzoglu\",\n          \"description\": \"The human-readable name of the creator of the mapping.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/creator_label\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"author_id\",\n      \"definition_uri\": \"https://w3id.org/sssom/author_id\",\n      \"description\": \"Identifies the persons or groups responsible for asserting the mappings. Recommended to be a list of ORCIDs or otherwise identifying URIs.\",\n      \"examples\": [\n        {\n          \"value\": \"orcid:0000-0002-7356-1779|orcid:0000-0002-6601-2165\",\n          \"description\": \"The ORCID of the (multiple) authors of the mapping. Note that this is how the example would look like specifically in the SSSOM/TSV format, where multivalued slots such as `author_id` are represented as single strings containing `|`-separated values.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"orcid:0000-0002-7356-1779\",\n          \"description\": \"The ORCID of the author of the mapping.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"http://purl.org/pav/authoredBy\"\n      ],\n      \"slot_uri\": \"http://purl.org/pav/authoredBy\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"author_label\",\n      \"definition_uri\": \"https://w3id.org/sssom/author_label\",\n      \"description\": \"A string representing the author of this mapping. This should only be used in the absence of a proper semantic identifier (which would be stored in author_id) for that author. It is not expected that there should be any link between author_id and author_label; in particular, author_label is not intended to provide a human-friendly version of an identifier in author_id.\",\n      \"examples\": [\n        {\n          \"value\": \"Nicolas Matentzoglu|Chris Mungall\",\n          \"description\": \"The human-readable names of the (multiple) authors of the mapping. Note that this is how the example would look like specifically in the SSSOM/TSV format, where multivalued slots such as `author_label` are represented as single strings containing `|`-separated values.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"Nicolas Matentzoglu\",\n          \"description\": \"The human-readable name of the author of the mapping.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/author_label\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"reviewer_id\",\n      \"definition_uri\": \"https://w3id.org/sssom/reviewer_id\",\n      \"description\": \"Identifies the persons or groups that reviewed and confirmed the mapping. Recommended to be a list of ORCIDs or otherwise identifying URIs.\",\n      \"examples\": [\n        {\n          \"value\": \"orcid:0000-0002-7356-1779|orcid:0000-0002-6601-2165\",\n          \"description\": \"The ORCID of the (multiple) reviewers of the mapping. Note that this is how the example would look like specifically in the SSSOM/TSV format, where multivalued slots such as `reviewer_id` are represented as single strings containing `|`-separated values.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"orcid:0000-0002-7356-1779\",\n          \"description\": \"The ORCID of the reviewer of the mapping.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/reviewer_id\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"reviewer_label\",\n      \"definition_uri\": \"https://w3id.org/sssom/reviewer_label\",\n      \"description\": \"A string representing the reviewer of this mapping. This should only be used in the absence of a proper semantic identifier (which would be stored in reviewer_id) for that reviewer. It is not expected that there should be any link between reviewer_id and reviewer_label; in particular, reviewer_label is not intended to provide a human-friendly version of an identifier in reviewer_id.\",\n      \"examples\": [\n        {\n          \"value\": \"Nicolas Matentzoglu|Chris Mungall\",\n          \"description\": \"The human-readable names of the (multiple) reviewers of the mapping. Note that this is how the example would look like specifically in the SSSOM/TSV format, where multivalued slots such as `reviewer_label` are represented as single strings containing `|`-separated values.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"Nicolas Matentzoglu\",\n          \"description\": \"The human-readable name of the reviewer of the mapping.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/reviewer_label\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"license\",\n      \"definition_uri\": \"https://w3id.org/sssom/license\",\n      \"description\": \"A url to the license of the mapping. In absence of a license we assume no license.\",\n      \"examples\": [\n        {\n          \"value\": \"https://creativecommons.org/licenses/by/4.0/\",\n          \"description\": \"The URI of the Creative Commons Attribution 4.0 International license.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"http://purl.org/dc/terms/license\"\n      ],\n      \"slot_uri\": \"http://purl.org/dc/terms/license\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"NonRelativeURI\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"subject_source\",\n      \"definition_uri\": \"https://w3id.org/sssom/subject_source\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"URI of vocabulary or identifier source for the subject.\",\n      \"examples\": [\n        {\n          \"value\": \"obo:mondo.owl\",\n          \"description\": \"A persistent OBO CURIE pointing to the latest version of the Mondo ontology.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"wikidata:Q7876491\",\n          \"description\": \"A Wikidata identifier for the Uberon ontology resource.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/subject_source\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"subject_source_version\",\n      \"definition_uri\": \"https://w3id.org/sssom/subject_source_version\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"Version IRI or version string of the source of the subject term.\",\n      \"examples\": [\n        {\n          \"value\": \"http://purl.obolibrary.org/obo/mondo/releases/2021-01-30/mondo.owl\",\n          \"description\": \"A persistent Version IRI pointing to the Mondo version '2021-01-30'\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/subject_source_version\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"object_source\",\n      \"definition_uri\": \"https://w3id.org/sssom/object_source\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"URI of vocabulary or identifier source for the object.\",\n      \"examples\": [\n        {\n          \"value\": \"obo:mondo.owl\",\n          \"description\": \"A persistent OBO CURIE pointing to the latest version of the Mondo ontology.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"wikidata:Q7876491\",\n          \"description\": \"A Wikidata identifier for the Uberon ontology resource.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/object_source\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"object_source_version\",\n      \"definition_uri\": \"https://w3id.org/sssom/object_source_version\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"Version IRI or version string of the source of the object term.\",\n      \"examples\": [\n        {\n          \"value\": \"http://purl.obolibrary.org/obo/mondo/releases/2021-01-30/mondo.owl\",\n          \"description\": \"A persistent Version IRI pointing to the Mondo version '2021-01-30'\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/object_source_version\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_provider\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_provider\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"URL pointing to the source that provided the mapping, for example an ontology that already contains the mappings, or a database from which it was derived.\",\n      \"examples\": [\n        {\n          \"value\": \"https://www.ohdsi.org/\",\n          \"description\": \"A URL pointing to the Observational Health Data Sciences and Informatics initiative.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"https://monarchinitiative.org/\",\n          \"description\": \"A URL pointing to the Monarch Initiative Resource.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/mapping_provider\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"NonRelativeURI\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_set_source\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_set_source\",\n      \"description\": \"A mapping set or set of mapping set that was used to derive the mapping set.\",\n      \"examples\": [\n        {\n          \"value\": \"http://purl.obolibrary.org/obo/mondo/mappings/2022-05-20/mondo_exactmatch_ncit.sssom.tsv\",\n          \"description\": \"A persistent, ideally versioned, link to the mapping set from which the current mapping set is derived.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"http://www.w3.org/ns/prov#wasDerivedFrom\"\n      ],\n      \"slot_uri\": \"http://www.w3.org/ns/prov#wasDerivedFrom\",\n      \"owner\": \"MappingSet\",\n      \"domain_of\": [\n        \"MappingSet\"\n      ],\n      \"range\": \"NonRelativeURI\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_source\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_source\",\n      \"description\": \"The mapping set this mapping was originally defined in. mapping_source is used for example when merging multiple mapping sets or deriving one mapping set from another.\",\n      \"examples\": [\n        {\n          \"value\": \"MONDO_MAPPINGS:mondo_exactmatch_ncit.sssom.tsv\",\n          \"description\": \"A reference to the mapping set that originally contained this mapping.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/mapping_source\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_cardinality\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_cardinality\",\n      \"description\": \"A value indicating whether the subject (respectively object) of this mapping record is present in other records involving a different object (respectively subject), within the subset of records defined by the cardinality_scope slot (or within the entire mapping set if cardinality_scope is undefined). Note that this is a convenience field, whose values can always be derived from the mapping set.\",\n      \"examples\": [\n        {\n          \"value\": \"1:1\",\n          \"description\": \"A one-to-one mapping. There are no other records in which the same subject is mapped to a different object, and no other records in which the same object is mapped to a different subject.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"1:n\",\n          \"description\": \"A one-to-many mapping. There are other records in which the same subject is mapped to at least one different object than the object present in this record; there are no other records in which the object is mapped to a different subject.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/cardinality.sssom.tsv\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/cardinality-with-unmapped-entities.sssom.tsv\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/cardinality-scope-empty.sssom.tsv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/mapping_cardinality\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"mapping_cardinality_enum\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"cardinality_scope\",\n      \"definition_uri\": \"https://w3id.org/sssom/cardinality_scope\",\n      \"instantiates\": [\n        \"sssom:Propagatable\",\n        \"sssom:Versionable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        },\n        {\n          \"tag\": \"added_in\",\n          \"value\": \"1.1\",\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"A list of mapping slots that define the scope for the value found in the mapping_cardinality slot. Mappings are considered to belong to the same scope if they have the same value for all slots listed in the scope. If no scope is defined, the default scope is empty, meaning that all mappings belong to a single scope that is identical to the entire mapping set. The behaviour if a value in the list does not correspond to a valid slot name is undefined.\",\n      \"examples\": [\n        {\n          \"value\": \"predicate_id\",\n          \"description\": \"Indicates that mapping_cardinality is computed relatively to all mappings that have the same predicate.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"predicate_id|object_source\",\n          \"description\": \"Indicates that mapping_cardinality is computed relatively to all mappings that have the same predicate and the same object source. Note that this is how the example would look like specifically in the SSSOM/TSV format, where multivalued slots like `cardinality_scope` are represented as a single string containing `|`-separated values.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/467\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/cardinality-scope-predicate.sssom.tsv\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/cardinality-scope-predicate+object_source.sssom.tsv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/cardinality_scope\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_tool\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_tool\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"A reference to the tool or algorithm that was used to generate the mapping. Should be a URL pointing to more info about it, but can be free text. Consider using the mapping_tool_id slot for a more standardised reference.\",\n      \"examples\": [\n        {\n          \"value\": \"https://github.com/AgreementMakerLight/AML-Project\",\n          \"description\": \"A URL pointing to the AgreementMakerLight project.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"AgreementMakerLight\",\n          \"description\": \"A string (name) denoting the AgreementMakerLight project.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/mapping_tool\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_tool_id\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_tool_id\",\n      \"instantiates\": [\n        \"sssom:Propagatable\",\n        \"sssom:Versionable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        },\n        {\n          \"tag\": \"added_in\",\n          \"value\": \"1.1\",\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"The ID (entity reference) of the tool or algorithm that was used to generate the mapping.\",\n      \"examples\": [\n        {\n          \"value\": \"wikidata:Q58057366\",\n          \"description\": \"A wikidata PURL identifying the AgreementMakerLight project.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/mapping_tool_id.sssom.tsv\",\n        \"https://github.com/mapping-commons/sssom/issues/449\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/mapping_tool_id\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_tool_version\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_tool_version\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"Version string that denotes the version of the mapping tool used.\",\n      \"examples\": [\n        {\n          \"value\": \"v3.2\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/mapping_tool_version\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_date\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_date\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"The date the mapping was asserted. This is different from the date the mapping was published or compiled in a SSSOM file.\",\n      \"examples\": [\n        {\n          \"value\": \"2021-01-01\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"http://purl.org/dc/terms/created\"\n      ],\n      \"slot_uri\": \"http://purl.org/dc/terms/created\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"date\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"publication_date\",\n      \"definition_uri\": \"https://w3id.org/sssom/publication_date\",\n      \"description\": \"The date the mapping was published. This is different from the date the mapping was asserted.\",\n      \"examples\": [\n        {\n          \"value\": \"2021-01-01\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"http://purl.org/dc/terms/issued\"\n      ],\n      \"slot_uri\": \"http://purl.org/dc/terms/issued\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"date\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"review_date\",\n      \"definition_uri\": \"https://w3id.org/sssom/review_date\",\n      \"instantiates\": [\n        \"sssom:Versionable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"added_in\",\n          \"value\": \"1.1\",\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"The date the mapping was reviewed. This is different from the date the mapping was asserted and published. If this field is used in a mapping, reviewer_id and/or reviewer_label MUST also be be set.\",\n      \"examples\": [\n        {\n          \"value\": \"2021-01-01\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/511\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/review_date.sssom.tsv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/review_date\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"date\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"confidence\",\n      \"definition_uri\": \"https://w3id.org/sssom/confidence\",\n      \"description\": \"A value assigned by the creator of the mapping to denote the creator's confidence or estimated probability that the mapping record is correct. A value of 1.0 means the creator has full confidence in the correctness of the mapping record, while a value of 0.0 means the creator is fully unsure whether the mapping record is correct or not.\\nWhen not explicitly specified, confidence estimation algorithms should consider the mapping confidence to be 1.0 by default.\",\n      \"examples\": [\n        {\n          \"value\": \"0.95\",\n          \"description\": \"A confidence score of 0.95, indicating 95% confidence.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://mapping-commons.github.io/sssom/confidence-model\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/confidence\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"double\",\n      \"minimum_value\": 0.0,\n      \"maximum_value\": 1.0,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"reviewer_agreement\",\n      \"definition_uri\": \"https://w3id.org/sssom/reviewer_agreement\",\n      \"instantiates\": [\n        \"sssom:Versionable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"added_in\",\n          \"value\": \"1.1\",\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"A value assigned by the reviewer of the mapping to denote their confidence that the mapping record is correct. A value of 1.0 means the reviewer fully agrees with the mapping record. A value of -1.0 means the reviewer fully disagrees with the mapping record. A value of 0.0 means the reviewer is not sure whether the mapping record is correct or not.\\nWhen not explicitly specified, confidence estimation algorithms should consider the reviewer agreement to be 1.0 by default.\",\n      \"examples\": [\n        {\n          \"value\": \"1.0\",\n          \"description\": \"A reviewer agreement of 1.0 denotes that the reviewer considers the mapping record to be correct with full confidence\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"-1.0\",\n          \"description\": \"A reviewer agreement of -1.0 denotes that the reviewer considers the mapping record to be incorrect with full confidence\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"0.0\",\n          \"description\": \"A reviewer agreement of 0.0 denotes that the reviewer is not sure whether the mapping record is correct or not.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://mapping-commons.github.io/sssom/confidence-model\",\n        \"https://github.com/mapping-commons/sssom/issues/510\",\n        \"https://github.com/mapping-commons/sssom/pull/519\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/reviewer_agreement\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"double\",\n      \"minimum_value\": -1.0,\n      \"maximum_value\": 1.0,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"subject_match_field\",\n      \"definition_uri\": \"https://w3id.org/sssom/subject_match_field\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"A list of properties, annotations or attributes related to the subject that was used to establish the match. This property is recommended for use in conjunction with  mapping justifications related to lexical matching, such as `semapv:LexicalMatching`.  For additional information see the 'See Also' section.\",\n      \"examples\": [\n        {\n          \"value\": \"rdfs:label\",\n          \"description\": \"The RDFS label property (rdfs:label) was used to match the subject.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"skos:prefLabel\",\n          \"description\": \"The SKOS preferred label property (skos:prefLabel) was used to match the subject.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://mapping-commons.github.io/sssom/mapping-justifications/#lexical-matching\",\n        \"https://github.com/mapping-commons/sssom/issues/413\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/subject_match_field\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"object_match_field\",\n      \"definition_uri\": \"https://w3id.org/sssom/object_match_field\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"A list of properties, annotations or attributes related to the object that was used to establish the match. This property is recommended for use in conjunction with  mapping justifications related to lexical matching, such as `semapv:LexicalMatching`.  For additional information see the 'See Also' section.\",\n      \"examples\": [\n        {\n          \"value\": \"rdfs:label\",\n          \"description\": \"The RDFS label property (rdfs:label) was used to match the object.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"skos:prefLabel\",\n          \"description\": \"The SKOS preferred label property (skos:prefLabel) was used to match the object.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://mapping-commons.github.io/sssom/mapping-justifications/#lexical-matching\",\n        \"https://github.com/mapping-commons/sssom/issues/413\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/object_match_field\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"match_string\",\n      \"definition_uri\": \"https://w3id.org/sssom/match_string\",\n      \"description\": \"String that is shared by subj/obj. It is recommended to indicate the fields for the match using the object and subject_match_field slots.\",\n      \"examples\": [\n        {\n          \"value\": \"gala\",\n          \"description\": \"The 'gala' string was matched for both subject and object.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/match_string\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"subject_preprocessing\",\n      \"definition_uri\": \"https://w3id.org/sssom/subject_preprocessing\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"Method of preprocessing applied to the fields of the subject. If different preprocessing steps were performed on different fields, it is recommended to store the match in separate rows.\",\n      \"examples\": [\n        {\n          \"value\": \"semapv:Stemming\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"semapv:StopWordRemoval\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/subject_preprocessing\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"object_preprocessing\",\n      \"definition_uri\": \"https://w3id.org/sssom/object_preprocessing\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"Method of preprocessing applied to the fields of the object. If different preprocessing steps were performed on different fields, it is recommended to store the match in separate rows.\",\n      \"examples\": [\n        {\n          \"value\": \"semapv:Stemming\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"semapv:StopWordRemoval\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/object_preprocessing\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"curation_rule\",\n      \"definition_uri\": \"https://w3id.org/sssom/curation_rule\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"A curation rule is a (potentially) complex condition executed by an agent that led to the establishment of a mapping. Curation rules often involve complex domain-specific considerations, which are hard to capture in an automated fashion. The curation rule is captured as a resource rather than a string, which enables higher levels of transparency and sharing across mapping sets. The URI representation of the curation rule is expected to be a resolvable identifier which provides details about the nature of the curation rule.\",\n      \"examples\": [\n        {\n          \"value\": \"DISEASE_MAPPING_COMMONS_RULES:MPR2\",\n          \"description\": \"A reference to the Disease Mapping Commons rule with the ID MPR2.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/166\",\n        \"https://github.com/mapping-commons/sssom/pull/258\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/curation_rule.sssom.tsv\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/curation_rule-propagated.sssom.tsv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/curation_rule\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"curation_rule_text\",\n      \"definition_uri\": \"https://w3id.org/sssom/curation_rule_text\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"A curation rule is a (potentially) complex condition executed by an agent that led to the establishment of a mapping. Curation rules often involve complex domain-specific considerations, which are hard to capture in an automated fashion. The curation rule should be captured as a resource (entity reference) rather than a string (see curation_rule element), which enables higher levels of transparency and sharing across mapping sets. The textual representation of curation rule is intended to be used in cases where the creation of a resource is not practical from the perspective of the mapping_provider.\",\n      \"examples\": [\n        {\n          \"value\": \"The two phenotypes inhere in homologous structures and exhibit the same phenotypic quality.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"The two diseases are used synonymous in the medical literature.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/166\",\n        \"https://github.com/mapping-commons/sssom/pull/258\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/curation_rule_text.sssom.tsv\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/curation_rule_text-propagated.sssom.tsv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/curation_rule_text\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"similarity_score\",\n      \"definition_uri\": \"https://w3id.org/sssom/similarity_score\",\n      \"description\": \"A score between 0 and 1 to denote the similarity between two entities, where 1 denotes equivalence, and 0 denotes disjointness. The score is meant to be used in conjunction with the similarity_measure field, to document, for example, the lexical or semantic match of a matching algorithm.\",\n      \"examples\": [\n        {\n          \"value\": \"0.95\",\n          \"description\": \"A similarity score of 0.95, indicating 95% similarity.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/385\",\n        \"https://github.com/mapping-commons/sssom/pull/386\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/similarity_score.sssom.tsv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/similarity_score\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"double\",\n      \"minimum_value\": 0.0,\n      \"maximum_value\": 1.0,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"similarity_measure\",\n      \"definition_uri\": \"https://w3id.org/sssom/similarity_measure\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"The measure used for computing a similarity score. This field is meant to be used in conjunction with the similarity_score field, to document, for example, the lexical or semantic match of a matching algorithm. To make processing this field as unambiguous as possible, we recommend using wikidata CURIEs, but the type of this field is deliberately unspecified.\",\n      \"examples\": [\n        {\n          \"value\": \"https://www.wikidata.org/entity/Q865360\",\n          \"description\": \"the Wikidata IRI for the Jaccard index measure).\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"wikidata:Q865360\",\n          \"description\": \"the Wikidata CURIE for the Jaccard index measure).\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"Levenshtein distance\",\n          \"description\": \"a score to measure the distance between two character sequences).\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/385\",\n        \"https://github.com/mapping-commons/sssom/pull/386\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/similarity_score.sssom.tsv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/similarity_measure\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"issue_tracker_item\",\n      \"definition_uri\": \"https://w3id.org/sssom/issue_tracker_item\",\n      \"description\": \"The issue tracker item discussing this mapping.\",\n      \"examples\": [\n        {\n          \"value\": \"SSSOM_GITHUB_ISSUE:166\",\n          \"description\": \"A URL resolving to an issue discussing a new SSSOM element request\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/78\",\n        \"https://github.com/mapping-commons/sssom/pull/259\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/issue_tracker_item.sssom.tsv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/issue_tracker_item\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"issue_tracker\",\n      \"definition_uri\": \"https://w3id.org/sssom/issue_tracker\",\n      \"description\": \"A URL location of the issue tracker for this entity.\",\n      \"examples\": [\n        {\n          \"value\": \"https://github.com/mapping-commons/mh_mapping_initiative/issues\",\n          \"description\": \"A URL resolving to the issue tracker of the Mouse-Human mapping initiative\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/78\",\n        \"https://github.com/mapping-commons/sssom/pull/259\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/issue_tracker.sssom.tsv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/issue_tracker\",\n      \"owner\": \"MappingRegistry\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"MappingRegistry\"\n      ],\n      \"range\": \"NonRelativeURI\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"see_also\",\n      \"definition_uri\": \"https://w3id.org/sssom/see_also\",\n      \"description\": \"A URL specific for the mapping instance. E.g. for kboom we have a per-mapping image that shows surrounding axioms that drive probability. Could also be a github issue URL that discussed a complicated alignment\",\n      \"examples\": [\n        {\n          \"value\": \"https://github.com/mapping-commons/mh_mapping_initiative/pull/41\",\n          \"description\": \"A URL pointing to the pull request that introduced the mapping.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/422\"\n      ],\n      \"mappings\": [\n        \"http://www.w3.org/2000/01/rdf-schema#seeAlso\"\n      ],\n      \"slot_uri\": \"http://www.w3.org/2000/01/rdf-schema#seeAlso\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"NonRelativeURI\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"other\",\n      \"definition_uri\": \"https://w3id.org/sssom/other\",\n      \"description\": \"Pipe separated list of key value pairs for properties not part of the SSSOM spec. Can be used to encode additional provenance data. NOTE. This field is not recommended for general use, and should be used sparingly. See https://github.com/mapping-commons/sssom/blob/master/examples/schema/extension-slots.sssom.tsv for an alternative approach based on extension slots.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/other\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"comment\",\n      \"definition_uri\": \"https://w3id.org/sssom/comment\",\n      \"description\": \"Free text field containing either curator notes or text generated by tool providing additional informative information.\",\n      \"examples\": [\n        {\n          \"value\": \"This mapping is weird in that the hierarchical position of the two terms is very different.\",\n          \"description\": \"A comment explaining a mapping authors reservation on a mapping.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"http://www.w3.org/2000/01/rdf-schema#comment\"\n      ],\n      \"slot_uri\": \"http://www.w3.org/2000/01/rdf-schema#comment\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"extension_definitions\",\n      \"definition_uri\": \"https://w3id.org/sssom/extension_definitions\",\n      \"description\": \"A list that defines the extension slots used in the mapping set.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/328\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/extension-slots.sssom.tsv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/extension_definitions\",\n      \"owner\": \"MappingSet\",\n      \"domain_of\": [\n        \"MappingSet\"\n      ],\n      \"range\": \"ExtensionDefinition\",\n      \"multivalued\": true,\n      \"inlined\": true,\n      \"inlined_as_list\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"record_id\",\n      \"definition_uri\": \"https://w3id.org/sssom/record_id\",\n      \"instantiates\": [\n        \"sssom:Versionable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"added_in\",\n          \"value\": \"1.1\",\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"A unique identifier for a mapping record, that is for an instance of the Mapping class (in the SSSOM/TSV serialisation, this corresponds to an individual row after propagation is applied). This slot is intended to uniquely identify one such record within a mapping set and may for example act as the resource identifier for the record when it is serialised into RDF. This slot MUST NOT be used to \\u201cgroup\\u201d several records together to indicate that they pertain to a single mapping (for example, that they represent different versions of the same mapping), by assigning the same ID to several records. When it is used, every record within a set MUST have a unique, non-empty value. The identifier MUST be a URI; beyond that, its format is unconstrained and the identifier MUST be treated as an opaque string.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/359\",\n        \"https://github.com/mapping-commons/blob/master/examples/schema/record-ids.sssom.tsv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/record_id\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"extensionDefinition__slot_name\",\n      \"description\": \"The name of the extension slot.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/slot_name\",\n      \"alias\": \"slot_name\",\n      \"owner\": \"ExtensionDefinition\",\n      \"domain_of\": [\n        \"ExtensionDefinition\"\n      ],\n      \"range\": \"ncname\",\n      \"required\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"extensionDefinition__property\",\n      \"description\": \"The property associated with the extension slot. It is intended to provide a non-ambiguous meaning to the slot (contrary to the slot_name, which for brevity reasons may be ambiguous).\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/property\",\n      \"alias\": \"property\",\n      \"owner\": \"ExtensionDefinition\",\n      \"domain_of\": [\n        \"ExtensionDefinition\"\n      ],\n      \"range\": \"uriorcurie\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"extensionDefinition__type_hint\",\n      \"description\": \"Expected type of the values of the extension slot.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/type_hint\",\n      \"alias\": \"type_hint\",\n      \"owner\": \"ExtensionDefinition\",\n      \"domain_of\": [\n        \"ExtensionDefinition\"\n      ],\n      \"range\": \"uriorcurie\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"propagatable__propagated\",\n      \"description\": \"Indicates whether a slot can be propagated from a mapping down to individual mappings.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/propagated\",\n      \"alias\": \"propagated\",\n      \"owner\": \"Propagatable\",\n      \"domain_of\": [\n        \"Propagatable\"\n      ],\n      \"range\": \"boolean\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"versionable__added_in\",\n      \"description\": \"The version of the specification in which the slot was added. If not specified, the slot must be assumed to have been added in version 1.0.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/added_in\",\n      \"alias\": \"added_in\",\n      \"owner\": \"Versionable\",\n      \"domain_of\": [\n        \"Versionable\"\n      ],\n      \"range\": \"sssom_version_enum\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_set_license\",\n      \"definition_uri\": \"https://w3id.org/sssom/license\",\n      \"description\": \"A url to the license of the mapping. In absence of a license we assume no license.\",\n      \"examples\": [\n        {\n          \"value\": \"https://creativecommons.org/licenses/by/4.0/\",\n          \"description\": \"The URI of the Creative Commons Attribution 4.0 International license.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"http://purl.org/dc/terms/license\"\n      ],\n      \"is_a\": \"license\",\n      \"domain\": \"MappingSet\",\n      \"slot_uri\": \"http://purl.org/dc/terms/license\",\n      \"alias\": \"license\",\n      \"owner\": \"MappingSet\",\n      \"domain_of\": [\n        \"MappingSet\"\n      ],\n      \"is_usage_slot\": true,\n      \"usage_slot_name\": \"license\",\n      \"range\": \"NonRelativeURI\",\n      \"required\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_set_similarity_measure\",\n      \"definition_uri\": \"https://w3id.org/sssom/similarity_measure\",\n      \"instantiates\": [\n        \"sssom:Versionable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"added_in\",\n          \"value\": \"1.1\",\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"The measure used for computing a similarity score. This field is meant to be used in conjunction with the similarity_score field, to document, for example, the lexical or semantic match of a matching algorithm. To make processing this field as unambiguous as possible, we recommend using wikidata CURIEs, but the type of this field is deliberately unspecified.\",\n      \"examples\": [\n        {\n          \"value\": \"https://www.wikidata.org/entity/Q865360\",\n          \"description\": \"the Wikidata IRI for the Jaccard index measure).\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"wikidata:Q865360\",\n          \"description\": \"the Wikidata CURIE for the Jaccard index measure).\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"Levenshtein distance\",\n          \"description\": \"a score to measure the distance between two character sequences).\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/385\",\n        \"https://github.com/mapping-commons/sssom/pull/386\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/similarity_score.sssom.tsv\"\n      ],\n      \"is_a\": \"similarity_measure\",\n      \"domain\": \"MappingSet\",\n      \"slot_uri\": \"https://w3id.org/sssom/similarity_measure\",\n      \"alias\": \"similarity_measure\",\n      \"owner\": \"MappingSet\",\n      \"domain_of\": [\n        \"MappingSet\"\n      ],\n      \"is_usage_slot\": true,\n      \"usage_slot_name\": \"similarity_measure\",\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_set_curation_rule\",\n      \"definition_uri\": \"https://w3id.org/sssom/curation_rule\",\n      \"instantiates\": [\n        \"sssom:Versionable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"added_in\",\n          \"value\": \"1.1\",\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"A curation rule is a (potentially) complex condition executed by an agent that led to the establishment of a mapping. Curation rules often involve complex domain-specific considerations, which are hard to capture in an automated fashion. The curation rule is captured as a resource rather than a string, which enables higher levels of transparency and sharing across mapping sets. The URI representation of the curation rule is expected to be a resolvable identifier which provides details about the nature of the curation rule.\",\n      \"examples\": [\n        {\n          \"value\": \"DISEASE_MAPPING_COMMONS_RULES:MPR2\",\n          \"description\": \"A reference to the Disease Mapping Commons rule with the ID MPR2.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/166\",\n        \"https://github.com/mapping-commons/sssom/pull/258\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/curation_rule.sssom.tsv\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/curation_rule-propagated.sssom.tsv\"\n      ],\n      \"is_a\": \"curation_rule\",\n      \"domain\": \"MappingSet\",\n      \"slot_uri\": \"https://w3id.org/sssom/curation_rule\",\n      \"alias\": \"curation_rule\",\n      \"owner\": \"MappingSet\",\n      \"domain_of\": [\n        \"MappingSet\"\n      ],\n      \"is_usage_slot\": true,\n      \"usage_slot_name\": \"curation_rule\",\n      \"range\": \"EntityReference\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_set_curation_rule_text\",\n      \"definition_uri\": \"https://w3id.org/sssom/curation_rule_text\",\n      \"instantiates\": [\n        \"sssom:Versionable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"added_in\",\n          \"value\": \"1.1\",\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"A curation rule is a (potentially) complex condition executed by an agent that led to the establishment of a mapping. Curation rules often involve complex domain-specific considerations, which are hard to capture in an automated fashion. The curation rule should be captured as a resource (entity reference) rather than a string (see curation_rule element), which enables higher levels of transparency and sharing across mapping sets. The textual representation of curation rule is intended to be used in cases where the creation of a resource is not practical from the perspective of the mapping_provider.\",\n      \"examples\": [\n        {\n          \"value\": \"The two phenotypes inhere in homologous structures and exhibit the same phenotypic quality.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"The two diseases are used synonymous in the medical literature.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/166\",\n        \"https://github.com/mapping-commons/sssom/pull/258\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/curation_rule_text.sssom.tsv\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/curation_rule_text-propagated.sssom.tsv\"\n      ],\n      \"is_a\": \"curation_rule_text\",\n      \"domain\": \"MappingSet\",\n      \"slot_uri\": \"https://w3id.org/sssom/curation_rule_text\",\n      \"alias\": \"curation_rule_text\",\n      \"owner\": \"MappingSet\",\n      \"domain_of\": [\n        \"MappingSet\"\n      ],\n      \"is_usage_slot\": true,\n      \"usage_slot_name\": \"curation_rule_text\",\n      \"range\": \"string\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    }\n  ],\n  \"classes\": [\n    {\n      \"name\": \"MappingSet\",\n      \"definition_uri\": \"https://w3id.org/sssom/MappingSet\",\n      \"description\": \"Represents a set of mappings.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slots\": [\n        \"sssom_version\",\n        \"curie_map\",\n        \"mappings\",\n        \"mapping_set_id\",\n        \"mapping_set_version\",\n        \"mapping_set_source\",\n        \"mapping_set_title\",\n        \"mapping_set_description\",\n        \"mapping_set_confidence\",\n        \"creator_id\",\n        \"creator_label\",\n        \"mapping_set_license\",\n        \"subject_type\",\n        \"subject_source\",\n        \"subject_source_version\",\n        \"object_type\",\n        \"object_source\",\n        \"object_source_version\",\n        \"predicate_type\",\n        \"mapping_provider\",\n        \"cardinality_scope\",\n        \"mapping_tool\",\n        \"mapping_tool_id\",\n        \"mapping_tool_version\",\n        \"mapping_date\",\n        \"publication_date\",\n        \"subject_match_field\",\n        \"object_match_field\",\n        \"subject_preprocessing\",\n        \"object_preprocessing\",\n        \"mapping_set_similarity_measure\",\n        \"mapping_set_curation_rule\",\n        \"mapping_set_curation_rule_text\",\n        \"see_also\",\n        \"issue_tracker\",\n        \"other\",\n        \"comment\",\n        \"extension_definitions\"\n      ],\n      \"slot_usage\": {},\n      \"class_uri\": \"https://w3id.org/sssom/MappingSet\",\n      \"@type\": \"ClassDefinition\"\n    },\n    {\n      \"name\": \"Mapping\",\n      \"definition_uri\": \"https://w3id.org/sssom/Mapping\",\n      \"description\": \"Represents an individual mapping between a pair of entities.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"owl:Axiom\"\n      ],\n      \"slots\": [\n        \"record_id\",\n        \"subject_id\",\n        \"subject_label\",\n        \"subject_category\",\n        \"predicate_id\",\n        \"predicate_label\",\n        \"predicate_modifier\",\n        \"object_id\",\n        \"object_label\",\n        \"object_category\",\n        \"mapping_justification\",\n        \"author_id\",\n        \"author_label\",\n        \"reviewer_id\",\n        \"reviewer_label\",\n        \"creator_id\",\n        \"creator_label\",\n        \"license\",\n        \"subject_type\",\n        \"subject_source\",\n        \"subject_source_version\",\n        \"object_type\",\n        \"object_source\",\n        \"object_source_version\",\n        \"predicate_type\",\n        \"mapping_provider\",\n        \"mapping_source\",\n        \"mapping_cardinality\",\n        \"cardinality_scope\",\n        \"mapping_tool\",\n        \"mapping_tool_id\",\n        \"mapping_tool_version\",\n        \"mapping_date\",\n        \"publication_date\",\n        \"review_date\",\n        \"confidence\",\n        \"reviewer_agreement\",\n        \"curation_rule\",\n        \"curation_rule_text\",\n        \"subject_match_field\",\n        \"object_match_field\",\n        \"match_string\",\n        \"subject_preprocessing\",\n        \"object_preprocessing\",\n        \"similarity_score\",\n        \"similarity_measure\",\n        \"see_also\",\n        \"issue_tracker_item\",\n        \"other\",\n        \"comment\"\n      ],\n      \"slot_usage\": {},\n      \"class_uri\": \"http://www.w3.org/2002/07/owl#Axiom\",\n      \"unique_keys\": [\n        {\n          \"unique_key_name\": \"record_identifier\",\n          \"unique_key_slots\": [\n            \"record_id\"\n          ],\n          \"description\": \"Each mapping within a mapping set MAY be identified by a unique, opaque record identifier. This slot MUST be used consistently, in that either all mappings in the set have a such a record identifier, or none of them have one. The behaviour when a set contains both mappings with a record identifier and mappings without a record identifier is unspecified. The behaviour when two mappings have the same record identifier is unspecified.\",\n          \"@type\": \"UniqueKey\"\n        }\n      ],\n      \"rules\": [\n        {\n          \"preconditions\": {\n            \"slot_conditions\": [\n              {\n                \"name\": \"subject_type\",\n                \"equals_string\": \"rdfs literal\",\n                \"@type\": \"SlotDefinition\"\n              }\n            ],\n            \"@type\": \"AnonymousClassExpression\"\n          },\n          \"postconditions\": {\n            \"slot_conditions\": [\n              {\n                \"name\": \"subject_label\",\n                \"required\": true,\n                \"@type\": \"SlotDefinition\"\n              }\n            ],\n            \"@type\": \"AnonymousClassExpression\"\n          },\n          \"@type\": \"ClassRule\"\n        },\n        {\n          \"preconditions\": {\n            \"slot_conditions\": [\n              {\n                \"name\": \"subject_type\",\n                \"none_of\": [\n                  {\n                    \"equals_string\": \"rdfs literal\",\n                    \"@type\": \"AnonymousSlotExpression\"\n                  }\n                ],\n                \"@type\": \"SlotDefinition\"\n              }\n            ],\n            \"@type\": \"AnonymousClassExpression\"\n          },\n          \"postconditions\": {\n            \"slot_conditions\": [\n              {\n                \"name\": \"subject_id\",\n                \"required\": true,\n                \"@type\": \"SlotDefinition\"\n              }\n            ],\n            \"@type\": \"AnonymousClassExpression\"\n          },\n          \"@type\": \"ClassRule\"\n        },\n        {\n          \"preconditions\": {\n            \"slot_conditions\": [\n              {\n                \"name\": \"object_type\",\n                \"equals_string\": \"rdfs literal\",\n                \"@type\": \"SlotDefinition\"\n              }\n            ],\n            \"@type\": \"AnonymousClassExpression\"\n          },\n          \"postconditions\": {\n            \"slot_conditions\": [\n              {\n                \"name\": \"object_label\",\n                \"required\": true,\n                \"@type\": \"SlotDefinition\"\n              }\n            ],\n            \"@type\": \"AnonymousClassExpression\"\n          },\n          \"@type\": \"ClassRule\"\n        },\n        {\n          \"preconditions\": {\n            \"slot_conditions\": [\n              {\n                \"name\": \"object_type\",\n                \"none_of\": [\n                  {\n                    \"equals_string\": \"rdfs literal\",\n                    \"@type\": \"AnonymousSlotExpression\"\n                  }\n                ],\n                \"@type\": \"SlotDefinition\"\n              }\n            ],\n            \"@type\": \"AnonymousClassExpression\"\n          },\n          \"postconditions\": {\n            \"slot_conditions\": [\n              {\n                \"name\": \"object_id\",\n                \"required\": true,\n                \"@type\": \"SlotDefinition\"\n              }\n            ],\n            \"@type\": \"AnonymousClassExpression\"\n          },\n          \"@type\": \"ClassRule\"\n        },\n        {\n          \"preconditions\": {\n            \"slot_conditions\": [\n              {\n                \"name\": \"review_date\",\n                \"required\": true,\n                \"@type\": \"SlotDefinition\"\n              }\n            ],\n            \"@type\": \"AnonymousClassExpression\"\n          },\n          \"postconditions\": {\n            \"any_of\": [\n              {\n                \"slot_conditions\": [\n                  {\n                    \"name\": \"reviewer_id\",\n                    \"required\": true,\n                    \"@type\": \"SlotDefinition\"\n                  }\n                ],\n                \"@type\": \"AnonymousClassExpression\"\n              },\n              {\n                \"slot_conditions\": [\n                  {\n                    \"name\": \"reviewer_label\",\n                    \"required\": true,\n                    \"@type\": \"SlotDefinition\"\n                  }\n                ],\n                \"@type\": \"AnonymousClassExpression\"\n              }\n            ],\n            \"@type\": \"AnonymousClassExpression\"\n          },\n          \"description\": \"If a review date is provided, then at at least one of reviewer_id or reviewer_label must also be provided\",\n          \"@type\": \"ClassRule\"\n        },\n        {\n          \"preconditions\": {\n            \"slot_conditions\": [\n              {\n                \"name\": \"reviewer_agreement\",\n                \"required\": true,\n                \"@type\": \"SlotDefinition\"\n              }\n            ],\n            \"@type\": \"AnonymousClassExpression\"\n          },\n          \"postconditions\": {\n            \"any_of\": [\n              {\n                \"slot_conditions\": [\n                  {\n                    \"name\": \"reviewer_id\",\n                    \"required\": true,\n                    \"@type\": \"SlotDefinition\"\n                  }\n                ],\n                \"@type\": \"AnonymousClassExpression\"\n              },\n              {\n                \"slot_conditions\": [\n                  {\n                    \"name\": \"reviewer_label\",\n                    \"required\": true,\n                    \"@type\": \"SlotDefinition\"\n                  }\n                ],\n                \"@type\": \"AnonymousClassExpression\"\n              }\n            ],\n            \"@type\": \"AnonymousClassExpression\"\n          },\n          \"description\": \"If a reviewer agreement value is provided, then at at least one of reviewer_id or reviewer_label must also be provided\",\n          \"@type\": \"ClassRule\"\n        }\n      ],\n      \"@type\": \"ClassDefinition\"\n    },\n    {\n      \"name\": \"MappingRegistry\",\n      \"definition_uri\": \"https://w3id.org/sssom/MappingRegistry\",\n      \"description\": \"A registry for managing mapping sets. It holds a set of mapping set references, and can import other registries.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slots\": [\n        \"mapping_registry_id\",\n        \"mapping_registry_title\",\n        \"mapping_registry_description\",\n        \"imports\",\n        \"mapping_set_references\",\n        \"documentation\",\n        \"homepage\",\n        \"issue_tracker\"\n      ],\n      \"slot_usage\": {},\n      \"class_uri\": \"https://w3id.org/sssom/MappingRegistry\",\n      \"@type\": \"ClassDefinition\"\n    },\n    {\n      \"name\": \"MappingSetReference\",\n      \"definition_uri\": \"https://w3id.org/sssom/MappingSetReference\",\n      \"description\": \"A reference to a mapping set. It allows to augment mapping set metadata from the perspective of the registry, for example, providing confidence, or a local filename or a grouping.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slots\": [\n        \"mapping_set_id\",\n        \"mirror_from\",\n        \"registry_confidence\",\n        \"mapping_set_group\",\n        \"last_updated\",\n        \"local_name\"\n      ],\n      \"slot_usage\": {},\n      \"class_uri\": \"https://w3id.org/sssom/MappingSetReference\",\n      \"@type\": \"ClassDefinition\"\n    },\n    {\n      \"name\": \"Prefix\",\n      \"definition_uri\": \"https://w3id.org/sssom/Prefix\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slots\": [\n        \"prefix_name\",\n        \"prefix_url\"\n      ],\n      \"slot_usage\": {},\n      \"class_uri\": \"https://w3id.org/sssom/Prefix\",\n      \"@type\": \"ClassDefinition\"\n    },\n    {\n      \"name\": \"ExtensionDefinition\",\n      \"definition_uri\": \"https://w3id.org/sssom/ExtensionDefinition\",\n      \"description\": \"A definition of an extension (non-standard) slot.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slots\": [\n        \"extensionDefinition__slot_name\",\n        \"extensionDefinition__property\",\n        \"extensionDefinition__type_hint\"\n      ],\n      \"slot_usage\": {},\n      \"attributes\": [\n        {\n          \"name\": \"slot_name\",\n          \"description\": \"The name of the extension slot.\",\n          \"range\": \"ncname\",\n          \"required\": true,\n          \"@type\": \"SlotDefinition\"\n        },\n        {\n          \"name\": \"property\",\n          \"description\": \"The property associated with the extension slot. It is intended to provide a non-ambiguous meaning to the slot (contrary to the slot_name, which for brevity reasons may be ambiguous).\",\n          \"range\": \"uriorcurie\",\n          \"@type\": \"SlotDefinition\"\n        },\n        {\n          \"name\": \"type_hint\",\n          \"description\": \"Expected type of the values of the extension slot.\",\n          \"range\": \"uriorcurie\",\n          \"@type\": \"SlotDefinition\"\n        }\n      ],\n      \"class_uri\": \"https://w3id.org/sssom/ExtensionDefinition\",\n      \"@type\": \"ClassDefinition\"\n    },\n    {\n      \"name\": \"Propagatable\",\n      \"definition_uri\": \"https://w3id.org/sssom/Propagatable\",\n      \"description\": \"Metamodel extension class to describe slots whose value can be propagated down from the MappingSet class to the Mapping class.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/305\"\n      ],\n      \"mappings\": [\n        \"sssom:Propagatable\"\n      ],\n      \"slots\": [\n        \"propagatable__propagated\"\n      ],\n      \"slot_usage\": {},\n      \"attributes\": [\n        {\n          \"name\": \"propagated\",\n          \"description\": \"Indicates whether a slot can be propagated from a mapping down to individual mappings.\",\n          \"range\": \"boolean\",\n          \"@type\": \"SlotDefinition\"\n        }\n      ],\n      \"class_uri\": \"https://w3id.org/sssom/Propagatable\",\n      \"@type\": \"ClassDefinition\"\n    },\n    {\n      \"name\": \"Versionable\",\n      \"definition_uri\": \"https://w3id.org/sssom/Versionable\",\n      \"description\": \"Metamodel extension class to manage slots that may not exist in all versions of the model.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"sssom:Versionable\"\n      ],\n      \"slots\": [\n        \"versionable__added_in\"\n      ],\n      \"slot_usage\": {},\n      \"attributes\": [\n        {\n          \"name\": \"added_in\",\n          \"description\": \"The version of the specification in which the slot was added. If not specified, the slot must be assumed to have been added in version 1.0.\",\n          \"range\": \"sssom_version_enum\",\n          \"@type\": \"SlotDefinition\"\n        }\n      ],\n      \"class_uri\": \"https://w3id.org/sssom/Versionable\",\n      \"@type\": \"ClassDefinition\"\n    },\n    {\n      \"name\": \"NoTermFound\",\n      \"definition_uri\": \"https://w3id.org/sssom/NoTermFound\",\n      \"description\": \"sssom:NoTermFound can be used in place of a subject_id or object_id when the corresponding entity could not be found. It SHOULD be used in conjunction with a corresponding subject_source or object_source to signify where the term was not found.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/28\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/no_term_found.sssom.tsv\"\n      ],\n      \"mappings\": [\n        \"sssom:NoTermFound\"\n      ],\n      \"slot_usage\": {},\n      \"class_uri\": \"https://w3id.org/sssom/NoTermFound\",\n      \"@type\": \"ClassDefinition\"\n    }\n  ],\n  \"metamodel_version\": \"1.7.0\",\n  \"source_file\": \"sssom_schema.yaml\",\n  \"source_file_date\": \"2026-04-04T08:06:51\",\n  \"source_file_size\": 58930,\n  \"generation_date\": \"2026-04-14T16:00:32\",\n  \"@type\": \"SchemaDefinition\",\n  \"@context\": [\n    \"project/jsonld/sssom_schema.context.jsonld\",\n    \"https://w3id.org/linkml/types.context.jsonld\",\n    {\n      \"@base\": \"https://w3id.org/sssom/\"\n    }\n  ]\n}\n"
  },
  {
    "path": "project/jsonschema/sssom_schema.schema.json",
    "content": "{\n    \"$defs\": {\n        \"EntityTypeEnum\": {\n            \"description\": \"\",\n            \"enum\": [\n                \"owl class\",\n                \"owl object property\",\n                \"owl data property\",\n                \"owl annotation property\",\n                \"owl named individual\",\n                \"skos concept\",\n                \"rdfs resource\",\n                \"rdfs class\",\n                \"rdfs literal\",\n                \"rdfs datatype\",\n                \"rdf property\",\n                \"composed entity expression\"\n            ],\n            \"title\": \"EntityTypeEnum\",\n            \"type\": \"string\"\n        },\n        \"ExtensionDefinition\": {\n            \"additionalProperties\": false,\n            \"description\": \"A definition of an extension (non-standard) slot.\",\n            \"properties\": {\n                \"property\": {\n                    \"description\": \"The property associated with the extension slot. It is intended to provide a non-ambiguous meaning to the slot (contrary to the slot_name, which for brevity reasons may be ambiguous).\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"slot_name\": {\n                    \"description\": \"The name of the extension slot.\",\n                    \"type\": \"string\"\n                },\n                \"type_hint\": {\n                    \"description\": \"Expected type of the values of the extension slot.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                }\n            },\n            \"required\": [\n                \"slot_name\"\n            ],\n            \"title\": \"ExtensionDefinition\",\n            \"type\": \"object\"\n        },\n        \"Mapping\": {\n            \"additionalProperties\": false,\n            \"allOf\": [\n                {\n                    \"if\": {\n                        \"properties\": {\n                            \"subject_type\": {\n                                \"const\": \"rdfs literal\"\n                            }\n                        },\n                        \"required\": [\n                            \"subject_type\"\n                        ]\n                    },\n                    \"then\": {\n                        \"properties\": {\n                            \"subject_label\": {}\n                        },\n                        \"required\": [\n                            \"subject_label\"\n                        ]\n                    }\n                },\n                {\n                    \"if\": {\n                        \"properties\": {\n                            \"subject_type\": {\n                                \"not\": {\n                                    \"anyOf\": [\n                                        {\n                                            \"const\": \"rdfs literal\"\n                                        }\n                                    ]\n                                }\n                            }\n                        },\n                        \"required\": [\n                            \"subject_type\"\n                        ]\n                    },\n                    \"then\": {\n                        \"properties\": {\n                            \"subject_id\": {}\n                        },\n                        \"required\": [\n                            \"subject_id\"\n                        ]\n                    }\n                },\n                {\n                    \"if\": {\n                        \"properties\": {\n                            \"object_type\": {\n                                \"const\": \"rdfs literal\"\n                            }\n                        },\n                        \"required\": [\n                            \"object_type\"\n                        ]\n                    },\n                    \"then\": {\n                        \"properties\": {\n                            \"object_label\": {}\n                        },\n                        \"required\": [\n                            \"object_label\"\n                        ]\n                    }\n                },\n                {\n                    \"if\": {\n                        \"properties\": {\n                            \"object_type\": {\n                                \"not\": {\n                                    \"anyOf\": [\n                                        {\n                                            \"const\": \"rdfs literal\"\n                                        }\n                                    ]\n                                }\n                            }\n                        },\n                        \"required\": [\n                            \"object_type\"\n                        ]\n                    },\n                    \"then\": {\n                        \"properties\": {\n                            \"object_id\": {}\n                        },\n                        \"required\": [\n                            \"object_id\"\n                        ]\n                    }\n                },\n                {\n                    \"if\": {\n                        \"properties\": {\n                            \"review_date\": {}\n                        },\n                        \"required\": [\n                            \"review_date\"\n                        ]\n                    },\n                    \"then\": {\n                        \"anyOf\": [\n                            {\n                                \"properties\": {\n                                    \"reviewer_id\": {}\n                                },\n                                \"required\": [\n                                    \"reviewer_id\"\n                                ]\n                            },\n                            {\n                                \"properties\": {\n                                    \"reviewer_label\": {}\n                                },\n                                \"required\": [\n                                    \"reviewer_label\"\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"if\": {\n                        \"properties\": {\n                            \"reviewer_agreement\": {}\n                        },\n                        \"required\": [\n                            \"reviewer_agreement\"\n                        ]\n                    },\n                    \"then\": {\n                        \"anyOf\": [\n                            {\n                                \"properties\": {\n                                    \"reviewer_id\": {}\n                                },\n                                \"required\": [\n                                    \"reviewer_id\"\n                                ]\n                            },\n                            {\n                                \"properties\": {\n                                    \"reviewer_label\": {}\n                                },\n                                \"required\": [\n                                    \"reviewer_label\"\n                                ]\n                            }\n                        ]\n                    }\n                }\n            ],\n            \"description\": \"Represents an individual mapping between a pair of entities.\",\n            \"properties\": {\n                \"author_id\": {\n                    \"description\": \"Identifies the persons or groups responsible for asserting the mappings. Recommended to be a list of ORCIDs or otherwise identifying URIs.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"type\": [\n                        \"array\",\n                        \"null\"\n                    ]\n                },\n                \"author_label\": {\n                    \"description\": \"A string representing the author of this mapping. This should only be used in the absence of a proper semantic identifier (which would be stored in author_id) for that author. It is not expected that there should be any link between author_id and author_label; in particular, author_label is not intended to provide a human-friendly version of an identifier in author_id.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"type\": [\n                        \"array\",\n                        \"null\"\n                    ]\n                },\n                \"cardinality_scope\": {\n                    \"description\": \"A list of mapping slots that define the scope for the value found in the mapping_cardinality slot. Mappings are considered to belong to the same scope if they have the same value for all slots listed in the scope. If no scope is defined, the default scope is empty, meaning that all mappings belong to a single scope that is identical to the entire mapping set. The behaviour if a value in the list does not correspond to a valid slot name is undefined.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"type\": [\n                        \"array\",\n                        \"null\"\n                    ]\n                },\n                \"comment\": {\n                    \"description\": \"Free text field containing either curator notes or text generated by tool providing additional informative information.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"confidence\": {\n                    \"description\": \"A value assigned by the creator of the mapping to denote the creator's confidence or estimated probability that the mapping record is correct. A value of 1.0 means the creator has full confidence in the correctness of the mapping record, while a value of 0.0 means the creator is fully unsure whether the mapping record is correct or not.\\nWhen not explicitly specified, confidence estimation algorithms should consider the mapping confidence to be 1.0 by default.\",\n                    \"maximum\": 1.0,\n                    \"minimum\": 0.0,\n                    \"type\": [\n                        \"number\",\n                        \"null\"\n                    ]\n                },\n                \"creator_id\": {\n                    \"description\": \"Identifies the persons or groups responsible for the creation of the mapping. The creator is the agent that put the mapping in its published form, which may be different from the author, which is a person that was actively involved in the assertion of the mapping. Recommended to be a list of ORCIDs or otherwise identifying URIs.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"type\": [\n                        \"array\",\n                        \"null\"\n                    ]\n                },\n                \"creator_label\": {\n                    \"description\": \"A string representing the creator of this mapping. This should only be used in the absence of a proper semantic identifier (which would be stored in creator_id) for that creator. It is not expected that there should be any link between creator_id and creator_label; in particular, creator_label is not intended to provide a human-friendly version of an identifier in creator_id.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"type\": [\n                        \"array\",\n                        \"null\"\n                    ]\n                },\n                \"curation_rule\": {\n                    \"description\": \"A curation rule is a (potentially) complex condition executed by an agent that led to the establishment of a mapping. Curation rules often involve complex domain-specific considerations, which are hard to capture in an automated fashion. The curation rule is captured as a resource rather than a string, which enables higher levels of transparency and sharing across mapping sets. The URI representation of the curation rule is expected to be a resolvable identifier which provides details about the nature of the curation rule.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"type\": [\n                        \"array\",\n                        \"null\"\n                    ]\n                },\n                \"curation_rule_text\": {\n                    \"description\": \"A curation rule is a (potentially) complex condition executed by an agent that led to the establishment of a mapping. Curation rules often involve complex domain-specific considerations, which are hard to capture in an automated fashion. The curation rule should be captured as a resource (entity reference) rather than a string (see curation_rule element), which enables higher levels of transparency and sharing across mapping sets. The textual representation of curation rule is intended to be used in cases where the creation of a resource is not practical from the perspective of the mapping_provider.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"type\": [\n                        \"array\",\n                        \"null\"\n                    ]\n                },\n                \"issue_tracker_item\": {\n                    \"description\": \"The issue tracker item discussing this mapping.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"license\": {\n                    \"description\": \"A url to the license of the mapping. In absence of a license we assume no license.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"mapping_cardinality\": {\n                    \"$ref\": \"#/$defs/MappingCardinalityEnum\",\n                    \"description\": \"A value indicating whether the subject (respectively object) of this mapping record is present in other records involving a different object (respectively subject), within the subset of records defined by the cardinality_scope slot (or within the entire mapping set if cardinality_scope is undefined). Note that this is a convenience field, whose values can always be derived from the mapping set.\"\n                },\n                \"mapping_date\": {\n                    \"description\": \"The date the mapping was asserted. This is different from the date the mapping was published or compiled in a SSSOM file.\",\n                    \"format\": \"date\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"mapping_justification\": {\n                    \"anyOf\": [\n                        {\n                            \"const\": \"semapv:LexicalMatching\"\n                        },\n                        {\n                            \"const\": \"semapv:LogicalReasoning\"\n                        },\n                        {\n                            \"const\": \"semapv:CompositeMatching\"\n                        },\n                        {\n                            \"const\": \"semapv:UnspecifiedMatching\"\n                        },\n                        {\n                            \"const\": \"semapv:SemanticSimilarityThresholdMatching\"\n                        },\n                        {\n                            \"const\": \"semapv:LexicalSimilarityThresholdMatching\"\n                        },\n                        {\n                            \"const\": \"semapv:MappingChaining\"\n                        },\n                        {\n                            \"const\": \"semapv:MappingReview\"\n                        },\n                        {\n                            \"const\": \"semapv:ManualMappingCuration\"\n                        },\n                        {\n                            \"const\": \"semapv:MappingInversion\"\n                        },\n                        {\n                            \"const\": \"semapv:StructuralMatching\"\n                        },\n                        {\n                            \"const\": \"semapv:InstanceBasedMatching\"\n                        },\n                        {\n                            \"const\": \"semapv:BackgroundKnowledgeBasedMatching\"\n                        }\n                    ],\n                    \"description\": \"A mapping justification is an action (or the written representation of that action) of showing a mapping to be right or reasonable.\",\n                    \"pattern\": \"^semapv:(MappingReview|ManualMappingCuration|LogicalReasoning|LexicalMatching|CompositeMatching|UnspecifiedMatching|SemanticSimilarityThresholdMatching|LexicalSimilarityThresholdMatching|MappingChaining|MappingInversion|StructuralMatching|InstanceBasedMatching|BackgroundKnowledgeBasedMatching)$\",\n                    \"type\": \"string\"\n                },\n                \"mapping_provider\": {\n                    \"description\": \"URL pointing to the source that provided the mapping, for example an ontology that already contains the mappings, or a database from which it was derived.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"mapping_source\": {\n                    \"description\": \"The mapping set this mapping was originally defined in. mapping_source is used for example when merging multiple mapping sets or deriving one mapping set from another.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"mapping_tool\": {\n                    \"description\": \"A reference to the tool or algorithm that was used to generate the mapping. Should be a URL pointing to more info about it, but can be free text. Consider using the mapping_tool_id slot for a more standardised reference.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"mapping_tool_id\": {\n                    \"description\": \"The ID (entity reference) of the tool or algorithm that was used to generate the mapping.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"mapping_tool_version\": {\n                    \"description\": \"Version string that denotes the version of the mapping tool used.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"match_string\": {\n                    \"description\": \"String that is shared by subj/obj. It is recommended to indicate the fields for the match using the object and subject_match_field slots.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"type\": [\n                        \"array\",\n                        \"null\"\n                    ]\n                },\n                \"object_category\": {\n                    \"description\": \"The conceptual category to which the subject belongs to. This can be a string denoting the category or a term from a controlled vocabulary. This slot is deliberately underspecified. Conceptual categories can range from those that are found in general upper ontologies such as BFO (e.g. process, temporal region, etc) to those that serve as upper ontologies in specific domains, such as COB or BioLink (e.g. gene, disease, chemical entity). The purpose of this optional field is documentation for human reviewers - when a category is known and documented clearly, the cost of interpreting and evaluating the mapping decreases.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"object_id\": {\n                    \"description\": \"The ID of the object of the mapping.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"object_label\": {\n                    \"description\": \"The label of object of the mapping.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"object_match_field\": {\n                    \"description\": \"A list of properties, annotations or attributes related to the object that was used to establish the match. This property is recommended for use in conjunction with  mapping justifications related to lexical matching, such as `semapv:LexicalMatching`.  For additional information see the 'See Also' section.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"type\": [\n                        \"array\",\n                        \"null\"\n                    ]\n                },\n                \"object_preprocessing\": {\n                    \"description\": \"Method of preprocessing applied to the fields of the object. If different preprocessing steps were performed on different fields, it is recommended to store the match in separate rows.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"type\": [\n                        \"array\",\n                        \"null\"\n                    ]\n                },\n                \"object_source\": {\n                    \"description\": \"URI of vocabulary or identifier source for the object.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"object_source_version\": {\n                    \"description\": \"Version IRI or version string of the source of the object term.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"object_type\": {\n                    \"$ref\": \"#/$defs/EntityTypeEnum\",\n                    \"description\": \"The type of entity that is being mapped.\"\n                },\n                \"other\": {\n                    \"description\": \"Pipe separated list of key value pairs for properties not part of the SSSOM spec. Can be used to encode additional provenance data. NOTE. This field is not recommended for general use, and should be used sparingly. See https://github.com/mapping-commons/sssom/blob/master/examples/schema/extension-slots.sssom.tsv for an alternative approach based on extension slots.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"predicate_id\": {\n                    \"description\": \"The ID of the predicate or relation that relates the subject and object of this match.\",\n                    \"type\": \"string\"\n                },\n                \"predicate_label\": {\n                    \"description\": \"The label of the predicate/relation of the mapping.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"predicate_modifier\": {\n                    \"$ref\": \"#/$defs/PredicateModifierEnum\",\n                    \"description\": \"A modifier for negating the predicate. See https://github.com/mapping-commons/sssom/issues/40 for discussion\"\n                },\n                \"predicate_type\": {\n                    \"$ref\": \"#/$defs/EntityTypeEnum\",\n                    \"description\": \"The type of the predicate used to map the subject and object entities.\"\n                },\n                \"publication_date\": {\n                    \"description\": \"The date the mapping was published. This is different from the date the mapping was asserted.\",\n                    \"format\": \"date\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"record_id\": {\n                    \"description\": \"A unique identifier for a mapping record, that is for an instance of the Mapping class (in the SSSOM/TSV serialisation, this corresponds to an individual row after propagation is applied). This slot is intended to uniquely identify one such record within a mapping set and may for example act as the resource identifier for the record when it is serialised into RDF. This slot MUST NOT be used to \\u201cgroup\\u201d several records together to indicate that they pertain to a single mapping (for example, that they represent different versions of the same mapping), by assigning the same ID to several records. When it is used, every record within a set MUST have a unique, non-empty value. The identifier MUST be a URI; beyond that, its format is unconstrained and the identifier MUST be treated as an opaque string.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"review_date\": {\n                    \"description\": \"The date the mapping was reviewed. This is different from the date the mapping was asserted and published. If this field is used in a mapping, reviewer_id and/or reviewer_label MUST also be be set.\",\n                    \"format\": \"date\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"reviewer_agreement\": {\n                    \"description\": \"A value assigned by the reviewer of the mapping to denote their confidence that the mapping record is correct. A value of 1.0 means the reviewer fully agrees with the mapping record. A value of -1.0 means the reviewer fully disagrees with the mapping record. A value of 0.0 means the reviewer is not sure whether the mapping record is correct or not.\\nWhen not explicitly specified, confidence estimation algorithms should consider the reviewer agreement to be 1.0 by default.\",\n                    \"maximum\": 1.0,\n                    \"minimum\": -1.0,\n                    \"type\": [\n                        \"number\",\n                        \"null\"\n                    ]\n                },\n                \"reviewer_id\": {\n                    \"description\": \"Identifies the persons or groups that reviewed and confirmed the mapping. Recommended to be a list of ORCIDs or otherwise identifying URIs.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"type\": [\n                        \"array\",\n                        \"null\"\n                    ]\n                },\n                \"reviewer_label\": {\n                    \"description\": \"A string representing the reviewer of this mapping. This should only be used in the absence of a proper semantic identifier (which would be stored in reviewer_id) for that reviewer. It is not expected that there should be any link between reviewer_id and reviewer_label; in particular, reviewer_label is not intended to provide a human-friendly version of an identifier in reviewer_id.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"type\": [\n                        \"array\",\n                        \"null\"\n                    ]\n                },\n                \"see_also\": {\n                    \"description\": \"A URL specific for the mapping instance. E.g. for kboom we have a per-mapping image that shows surrounding axioms that drive probability. Could also be a github issue URL that discussed a complicated alignment\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"type\": [\n                        \"array\",\n                        \"null\"\n                    ]\n                },\n                \"similarity_measure\": {\n                    \"description\": \"The measure used for computing a similarity score. This field is meant to be used in conjunction with the similarity_score field, to document, for example, the lexical or semantic match of a matching algorithm. To make processing this field as unambiguous as possible, we recommend using wikidata CURIEs, but the type of this field is deliberately unspecified.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"similarity_score\": {\n                    \"description\": \"A score between 0 and 1 to denote the similarity between two entities, where 1 denotes equivalence, and 0 denotes disjointness. The score is meant to be used in conjunction with the similarity_measure field, to document, for example, the lexical or semantic match of a matching algorithm.\",\n                    \"maximum\": 1.0,\n                    \"minimum\": 0.0,\n                    \"type\": [\n                        \"number\",\n                        \"null\"\n                    ]\n                },\n                \"subject_category\": {\n                    \"description\": \"The conceptual category to which the subject belongs to. This can be a string denoting the category or a term from a controlled vocabulary. This slot is deliberately underspecified. Conceptual categories can range from those that are found in general upper ontologies such as BFO (e.g. process, temporal region, etc) to those that serve as upper ontologies in specific domains, such as COB or BioLink (e.g. gene, disease, chemical entity). The purpose of this optional field is documentation for human reviewers - when a category is known and documented clearly, the cost of interpreting and evaluating the mapping decreases.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"subject_id\": {\n                    \"description\": \"The ID of the subject of the mapping.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"subject_label\": {\n                    \"description\": \"The label of subject of the mapping.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"subject_match_field\": {\n                    \"description\": \"A list of properties, annotations or attributes related to the subject that was used to establish the match. This property is recommended for use in conjunction with  mapping justifications related to lexical matching, such as `semapv:LexicalMatching`.  For additional information see the 'See Also' section.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"type\": [\n                        \"array\",\n                        \"null\"\n                    ]\n                },\n                \"subject_preprocessing\": {\n                    \"description\": \"Method of preprocessing applied to the fields of the subject. If different preprocessing steps were performed on different fields, it is recommended to store the match in separate rows.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"type\": [\n                        \"array\",\n                        \"null\"\n                    ]\n                },\n                \"subject_source\": {\n                    \"description\": \"URI of vocabulary or identifier source for the subject.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"subject_source_version\": {\n                    \"description\": \"Version IRI or version string of the source of the subject term.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"subject_type\": {\n                    \"$ref\": \"#/$defs/EntityTypeEnum\",\n                    \"description\": \"The type of entity that is being mapped.\"\n                }\n            },\n            \"required\": [\n                \"predicate_id\",\n                \"mapping_justification\"\n            ],\n            \"title\": \"Mapping\",\n            \"type\": \"object\"\n        },\n        \"MappingCardinalityEnum\": {\n            \"description\": \"\",\n            \"enum\": [\n                \"1:1\",\n                \"1:n\",\n                \"n:1\",\n                \"n:n\",\n                \"1:0\",\n                \"0:1\",\n                \"0:0\"\n            ],\n            \"title\": \"MappingCardinalityEnum\",\n            \"type\": \"string\"\n        },\n        \"MappingRegistry\": {\n            \"additionalProperties\": false,\n            \"description\": \"A registry for managing mapping sets. It holds a set of mapping set references, and can import other registries.\",\n            \"properties\": {\n                \"documentation\": {\n                    \"description\": \"A URL to the documentation of this mapping commons.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"homepage\": {\n                    \"description\": \"A URL to a homepage of this mapping commons.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"imports\": {\n                    \"description\": \"A list of registries that should be imported into this one.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"type\": [\n                        \"array\",\n                        \"null\"\n                    ]\n                },\n                \"issue_tracker\": {\n                    \"description\": \"A URL location of the issue tracker for this entity.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"mapping_registry_description\": {\n                    \"description\": \"The description of a mapping registry.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"mapping_registry_id\": {\n                    \"description\": \"The unique identifier of a mapping registry.\",\n                    \"type\": \"string\"\n                },\n                \"mapping_registry_title\": {\n                    \"description\": \"The title of a mapping registry.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"mapping_set_references\": {\n                    \"description\": \"A list of mapping set references.\",\n                    \"items\": {\n                        \"$ref\": \"#/$defs/MappingSetReference\"\n                    },\n                    \"type\": [\n                        \"array\",\n                        \"null\"\n                    ]\n                }\n            },\n            \"required\": [\n                \"mapping_registry_id\"\n            ],\n            \"title\": \"MappingRegistry\",\n            \"type\": \"object\"\n        },\n        \"MappingSet\": {\n            \"additionalProperties\": false,\n            \"description\": \"Represents a set of mappings.\",\n            \"properties\": {\n                \"cardinality_scope\": {\n                    \"description\": \"A list of mapping slots that define the scope for the value found in the mapping_cardinality slot. Mappings are considered to belong to the same scope if they have the same value for all slots listed in the scope. If no scope is defined, the default scope is empty, meaning that all mappings belong to a single scope that is identical to the entire mapping set. The behaviour if a value in the list does not correspond to a valid slot name is undefined.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"type\": [\n                        \"array\",\n                        \"null\"\n                    ]\n                },\n                \"comment\": {\n                    \"description\": \"Free text field containing either curator notes or text generated by tool providing additional informative information.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"creator_id\": {\n                    \"description\": \"Identifies the persons or groups responsible for the creation of the mapping. The creator is the agent that put the mapping in its published form, which may be different from the author, which is a person that was actively involved in the assertion of the mapping. Recommended to be a list of ORCIDs or otherwise identifying URIs.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"type\": [\n                        \"array\",\n                        \"null\"\n                    ]\n                },\n                \"creator_label\": {\n                    \"description\": \"A string representing the creator of this mapping. This should only be used in the absence of a proper semantic identifier (which would be stored in creator_id) for that creator. It is not expected that there should be any link between creator_id and creator_label; in particular, creator_label is not intended to provide a human-friendly version of an identifier in creator_id.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"type\": [\n                        \"array\",\n                        \"null\"\n                    ]\n                },\n                \"curation_rule\": {\n                    \"description\": \"A curation rule is a (potentially) complex condition executed by an agent that led to the establishment of a mapping. Curation rules often involve complex domain-specific considerations, which are hard to capture in an automated fashion. The curation rule is captured as a resource rather than a string, which enables higher levels of transparency and sharing across mapping sets. The URI representation of the curation rule is expected to be a resolvable identifier which provides details about the nature of the curation rule.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"type\": [\n                        \"array\",\n                        \"null\"\n                    ]\n                },\n                \"curation_rule_text\": {\n                    \"description\": \"A curation rule is a (potentially) complex condition executed by an agent that led to the establishment of a mapping. Curation rules often involve complex domain-specific considerations, which are hard to capture in an automated fashion. The curation rule should be captured as a resource (entity reference) rather than a string (see curation_rule element), which enables higher levels of transparency and sharing across mapping sets. The textual representation of curation rule is intended to be used in cases where the creation of a resource is not practical from the perspective of the mapping_provider.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"type\": [\n                        \"array\",\n                        \"null\"\n                    ]\n                },\n                \"curie_map\": {\n                    \"additionalProperties\": {\n                        \"anyOf\": [\n                            {\n                                \"$ref\": \"#/$defs/Prefix__identifier_optional\"\n                            },\n                            {\n                                \"type\": \"string\"\n                            },\n                            {\n                                \"type\": \"null\"\n                            }\n                        ]\n                    },\n                    \"description\": \"A dictionary that contains prefixes as keys and their URI expansions as values.\",\n                    \"type\": [\n                        \"object\",\n                        \"null\"\n                    ]\n                },\n                \"extension_definitions\": {\n                    \"description\": \"A list that defines the extension slots used in the mapping set.\",\n                    \"items\": {\n                        \"$ref\": \"#/$defs/ExtensionDefinition\"\n                    },\n                    \"type\": [\n                        \"array\",\n                        \"null\"\n                    ]\n                },\n                \"issue_tracker\": {\n                    \"description\": \"A URL location of the issue tracker for this entity.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"license\": {\n                    \"description\": \"A url to the license of the mapping. In absence of a license we assume no license.\",\n                    \"type\": \"string\"\n                },\n                \"mapping_date\": {\n                    \"description\": \"The date the mapping was asserted. This is different from the date the mapping was published or compiled in a SSSOM file.\",\n                    \"format\": \"date\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"mapping_provider\": {\n                    \"description\": \"URL pointing to the source that provided the mapping, for example an ontology that already contains the mappings, or a database from which it was derived.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"mapping_set_confidence\": {\n                    \"description\": \"Mapping-set level confidence is assigned by the creator of the mapping set to indicate their overall confidence in the correctness (i.e., precision) of mappings in the mapping set. Mapping set confidence is intended to be used in cases were the creator wants to express an overall confidence into the agent that curated the individual mappings, for example a lexical matching tool, or a group of students.\\nWhen not explicitly specified, confidence estimation algorithms should consider the mapping set confidence to be 1.0 by default.\",\n                    \"maximum\": 1.0,\n                    \"minimum\": 0.0,\n                    \"type\": [\n                        \"number\",\n                        \"null\"\n                    ]\n                },\n                \"mapping_set_description\": {\n                    \"description\": \"A description of the mapping set.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"mapping_set_id\": {\n                    \"description\": \"A globally unique identifier for the mapping set (not each individual mapping). Should ideally be resolvable.\",\n                    \"type\": \"string\"\n                },\n                \"mapping_set_source\": {\n                    \"description\": \"A mapping set or set of mapping set that was used to derive the mapping set.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"type\": [\n                        \"array\",\n                        \"null\"\n                    ]\n                },\n                \"mapping_set_title\": {\n                    \"description\": \"The display name of a mapping set.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"mapping_set_version\": {\n                    \"description\": \"A version string for the mapping.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"mapping_tool\": {\n                    \"description\": \"A reference to the tool or algorithm that was used to generate the mapping. Should be a URL pointing to more info about it, but can be free text. Consider using the mapping_tool_id slot for a more standardised reference.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"mapping_tool_id\": {\n                    \"description\": \"The ID (entity reference) of the tool or algorithm that was used to generate the mapping.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"mapping_tool_version\": {\n                    \"description\": \"Version string that denotes the version of the mapping tool used.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"mappings\": {\n                    \"description\": \"Contains a list of mapping objects.\",\n                    \"items\": {\n                        \"$ref\": \"#/$defs/Mapping\"\n                    },\n                    \"type\": [\n                        \"array\",\n                        \"null\"\n                    ]\n                },\n                \"object_match_field\": {\n                    \"description\": \"A list of properties, annotations or attributes related to the object that was used to establish the match. This property is recommended for use in conjunction with  mapping justifications related to lexical matching, such as `semapv:LexicalMatching`.  For additional information see the 'See Also' section.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"type\": [\n                        \"array\",\n                        \"null\"\n                    ]\n                },\n                \"object_preprocessing\": {\n                    \"description\": \"Method of preprocessing applied to the fields of the object. If different preprocessing steps were performed on different fields, it is recommended to store the match in separate rows.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"type\": [\n                        \"array\",\n                        \"null\"\n                    ]\n                },\n                \"object_source\": {\n                    \"description\": \"URI of vocabulary or identifier source for the object.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"object_source_version\": {\n                    \"description\": \"Version IRI or version string of the source of the object term.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"object_type\": {\n                    \"$ref\": \"#/$defs/EntityTypeEnum\",\n                    \"description\": \"The type of entity that is being mapped.\"\n                },\n                \"other\": {\n                    \"description\": \"Pipe separated list of key value pairs for properties not part of the SSSOM spec. Can be used to encode additional provenance data. NOTE. This field is not recommended for general use, and should be used sparingly. See https://github.com/mapping-commons/sssom/blob/master/examples/schema/extension-slots.sssom.tsv for an alternative approach based on extension slots.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"predicate_type\": {\n                    \"$ref\": \"#/$defs/EntityTypeEnum\",\n                    \"description\": \"The type of the predicate used to map the subject and object entities.\"\n                },\n                \"publication_date\": {\n                    \"description\": \"The date the mapping was published. This is different from the date the mapping was asserted.\",\n                    \"format\": \"date\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"see_also\": {\n                    \"description\": \"A URL specific for the mapping instance. E.g. for kboom we have a per-mapping image that shows surrounding axioms that drive probability. Could also be a github issue URL that discussed a complicated alignment\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"type\": [\n                        \"array\",\n                        \"null\"\n                    ]\n                },\n                \"similarity_measure\": {\n                    \"description\": \"The measure used for computing a similarity score. This field is meant to be used in conjunction with the similarity_score field, to document, for example, the lexical or semantic match of a matching algorithm. To make processing this field as unambiguous as possible, we recommend using wikidata CURIEs, but the type of this field is deliberately unspecified.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"sssom_version\": {\n                    \"$ref\": \"#/$defs/SssomVersionEnum\",\n                    \"description\": \"The version of the SSSOM specification a mapping set is compliant with.\"\n                },\n                \"subject_match_field\": {\n                    \"description\": \"A list of properties, annotations or attributes related to the subject that was used to establish the match. This property is recommended for use in conjunction with  mapping justifications related to lexical matching, such as `semapv:LexicalMatching`.  For additional information see the 'See Also' section.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"type\": [\n                        \"array\",\n                        \"null\"\n                    ]\n                },\n                \"subject_preprocessing\": {\n                    \"description\": \"Method of preprocessing applied to the fields of the subject. If different preprocessing steps were performed on different fields, it is recommended to store the match in separate rows.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"type\": [\n                        \"array\",\n                        \"null\"\n                    ]\n                },\n                \"subject_source\": {\n                    \"description\": \"URI of vocabulary or identifier source for the subject.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"subject_source_version\": {\n                    \"description\": \"Version IRI or version string of the source of the subject term.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"subject_type\": {\n                    \"$ref\": \"#/$defs/EntityTypeEnum\",\n                    \"description\": \"The type of entity that is being mapped.\"\n                }\n            },\n            \"required\": [\n                \"mapping_set_id\",\n                \"license\"\n            ],\n            \"title\": \"MappingSet\",\n            \"type\": \"object\"\n        },\n        \"MappingSetReference\": {\n            \"additionalProperties\": false,\n            \"description\": \"A reference to a mapping set. It allows to augment mapping set metadata from the perspective of the registry, for example, providing confidence, or a local filename or a grouping.\",\n            \"properties\": {\n                \"last_updated\": {\n                    \"description\": \"The date this reference was last updated.\",\n                    \"format\": \"date\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"local_name\": {\n                    \"description\": \"The local name assigned to file that corresponds to the downloaded mapping set.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"mapping_set_group\": {\n                    \"description\": \"Set by the owners of the mapping registry. A way to group related mapping sets for example for UI purposes.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"mapping_set_id\": {\n                    \"description\": \"A globally unique identifier for the mapping set (not each individual mapping). Should ideally be resolvable.\",\n                    \"type\": \"string\"\n                },\n                \"mirror_from\": {\n                    \"description\": \"A URL location from which to obtain a resource, such as a mapping set.\",\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"registry_confidence\": {\n                    \"description\": \"This value is set by the creator/maintainer of the mapping registry and reflects the confidence the mapping registry has in the correctness (i.e., precision) of mappings in the mapping set.\\nWhen not explicitly specified, confidence estimation algorithms should consider the registry confidence in a mapping set to be 1.0 by default.\",\n                    \"maximum\": 1.0,\n                    \"minimum\": 0.0,\n                    \"type\": [\n                        \"number\",\n                        \"null\"\n                    ]\n                }\n            },\n            \"required\": [\n                \"mapping_set_id\"\n            ],\n            \"title\": \"MappingSetReference\",\n            \"type\": \"object\"\n        },\n        \"NoTermFound\": {\n            \"additionalProperties\": false,\n            \"description\": \"sssom:NoTermFound can be used in place of a subject_id or object_id when the corresponding entity could not be found. It SHOULD be used in conjunction with a corresponding subject_source or object_source to signify where the term was not found.\",\n            \"title\": \"NoTermFound\",\n            \"type\": \"object\"\n        },\n        \"PredicateModifierEnum\": {\n            \"description\": \"\",\n            \"enum\": [\n                \"Not\"\n            ],\n            \"title\": \"PredicateModifierEnum\",\n            \"type\": \"string\"\n        },\n        \"Prefix\": {\n            \"additionalProperties\": false,\n            \"description\": \"\",\n            \"properties\": {\n                \"prefix_name\": {\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"prefix_url\": {\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                }\n            },\n            \"required\": [\n                \"prefix_name\"\n            ],\n            \"title\": \"Prefix\",\n            \"type\": \"object\"\n        },\n        \"Prefix__identifier_optional\": {\n            \"additionalProperties\": false,\n            \"description\": \"\",\n            \"properties\": {\n                \"prefix_name\": {\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                },\n                \"prefix_url\": {\n                    \"type\": [\n                        \"string\",\n                        \"null\"\n                    ]\n                }\n            },\n            \"required\": [],\n            \"title\": \"Prefix\",\n            \"type\": \"object\"\n        },\n        \"Propagatable\": {\n            \"additionalProperties\": false,\n            \"description\": \"Metamodel extension class to describe slots whose value can be propagated down from the MappingSet class to the Mapping class.\",\n            \"properties\": {\n                \"propagated\": {\n                    \"description\": \"Indicates whether a slot can be propagated from a mapping down to individual mappings.\",\n                    \"type\": [\n                        \"boolean\",\n                        \"null\"\n                    ]\n                }\n            },\n            \"title\": \"Propagatable\",\n            \"type\": \"object\"\n        },\n        \"SssomVersionEnum\": {\n            \"description\": \"\",\n            \"enum\": [\n                \"1.0\",\n                \"1.1\"\n            ],\n            \"title\": \"SssomVersionEnum\",\n            \"type\": \"string\"\n        },\n        \"Versionable\": {\n            \"additionalProperties\": false,\n            \"description\": \"Metamodel extension class to manage slots that may not exist in all versions of the model.\",\n            \"properties\": {\n                \"added_in\": {\n                    \"$ref\": \"#/$defs/SssomVersionEnum\",\n                    \"description\": \"The version of the specification in which the slot was added. If not specified, the slot must be assumed to have been added in version 1.0.\"\n                }\n            },\n            \"title\": \"Versionable\",\n            \"type\": \"object\"\n        }\n    },\n    \"$id\": \"https://w3id.org/sssom/schema/\",\n    \"$schema\": \"https://json-schema.org/draft/2019-09/schema\",\n    \"additionalProperties\": true,\n    \"metamodel_version\": \"1.7.0\",\n    \"title\": \"sssom\",\n    \"type\": \"object\",\n    \"version\": null\n}\n"
  },
  {
    "path": "project/prefixmap/sssom_schema.yaml",
    "content": "{\n   \"dcterms\": \"http://purl.org/dc/terms/\",\n   \"linkml\": \"https://w3id.org/linkml/\",\n   \"oboInOwl\": \"http://www.geneontology.org/formats/oboInOwl#\",\n   \"owl\": \"http://www.w3.org/2002/07/owl#\",\n   \"pav\": \"http://purl.org/pav/\",\n   \"prov\": \"http://www.w3.org/ns/prov#\",\n   \"rdf\": \"http://www.w3.org/1999/02/22-rdf-syntax-ns#\",\n   \"rdfs\": \"http://www.w3.org/2000/01/rdf-schema#\",\n   \"semapv\": \"https://w3id.org/semapv/vocab/\",\n   \"skos\": \"http://www.w3.org/2004/02/skos/core#\",\n   \"sssom\": \"https://w3id.org/sssom/\",\n   \"xsd\": \"http://www.w3.org/2001/XMLSchema#\",\n   \"Mapping\": {\n      \"@id\": \"owl:Axiom\"\n   }\n}\n"
  },
  {
    "path": "project/protobuf/sssom_schema.proto",
    "content": " syntax=\"proto3\";\n package\n// metamodel_version: 1.7.0\n// A definition of an extension (non-standard) slot.\nmessage ExtensionDefinition\n {\n  ncname slotName = 0\n  uriorcurie property = 0\n  uriorcurie typeHint = 0\n }\n// Represents an individual mapping between a pair of entities.\nmessage Mapping\n {\n  entityReference recordId = 0\n  entityReference subjectId = 0\n  string subjectLabel = 0\n  string subjectCategory = 0\n  entityReference predicateId = 0\n  string predicateLabel = 0\n  predicateModifierEnum predicateModifier = 0\n  entityReference objectId = 0\n  string objectLabel = 0\n  string objectCategory = 0\n  entityReference mappingJustification = 0\n repeated  entityReference authorId = 0\n repeated  string authorLabel = 0\n repeated  entityReference reviewerId = 0\n repeated  string reviewerLabel = 0\n repeated  entityReference creatorId = 0\n repeated  string creatorLabel = 0\n  nonRelativeURI license = 0\n  entityTypeEnum subjectType = 0\n  entityReference subjectSource = 0\n  string subjectSourceVersion = 0\n  entityTypeEnum objectType = 0\n  entityReference objectSource = 0\n  string objectSourceVersion = 0\n  entityTypeEnum predicateType = 0\n  nonRelativeURI mappingProvider = 0\n  entityReference mappingSource = 0\n  mappingCardinalityEnum mappingCardinality = 0\n repeated  string cardinalityScope = 0\n  string mappingTool = 0\n  entityReference mappingToolId = 0\n  string mappingToolVersion = 0\n  date mappingDate = 0\n  date publicationDate = 0\n  date reviewDate = 0\n  double confidence = 0\n  double reviewerAgreement = 0\n repeated  entityReference curationRule = 0\n repeated  string curationRuleText = 0\n repeated  entityReference subjectMatchField = 0\n repeated  entityReference objectMatchField = 0\n repeated  string matchString = 0\n repeated  entityReference subjectPreprocessing = 0\n repeated  entityReference objectPreprocessing = 0\n  double similarityScore = 0\n  string similarityMeasure = 0\n repeated  nonRelativeURI seeAlso = 0\n  entityReference issueTrackerItem = 0\n  string other = 0\n  string comment = 0\n }\n// A registry for managing mapping sets. It holds a set of mapping set references, and can import other registries.\nmessage MappingRegistry\n {\n  entityReference mappingRegistryId = 0\n  string mappingRegistryTitle = 0\n  string mappingRegistryDescription = 0\n repeated  nonRelativeURI imports = 0\n repeated  mappingSetReference mappingSetReferences = 0\n  nonRelativeURI documentation = 0\n  nonRelativeURI homepage = 0\n  nonRelativeURI issueTracker = 0\n }\n// Represents a set of mappings.\nmessage MappingSet\n {\n  sssomVersionEnum sssomVersion = 0\n repeated  prefix curieMap = 0\n repeated  mapping mappings = 0\n  nonRelativeURI mappingSetId = 0\n  string mappingSetVersion = 0\n repeated  nonRelativeURI mappingSetSource = 0\n  string mappingSetTitle = 0\n  string mappingSetDescription = 0\n  double mappingSetConfidence = 0\n repeated  entityReference creatorId = 0\n repeated  string creatorLabel = 0\n  nonRelativeURI license = 0\n  entityTypeEnum subjectType = 0\n  entityReference subjectSource = 0\n  string subjectSourceVersion = 0\n  entityTypeEnum objectType = 0\n  entityReference objectSource = 0\n  string objectSourceVersion = 0\n  entityTypeEnum predicateType = 0\n  nonRelativeURI mappingProvider = 0\n repeated  string cardinalityScope = 0\n  string mappingTool = 0\n  entityReference mappingToolId = 0\n  string mappingToolVersion = 0\n  date mappingDate = 0\n  date publicationDate = 0\n repeated  entityReference subjectMatchField = 0\n repeated  entityReference objectMatchField = 0\n repeated  entityReference subjectPreprocessing = 0\n repeated  entityReference objectPreprocessing = 0\n  string similarityMeasure = 0\n repeated  entityReference curationRule = 0\n repeated  string curationRuleText = 0\n repeated  nonRelativeURI seeAlso = 0\n  nonRelativeURI issueTracker = 0\n  string other = 0\n  string comment = 0\n repeated  extensionDefinition extensionDefinitions = 0\n }\n// A reference to a mapping set. It allows to augment mapping set metadata from the perspective of the registry, for example, providing confidence, or a local filename or a grouping.\nmessage MappingSetReference\n {\n  nonRelativeURI mappingSetId = 0\n  nonRelativeURI mirrorFrom = 0\n  double registryConfidence = 0\n  string mappingSetGroup = 0\n  date lastUpdated = 0\n  string localName = 0\n }\nmessage Prefix\n {\n  ncname prefixName = 0\n  uri prefixUrl = 0\n }\n// Metamodel extension class to describe slots whose value can be propagated down from the MappingSet class to the Mapping class.\nmessage Propagatable\n {\n  boolean propagated = 0\n }\n// Metamodel extension class to manage slots that may not exist in all versions of the model.\nmessage Versionable\n {\n  sssomVersionEnum addedIn = 0\n }\n"
  },
  {
    "path": "project/shacl/sssom_schema.shacl.ttl",
    "content": "@prefix dcterms: <http://purl.org/dc/terms/> .\n@prefix owl: <http://www.w3.org/2002/07/owl#> .\n@prefix pav: <http://purl.org/pav/> .\n@prefix prov: <http://www.w3.org/ns/prov#> .\n@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .\n@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n@prefix sh: <http://www.w3.org/ns/shacl#> .\n@prefix skos: <http://www.w3.org/2004/02/skos/core#> .\n@prefix sssom: <https://w3id.org/sssom/> .\n@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .\n\nsssom:MappingRegistry a sh:NodeShape ;\n    rdfs:comment \"A registry for managing mapping sets. It holds a set of mapping set references, and can import other registries.\" ;\n    sh:closed true ;\n    sh:ignoredProperties ( rdf:type ) ;\n    sh:property [ sh:class sssom:MappingSetReference ;\n            sh:description \"A list of mapping set references.\" ;\n            sh:nodeKind sh:BlankNodeOrIRI ;\n            sh:order 4 ;\n            sh:path sssom:mapping_set_references ],\n        [ sh:datatype rdfs:Resource ;\n            sh:description \"The unique identifier of a mapping registry.\" ;\n            sh:maxCount 1 ;\n            sh:minCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 0 ;\n            sh:path sssom:mapping_registry_id ],\n        [ sh:datatype xsd:string ;\n            sh:description \"The title of a mapping registry.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 1 ;\n            sh:path sssom:mapping_registry_title ],\n        [ sh:datatype xsd:string ;\n            sh:description \"The description of a mapping registry.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 2 ;\n            sh:path sssom:mapping_registry_description ],\n        [ sh:description \"A URL location of the issue tracker for this entity.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 7 ;\n            sh:path sssom:issue_tracker ],\n        [ sh:description \"A URL to the documentation of this mapping commons.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 5 ;\n            sh:path sssom:documentation ],\n        [ sh:description \"A URL to a homepage of this mapping commons.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 6 ;\n            sh:path sssom:homepage ],\n        [ sh:description \"A list of registries that should be imported into this one.\" ;\n            sh:nodeKind sh:Literal ;\n            sh:order 3 ;\n            sh:path sssom:imports ] ;\n    sh:targetClass sssom:MappingRegistry .\n\nsssom:MappingSet a sh:NodeShape ;\n    rdfs:comment \"Represents a set of mappings.\" ;\n    sh:closed true ;\n    sh:ignoredProperties ( rdf:type ) ;\n    sh:property [ sh:datatype rdfs:Resource ;\n            sh:description \"Method of preprocessing applied to the fields of the subject. If different preprocessing steps were performed on different fields, it is recommended to store the match in separate rows.\" ;\n            sh:nodeKind sh:Literal ;\n            sh:order 28 ;\n            sh:path sssom:subject_preprocessing ],\n        [ sh:datatype xsd:string ;\n            sh:description \"The display name of a mapping set.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 6 ;\n            sh:path dcterms:title ],\n        [ sh:datatype rdfs:Resource ;\n            sh:description \"A list of properties, annotations or attributes related to the object that was used to establish the match. This property is recommended for use in conjunction with  mapping justifications related to lexical matching, such as `semapv:LexicalMatching`.  For additional information see the 'See Also' section.\" ;\n            sh:nodeKind sh:Literal ;\n            sh:order 27 ;\n            sh:path sssom:object_match_field ],\n        [ sh:description \"The type of the predicate used to map the subject and object entities.\" ;\n            sh:in ( owl:Class owl:ObjectProperty owl:DataProperty owl:AnnotationProperty owl:NamedIndividual skos:Concept rdfs:Resource rdfs:Class rdfs:Literal rdfs:Datatype rdf:Property sssom:ComposedEntityExpression ) ;\n            sh:maxCount 1 ;\n            sh:order 18 ;\n            sh:path sssom:predicate_type ],\n        [ sh:datatype xsd:string ;\n            sh:description \"Pipe separated list of key value pairs for properties not part of the SSSOM spec. Can be used to encode additional provenance data. NOTE. This field is not recommended for general use, and should be used sparingly. See https://github.com/mapping-commons/sssom/blob/master/examples/schema/extension-slots.sssom.tsv for an alternative approach based on extension slots.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 35 ;\n            sh:path sssom:other ],\n        [ sh:description \"The type of entity that is being mapped.\" ;\n            sh:in ( owl:Class owl:ObjectProperty owl:DataProperty owl:AnnotationProperty owl:NamedIndividual skos:Concept rdfs:Resource rdfs:Class rdfs:Literal rdfs:Datatype rdf:Property sssom:ComposedEntityExpression ) ;\n            sh:maxCount 1 ;\n            sh:order 15 ;\n            sh:path sssom:object_type ],\n        [ sh:datatype xsd:string ;\n            sh:description \"The measure used for computing a similarity score. This field is meant to be used in conjunction with the similarity_score field, to document, for example, the lexical or semantic match of a matching algorithm. To make processing this field as unambiguous as possible, we recommend using wikidata CURIEs, but the type of this field is deliberately unspecified.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 30 ;\n            sh:path sssom:similarity_measure ],\n        [ sh:class sssom:Prefix ;\n            sh:description \"A dictionary that contains prefixes as keys and their URI expansions as values.\" ;\n            sh:nodeKind sh:BlankNodeOrIRI ;\n            sh:order 1 ;\n            sh:path sssom:curie_map ],\n        [ sh:datatype xsd:string ;\n            sh:description \"Version string that denotes the version of the mapping tool used.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 23 ;\n            sh:path sssom:mapping_tool_version ],\n        [ sh:class sssom:ExtensionDefinition ;\n            sh:description \"A list that defines the extension slots used in the mapping set.\" ;\n            sh:nodeKind sh:BlankNodeOrIRI ;\n            sh:order 37 ;\n            sh:path sssom:extension_definitions ],\n        [ sh:description \"The type of entity that is being mapped.\" ;\n            sh:in ( owl:Class owl:ObjectProperty owl:DataProperty owl:AnnotationProperty owl:NamedIndividual skos:Concept rdfs:Resource rdfs:Class rdfs:Literal rdfs:Datatype rdf:Property sssom:ComposedEntityExpression ) ;\n            sh:maxCount 1 ;\n            sh:order 12 ;\n            sh:path sssom:subject_type ],\n        [ sh:datatype rdfs:Resource ;\n            sh:description \"A curation rule is a (potentially) complex condition executed by an agent that led to the establishment of a mapping. Curation rules often involve complex domain-specific considerations, which are hard to capture in an automated fashion. The curation rule is captured as a resource rather than a string, which enables higher levels of transparency and sharing across mapping sets. The URI representation of the curation rule is expected to be a resolvable identifier which provides details about the nature of the curation rule.\" ;\n            sh:nodeKind sh:Literal ;\n            sh:order 31 ;\n            sh:path sssom:curation_rule ],\n        [ sh:datatype xsd:string ;\n            sh:description \"A reference to the tool or algorithm that was used to generate the mapping. Should be a URL pointing to more info about it, but can be free text. Consider using the mapping_tool_id slot for a more standardised reference.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 21 ;\n            sh:path sssom:mapping_tool ],\n        [ sh:datatype rdfs:Resource ;\n            sh:description \"A list of properties, annotations or attributes related to the subject that was used to establish the match. This property is recommended for use in conjunction with  mapping justifications related to lexical matching, such as `semapv:LexicalMatching`.  For additional information see the 'See Also' section.\" ;\n            sh:nodeKind sh:Literal ;\n            sh:order 26 ;\n            sh:path sssom:subject_match_field ],\n        [ sh:datatype rdfs:Resource ;\n            sh:description \"URI of vocabulary or identifier source for the subject.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 13 ;\n            sh:path sssom:subject_source ],\n        [ sh:datatype rdfs:Resource ;\n            sh:description \"Method of preprocessing applied to the fields of the object. If different preprocessing steps were performed on different fields, it is recommended to store the match in separate rows.\" ;\n            sh:nodeKind sh:Literal ;\n            sh:order 29 ;\n            sh:path sssom:object_preprocessing ],\n        [ sh:class owl:Axiom ;\n            sh:description \"Contains a list of mapping objects.\" ;\n            sh:nodeKind sh:BlankNodeOrIRI ;\n            sh:order 2 ;\n            sh:path sssom:mappings ],\n        [ sh:datatype xsd:string ;\n            sh:description \"Version IRI or version string of the source of the object term.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 17 ;\n            sh:path sssom:object_source_version ],\n        [ sh:datatype xsd:string ;\n            sh:description \"A curation rule is a (potentially) complex condition executed by an agent that led to the establishment of a mapping. Curation rules often involve complex domain-specific considerations, which are hard to capture in an automated fashion. The curation rule should be captured as a resource (entity reference) rather than a string (see curation_rule element), which enables higher levels of transparency and sharing across mapping sets. The textual representation of curation rule is intended to be used in cases where the creation of a resource is not practical from the perspective of the mapping_provider.\" ;\n            sh:nodeKind sh:Literal ;\n            sh:order 32 ;\n            sh:path sssom:curation_rule_text ],\n        [ sh:description \"The version of the SSSOM specification a mapping set is compliant with.\" ;\n            sh:in ( sssom:version1.0 sssom:version1.1 ) ;\n            sh:maxCount 1 ;\n            sh:order 0 ;\n            sh:path sssom:sssom_version ],\n        [ sh:datatype xsd:string ;\n            sh:description \"Version IRI or version string of the source of the subject term.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 14 ;\n            sh:path sssom:subject_source_version ],\n        [ sh:datatype xsd:string ;\n            sh:description \"A description of the mapping set.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 7 ;\n            sh:path dcterms:description ],\n        [ sh:datatype xsd:date ;\n            sh:description \"The date the mapping was asserted. This is different from the date the mapping was published or compiled in a SSSOM file.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 24 ;\n            sh:path dcterms:created ],\n        [ sh:datatype rdfs:Resource ;\n            sh:description \"URI of vocabulary or identifier source for the object.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 16 ;\n            sh:path sssom:object_source ],\n        [ sh:datatype xsd:string ;\n            sh:description \"Free text field containing either curator notes or text generated by tool providing additional informative information.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 36 ;\n            sh:path rdfs:comment ],\n        [ sh:description \"A mapping set or set of mapping set that was used to derive the mapping set.\" ;\n            sh:nodeKind sh:Literal ;\n            sh:order 5 ;\n            sh:path prov:wasDerivedFrom ],\n        [ sh:description \"A URL location of the issue tracker for this entity.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 34 ;\n            sh:path sssom:issue_tracker ],\n        [ sh:datatype xsd:string ;\n            sh:description \"A version string for the mapping.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 4 ;\n            sh:path owl:versionInfo ],\n        [ sh:description \"A globally unique identifier for the mapping set (not each individual mapping). Should ideally be resolvable.\" ;\n            sh:maxCount 1 ;\n            sh:minCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 3 ;\n            sh:path sssom:mapping_set_id ],\n        [ sh:datatype rdfs:Resource ;\n            sh:description \"The ID (entity reference) of the tool or algorithm that was used to generate the mapping.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 22 ;\n            sh:path sssom:mapping_tool_id ],\n        [ sh:datatype xsd:string ;\n            sh:description \"A string representing the creator of this mapping. This should only be used in the absence of a proper semantic identifier (which would be stored in creator_id) for that creator. It is not expected that there should be any link between creator_id and creator_label; in particular, creator_label is not intended to provide a human-friendly version of an identifier in creator_id.\" ;\n            sh:nodeKind sh:Literal ;\n            sh:order 10 ;\n            sh:path sssom:creator_label ],\n        [ sh:datatype xsd:double ;\n            sh:description \"\"\"Mapping-set level confidence is assigned by the creator of the mapping set to indicate their overall confidence in the correctness (i.e., precision) of mappings in the mapping set. Mapping set confidence is intended to be used in cases were the creator wants to express an overall confidence into the agent that curated the individual mappings, for example a lexical matching tool, or a group of students.\nWhen not explicitly specified, confidence estimation algorithms should consider the mapping set confidence to be 1.0 by default.\"\"\" ;\n            sh:maxCount 1 ;\n            sh:maxInclusive 1e+00 ;\n            sh:minInclusive 0e+00 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 8 ;\n            sh:path sssom:mapping_set_confidence ],\n        [ sh:datatype xsd:date ;\n            sh:description \"The date the mapping was published. This is different from the date the mapping was asserted.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 25 ;\n            sh:path dcterms:issued ],\n        [ sh:description \"A URL specific for the mapping instance. E.g. for kboom we have a per-mapping image that shows surrounding axioms that drive probability. Could also be a github issue URL that discussed a complicated alignment\" ;\n            sh:nodeKind sh:Literal ;\n            sh:order 33 ;\n            sh:path rdfs:seeAlso ],\n        [ sh:datatype rdfs:Resource ;\n            sh:description \"Identifies the persons or groups responsible for the creation of the mapping. The creator is the agent that put the mapping in its published form, which may be different from the author, which is a person that was actively involved in the assertion of the mapping. Recommended to be a list of ORCIDs or otherwise identifying URIs.\" ;\n            sh:nodeKind sh:Literal ;\n            sh:order 9 ;\n            sh:path dcterms:creator ],\n        [ sh:datatype xsd:string ;\n            sh:description \"A list of mapping slots that define the scope for the value found in the mapping_cardinality slot. Mappings are considered to belong to the same scope if they have the same value for all slots listed in the scope. If no scope is defined, the default scope is empty, meaning that all mappings belong to a single scope that is identical to the entire mapping set. The behaviour if a value in the list does not correspond to a valid slot name is undefined.\" ;\n            sh:nodeKind sh:Literal ;\n            sh:order 20 ;\n            sh:path sssom:cardinality_scope ],\n        [ sh:description \"A url to the license of the mapping. In absence of a license we assume no license.\" ;\n            sh:maxCount 1 ;\n            sh:minCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 11 ;\n            sh:path dcterms:license ],\n        [ sh:description \"URL pointing to the source that provided the mapping, for example an ontology that already contains the mappings, or a database from which it was derived.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 19 ;\n            sh:path sssom:mapping_provider ] ;\n    sh:targetClass sssom:MappingSet .\n\nsssom:NoTermFound a sh:NodeShape ;\n    rdfs:comment \"sssom:NoTermFound can be used in place of a subject_id or object_id when the corresponding entity could not be found. It SHOULD be used in conjunction with a corresponding subject_source or object_source to signify where the term was not found.\" ;\n    sh:closed true ;\n    sh:ignoredProperties ( rdf:type ) ;\n    sh:targetClass sssom:NoTermFound .\n\nsssom:Propagatable a sh:NodeShape ;\n    rdfs:comment \"Metamodel extension class to describe slots whose value can be propagated down from the MappingSet class to the Mapping class.\" ;\n    sh:closed true ;\n    sh:ignoredProperties ( rdf:type ) ;\n    sh:property [ sh:datatype xsd:boolean ;\n            sh:description \"Indicates whether a slot can be propagated from a mapping down to individual mappings.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 0 ;\n            sh:path sssom:propagated ] ;\n    sh:targetClass sssom:Propagatable .\n\nsssom:Versionable a sh:NodeShape ;\n    rdfs:comment \"Metamodel extension class to manage slots that may not exist in all versions of the model.\" ;\n    sh:closed true ;\n    sh:ignoredProperties ( rdf:type ) ;\n    sh:property [ sh:description \"The version of the specification in which the slot was added. If not specified, the slot must be assumed to have been added in version 1.0.\" ;\n            sh:in ( sssom:version1.0 sssom:version1.1 ) ;\n            sh:maxCount 1 ;\n            sh:order 0 ;\n            sh:path sssom:added_in ] ;\n    sh:targetClass sssom:Versionable .\n\nowl:Axiom a sh:NodeShape ;\n    rdfs:comment \"Represents an individual mapping between a pair of entities.\" ;\n    sh:closed true ;\n    sh:ignoredProperties ( rdf:type ) ;\n    sh:property [ sh:datatype rdfs:Resource ;\n            sh:description \"Identifies the persons or groups that reviewed and confirmed the mapping. Recommended to be a list of ORCIDs or otherwise identifying URIs.\" ;\n            sh:nodeKind sh:Literal ;\n            sh:order 13 ;\n            sh:path sssom:reviewer_id ],\n        [ sh:datatype rdfs:Resource ;\n            sh:description \"Identifies the persons or groups responsible for the creation of the mapping. The creator is the agent that put the mapping in its published form, which may be different from the author, which is a person that was actively involved in the assertion of the mapping. Recommended to be a list of ORCIDs or otherwise identifying URIs.\" ;\n            sh:nodeKind sh:Literal ;\n            sh:order 15 ;\n            sh:path dcterms:creator ],\n        [ sh:datatype xsd:string ;\n            sh:description \"The label of object of the mapping.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 8 ;\n            sh:path sssom:object_label ],\n        [ sh:datatype xsd:string ;\n            sh:description \"Version string that denotes the version of the mapping tool used.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 31 ;\n            sh:path sssom:mapping_tool_version ],\n        [ sh:datatype rdfs:Resource ;\n            sh:description \"The ID (entity reference) of the tool or algorithm that was used to generate the mapping.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 30 ;\n            sh:path sssom:mapping_tool_id ],\n        [ sh:description \"A URL specific for the mapping instance. E.g. for kboom we have a per-mapping image that shows surrounding axioms that drive probability. Could also be a github issue URL that discussed a complicated alignment\" ;\n            sh:nodeKind sh:Literal ;\n            sh:order 46 ;\n            sh:path rdfs:seeAlso ],\n        [ sh:datatype xsd:string ;\n            sh:description \"Version IRI or version string of the source of the object term.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 23 ;\n            sh:path sssom:object_source_version ],\n        [ sh:datatype rdfs:Resource ;\n            sh:description \"A unique identifier for a mapping record, that is for an instance of the Mapping class (in the SSSOM/TSV serialisation, this corresponds to an individual row after propagation is applied). This slot is intended to uniquely identify one such record within a mapping set and may for example act as the resource identifier for the record when it is serialised into RDF. This slot MUST NOT be used to “group” several records together to indicate that they pertain to a single mapping (for example, that they represent different versions of the same mapping), by assigning the same ID to several records. When it is used, every record within a set MUST have a unique, non-empty value. The identifier MUST be a URI; beyond that, its format is unconstrained and the identifier MUST be treated as an opaque string.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 0 ;\n            sh:path sssom:record_id ],\n        [ sh:datatype rdfs:Resource ;\n            sh:description \"Identifies the persons or groups responsible for asserting the mappings. Recommended to be a list of ORCIDs or otherwise identifying URIs.\" ;\n            sh:nodeKind sh:Literal ;\n            sh:order 11 ;\n            sh:path pav:authoredBy ],\n        [ sh:description \"URL pointing to the source that provided the mapping, for example an ontology that already contains the mappings, or a database from which it was derived.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 25 ;\n            sh:path sssom:mapping_provider ],\n        [ sh:datatype rdfs:Resource ;\n            sh:description \"The mapping set this mapping was originally defined in. mapping_source is used for example when merging multiple mapping sets or deriving one mapping set from another.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 26 ;\n            sh:path sssom:mapping_source ],\n        [ sh:datatype xsd:date ;\n            sh:description \"The date the mapping was reviewed. This is different from the date the mapping was asserted and published. If this field is used in a mapping, reviewer_id and/or reviewer_label MUST also be be set.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 34 ;\n            sh:path sssom:review_date ],\n        [ sh:description \"A mapping justification is an action (or the written representation of that action) of showing a mapping to be right or reasonable.\" ;\n            sh:maxCount 1 ;\n            sh:minCount 1 ;\n            sh:or ( [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] ) ;\n            sh:order 10 ;\n            sh:path sssom:mapping_justification ],\n        [ sh:datatype rdfs:Resource ;\n            sh:description \"The issue tracker item discussing this mapping.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 47 ;\n            sh:path sssom:issue_tracker_item ],\n        [ sh:datatype xsd:string ;\n            sh:description \"Free text field containing either curator notes or text generated by tool providing additional informative information.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 49 ;\n            sh:path rdfs:comment ],\n        [ sh:description \"The type of the predicate used to map the subject and object entities.\" ;\n            sh:in ( owl:Class owl:ObjectProperty owl:DataProperty owl:AnnotationProperty owl:NamedIndividual skos:Concept rdfs:Resource rdfs:Class rdfs:Literal rdfs:Datatype rdf:Property sssom:ComposedEntityExpression ) ;\n            sh:maxCount 1 ;\n            sh:order 24 ;\n            sh:path sssom:predicate_type ],\n        [ sh:description \"A modifier for negating the predicate. See https://github.com/mapping-commons/sssom/issues/40 for discussion\" ;\n            sh:in ( sssom:NegatedPredicate ) ;\n            sh:maxCount 1 ;\n            sh:order 6 ;\n            sh:path sssom:predicate_modifier ],\n        [ sh:datatype rdfs:Resource ;\n            sh:description \"The ID of the subject of the mapping.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 1 ;\n            sh:path owl:annotatedSource ],\n        [ sh:datatype rdfs:Resource ;\n            sh:description \"The ID of the object of the mapping.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 7 ;\n            sh:path owl:annotatedTarget ],\n        [ sh:datatype rdfs:Resource ;\n            sh:description \"A list of properties, annotations or attributes related to the subject that was used to establish the match. This property is recommended for use in conjunction with  mapping justifications related to lexical matching, such as `semapv:LexicalMatching`.  For additional information see the 'See Also' section.\" ;\n            sh:nodeKind sh:Literal ;\n            sh:order 39 ;\n            sh:path sssom:subject_match_field ],\n        [ sh:datatype rdfs:Resource ;\n            sh:description \"A curation rule is a (potentially) complex condition executed by an agent that led to the establishment of a mapping. Curation rules often involve complex domain-specific considerations, which are hard to capture in an automated fashion. The curation rule is captured as a resource rather than a string, which enables higher levels of transparency and sharing across mapping sets. The URI representation of the curation rule is expected to be a resolvable identifier which provides details about the nature of the curation rule.\" ;\n            sh:nodeKind sh:Literal ;\n            sh:order 37 ;\n            sh:path sssom:curation_rule ],\n        [ sh:datatype rdfs:Resource ;\n            sh:description \"URI of vocabulary or identifier source for the subject.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 19 ;\n            sh:path sssom:subject_source ],\n        [ sh:datatype xsd:string ;\n            sh:description \"A list of mapping slots that define the scope for the value found in the mapping_cardinality slot. Mappings are considered to belong to the same scope if they have the same value for all slots listed in the scope. If no scope is defined, the default scope is empty, meaning that all mappings belong to a single scope that is identical to the entire mapping set. The behaviour if a value in the list does not correspond to a valid slot name is undefined.\" ;\n            sh:nodeKind sh:Literal ;\n            sh:order 28 ;\n            sh:path sssom:cardinality_scope ],\n        [ sh:description \"A url to the license of the mapping. In absence of a license we assume no license.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 17 ;\n            sh:path dcterms:license ],\n        [ sh:datatype xsd:string ;\n            sh:description \"A reference to the tool or algorithm that was used to generate the mapping. Should be a URL pointing to more info about it, but can be free text. Consider using the mapping_tool_id slot for a more standardised reference.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 29 ;\n            sh:path sssom:mapping_tool ],\n        [ sh:datatype xsd:string ;\n            sh:description \"A string representing the reviewer of this mapping. This should only be used in the absence of a proper semantic identifier (which would be stored in reviewer_id) for that reviewer. It is not expected that there should be any link between reviewer_id and reviewer_label; in particular, reviewer_label is not intended to provide a human-friendly version of an identifier in reviewer_id.\" ;\n            sh:nodeKind sh:Literal ;\n            sh:order 14 ;\n            sh:path sssom:reviewer_label ],\n        [ sh:datatype rdfs:Resource ;\n            sh:description \"URI of vocabulary or identifier source for the object.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 22 ;\n            sh:path sssom:object_source ],\n        [ sh:description \"The type of entity that is being mapped.\" ;\n            sh:in ( owl:Class owl:ObjectProperty owl:DataProperty owl:AnnotationProperty owl:NamedIndividual skos:Concept rdfs:Resource rdfs:Class rdfs:Literal rdfs:Datatype rdf:Property sssom:ComposedEntityExpression ) ;\n            sh:maxCount 1 ;\n            sh:order 21 ;\n            sh:path sssom:object_type ],\n        [ sh:datatype xsd:string ;\n            sh:description \"The conceptual category to which the subject belongs to. This can be a string denoting the category or a term from a controlled vocabulary. This slot is deliberately underspecified. Conceptual categories can range from those that are found in general upper ontologies such as BFO (e.g. process, temporal region, etc) to those that serve as upper ontologies in specific domains, such as COB or BioLink (e.g. gene, disease, chemical entity). The purpose of this optional field is documentation for human reviewers - when a category is known and documented clearly, the cost of interpreting and evaluating the mapping decreases.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 3 ;\n            sh:path sssom:subject_category ],\n        [ sh:datatype xsd:date ;\n            sh:description \"The date the mapping was asserted. This is different from the date the mapping was published or compiled in a SSSOM file.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 32 ;\n            sh:path dcterms:created ],\n        [ sh:datatype rdfs:Resource ;\n            sh:description \"A list of properties, annotations or attributes related to the object that was used to establish the match. This property is recommended for use in conjunction with  mapping justifications related to lexical matching, such as `semapv:LexicalMatching`.  For additional information see the 'See Also' section.\" ;\n            sh:nodeKind sh:Literal ;\n            sh:order 40 ;\n            sh:path sssom:object_match_field ],\n        [ sh:datatype xsd:string ;\n            sh:description \"The conceptual category to which the subject belongs to. This can be a string denoting the category or a term from a controlled vocabulary. This slot is deliberately underspecified. Conceptual categories can range from those that are found in general upper ontologies such as BFO (e.g. process, temporal region, etc) to those that serve as upper ontologies in specific domains, such as COB or BioLink (e.g. gene, disease, chemical entity). The purpose of this optional field is documentation for human reviewers - when a category is known and documented clearly, the cost of interpreting and evaluating the mapping decreases.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 9 ;\n            sh:path sssom:object_category ],\n        [ sh:datatype xsd:date ;\n            sh:description \"The date the mapping was published. This is different from the date the mapping was asserted.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 33 ;\n            sh:path dcterms:issued ],\n        [ sh:datatype xsd:double ;\n            sh:description \"A score between 0 and 1 to denote the similarity between two entities, where 1 denotes equivalence, and 0 denotes disjointness. The score is meant to be used in conjunction with the similarity_measure field, to document, for example, the lexical or semantic match of a matching algorithm.\" ;\n            sh:maxCount 1 ;\n            sh:maxInclusive 1e+00 ;\n            sh:minInclusive 0e+00 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 44 ;\n            sh:path sssom:similarity_score ],\n        [ sh:datatype xsd:string ;\n            sh:description \"Pipe separated list of key value pairs for properties not part of the SSSOM spec. Can be used to encode additional provenance data. NOTE. This field is not recommended for general use, and should be used sparingly. See https://github.com/mapping-commons/sssom/blob/master/examples/schema/extension-slots.sssom.tsv for an alternative approach based on extension slots.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 48 ;\n            sh:path sssom:other ],\n        [ sh:datatype rdfs:Resource ;\n            sh:description \"The ID of the predicate or relation that relates the subject and object of this match.\" ;\n            sh:maxCount 1 ;\n            sh:minCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 4 ;\n            sh:path owl:annotatedProperty ],\n        [ sh:datatype xsd:string ;\n            sh:description \"A string representing the creator of this mapping. This should only be used in the absence of a proper semantic identifier (which would be stored in creator_id) for that creator. It is not expected that there should be any link between creator_id and creator_label; in particular, creator_label is not intended to provide a human-friendly version of an identifier in creator_id.\" ;\n            sh:nodeKind sh:Literal ;\n            sh:order 16 ;\n            sh:path sssom:creator_label ],\n        [ sh:description \"The type of entity that is being mapped.\" ;\n            sh:in ( owl:Class owl:ObjectProperty owl:DataProperty owl:AnnotationProperty owl:NamedIndividual skos:Concept rdfs:Resource rdfs:Class rdfs:Literal rdfs:Datatype rdf:Property sssom:ComposedEntityExpression ) ;\n            sh:maxCount 1 ;\n            sh:order 18 ;\n            sh:path sssom:subject_type ],\n        [ sh:datatype xsd:string ;\n            sh:description \"The measure used for computing a similarity score. This field is meant to be used in conjunction with the similarity_score field, to document, for example, the lexical or semantic match of a matching algorithm. To make processing this field as unambiguous as possible, we recommend using wikidata CURIEs, but the type of this field is deliberately unspecified.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 45 ;\n            sh:path sssom:similarity_measure ],\n        [ sh:datatype xsd:double ;\n            sh:description \"\"\"A value assigned by the creator of the mapping to denote the creator's confidence or estimated probability that the mapping record is correct. A value of 1.0 means the creator has full confidence in the correctness of the mapping record, while a value of 0.0 means the creator is fully unsure whether the mapping record is correct or not.\nWhen not explicitly specified, confidence estimation algorithms should consider the mapping confidence to be 1.0 by default.\"\"\" ;\n            sh:maxCount 1 ;\n            sh:maxInclusive 1e+00 ;\n            sh:minInclusive 0e+00 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 35 ;\n            sh:path sssom:confidence ],\n        [ sh:datatype rdfs:Resource ;\n            sh:description \"Method of preprocessing applied to the fields of the object. If different preprocessing steps were performed on different fields, it is recommended to store the match in separate rows.\" ;\n            sh:nodeKind sh:Literal ;\n            sh:order 43 ;\n            sh:path sssom:object_preprocessing ],\n        [ sh:datatype xsd:double ;\n            sh:description \"\"\"A value assigned by the reviewer of the mapping to denote their confidence that the mapping record is correct. A value of 1.0 means the reviewer fully agrees with the mapping record. A value of -1.0 means the reviewer fully disagrees with the mapping record. A value of 0.0 means the reviewer is not sure whether the mapping record is correct or not.\nWhen not explicitly specified, confidence estimation algorithms should consider the reviewer agreement to be 1.0 by default.\"\"\" ;\n            sh:maxCount 1 ;\n            sh:maxInclusive 1e+00 ;\n            sh:minInclusive -1e+00 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 36 ;\n            sh:path sssom:reviewer_agreement ],\n        [ sh:description \"A value indicating whether the subject (respectively object) of this mapping record is present in other records involving a different object (respectively subject), within the subset of records defined by the cardinality_scope slot (or within the entire mapping set if cardinality_scope is undefined). Note that this is a convenience field, whose values can always be derived from the mapping set.\" ;\n            sh:in ( \"1:1\" \"1:n\" \"n:1\" \"n:n\" \"1:0\" \"0:1\" \"0:0\" ) ;\n            sh:maxCount 1 ;\n            sh:order 27 ;\n            sh:path sssom:mapping_cardinality ],\n        [ sh:datatype xsd:string ;\n            sh:description \"A string representing the author of this mapping. This should only be used in the absence of a proper semantic identifier (which would be stored in author_id) for that author. It is not expected that there should be any link between author_id and author_label; in particular, author_label is not intended to provide a human-friendly version of an identifier in author_id.\" ;\n            sh:nodeKind sh:Literal ;\n            sh:order 12 ;\n            sh:path sssom:author_label ],\n        [ sh:datatype rdfs:Resource ;\n            sh:description \"Method of preprocessing applied to the fields of the subject. If different preprocessing steps were performed on different fields, it is recommended to store the match in separate rows.\" ;\n            sh:nodeKind sh:Literal ;\n            sh:order 42 ;\n            sh:path sssom:subject_preprocessing ],\n        [ sh:datatype xsd:string ;\n            sh:description \"The label of the predicate/relation of the mapping.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 5 ;\n            sh:path sssom:predicate_label ],\n        [ sh:datatype xsd:string ;\n            sh:description \"Version IRI or version string of the source of the subject term.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 20 ;\n            sh:path sssom:subject_source_version ],\n        [ sh:datatype xsd:string ;\n            sh:description \"String that is shared by subj/obj. It is recommended to indicate the fields for the match using the object and subject_match_field slots.\" ;\n            sh:nodeKind sh:Literal ;\n            sh:order 41 ;\n            sh:path sssom:match_string ],\n        [ sh:datatype xsd:string ;\n            sh:description \"A curation rule is a (potentially) complex condition executed by an agent that led to the establishment of a mapping. Curation rules often involve complex domain-specific considerations, which are hard to capture in an automated fashion. The curation rule should be captured as a resource (entity reference) rather than a string (see curation_rule element), which enables higher levels of transparency and sharing across mapping sets. The textual representation of curation rule is intended to be used in cases where the creation of a resource is not practical from the perspective of the mapping_provider.\" ;\n            sh:nodeKind sh:Literal ;\n            sh:order 38 ;\n            sh:path sssom:curation_rule_text ],\n        [ sh:datatype xsd:string ;\n            sh:description \"The label of subject of the mapping.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 2 ;\n            sh:path sssom:subject_label ] ;\n    sh:targetClass owl:Axiom .\n\nsssom:ExtensionDefinition a sh:NodeShape ;\n    rdfs:comment \"A definition of an extension (non-standard) slot.\" ;\n    sh:closed true ;\n    sh:ignoredProperties ( rdf:type ) ;\n    sh:property [ sh:datatype xsd:anyURI ;\n            sh:description \"The property associated with the extension slot. It is intended to provide a non-ambiguous meaning to the slot (contrary to the slot_name, which for brevity reasons may be ambiguous).\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 1 ;\n            sh:path sssom:property ],\n        [ sh:datatype xsd:string ;\n            sh:description \"The name of the extension slot.\" ;\n            sh:maxCount 1 ;\n            sh:minCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 0 ;\n            sh:path sssom:slot_name ],\n        [ sh:datatype xsd:anyURI ;\n            sh:description \"Expected type of the values of the extension slot.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 2 ;\n            sh:path sssom:type_hint ] ;\n    sh:targetClass sssom:ExtensionDefinition .\n\nsssom:MappingSetReference a sh:NodeShape ;\n    rdfs:comment \"A reference to a mapping set. It allows to augment mapping set metadata from the perspective of the registry, for example, providing confidence, or a local filename or a grouping.\" ;\n    sh:closed true ;\n    sh:ignoredProperties ( rdf:type ) ;\n    sh:property [ sh:datatype xsd:double ;\n            sh:description \"\"\"This value is set by the creator/maintainer of the mapping registry and reflects the confidence the mapping registry has in the correctness (i.e., precision) of mappings in the mapping set.\nWhen not explicitly specified, confidence estimation algorithms should consider the registry confidence in a mapping set to be 1.0 by default.\"\"\" ;\n            sh:maxCount 1 ;\n            sh:maxInclusive 1e+00 ;\n            sh:minInclusive 0e+00 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 2 ;\n            sh:path sssom:registry_confidence ],\n        [ sh:description \"A globally unique identifier for the mapping set (not each individual mapping). Should ideally be resolvable.\" ;\n            sh:maxCount 1 ;\n            sh:minCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 0 ;\n            sh:path sssom:mapping_set_id ],\n        [ sh:datatype xsd:date ;\n            sh:description \"The date this reference was last updated.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 4 ;\n            sh:path sssom:last_updated ],\n        [ sh:description \"A URL location from which to obtain a resource, such as a mapping set.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 1 ;\n            sh:path sssom:mirror_from ],\n        [ sh:datatype xsd:string ;\n            sh:description \"The local name assigned to file that corresponds to the downloaded mapping set.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 5 ;\n            sh:path sssom:local_name ],\n        [ sh:datatype xsd:string ;\n            sh:description \"Set by the owners of the mapping registry. A way to group related mapping sets for example for UI purposes.\" ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 3 ;\n            sh:path sssom:mapping_set_group ] ;\n    sh:targetClass sssom:MappingSetReference .\n\nsssom:Prefix a sh:NodeShape ;\n    sh:closed true ;\n    sh:ignoredProperties ( rdf:type ) ;\n    sh:property [ sh:datatype xsd:anyURI ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 1 ;\n            sh:path sssom:prefix_url ],\n        [ sh:datatype xsd:string ;\n            sh:maxCount 1 ;\n            sh:nodeKind sh:Literal ;\n            sh:order 0 ;\n            sh:path sssom:prefix_name ] ;\n    sh:targetClass sssom:Prefix .\n\n"
  },
  {
    "path": "project/shex/sssom_schema.shex",
    "content": "# metamodel_version: 1.7.0\nBASE <https://w3id.org/sssom/>\nPREFIX prov: <http://www.w3.org/ns/prov#>\nPREFIX skos: <http://www.w3.org/2004/02/skos/core#>\nPREFIX owl: <http://www.w3.org/2002/07/owl#>\nPREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\nPREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\nPREFIX xsd: <http://www.w3.org/2001/XMLSchema#>\nPREFIX linkml: <https://w3id.org/linkml/>\nPREFIX pav: <http://purl.org/pav/>\nPREFIX dc1: <http://purl.org/dc/terms/>\n\n\n<EntityReference> rdfs:Resource\n\n<NonRelativeURI> IRI\n\nlinkml:String xsd:string\n\nlinkml:Integer xsd:integer\n\nlinkml:Boolean xsd:boolean\n\nlinkml:Float xsd:float\n\nlinkml:Double xsd:double\n\nlinkml:Decimal xsd:decimal\n\nlinkml:Time xsd:time\n\nlinkml:Date xsd:date\n\nlinkml:Datetime xsd:dateTime\n\nlinkml:DateOrDatetime linkml:DateOrDatetime\n\nlinkml:Uriorcurie IRI\n\nlinkml:Curie xsd:string\n\nlinkml:Uri IRI\n\nlinkml:Ncname xsd:string\n\nlinkml:Objectidentifier IRI\n\nlinkml:Nodeidentifier NONLITERAL\n\nlinkml:Jsonpointer xsd:string\n\nlinkml:Jsonpath xsd:string\n\nlinkml:Sparqlpath xsd:string\n\n<ExtensionDefinition> CLOSED {\n    (  $<ExtensionDefinition_tes> (  <slot_name> @linkml:Ncname ;\n          <property> @linkml:Uriorcurie ? ;\n          <type_hint> @linkml:Uriorcurie ?\n       ) ;\n       rdf:type [ <ExtensionDefinition> ] ?\n    )\n}\n\n<Mapping> CLOSED {\n    (  $<Mapping_tes> (  <record_id> @<EntityReference> ? ;\n          owl:annotatedSource @<EntityReference> ? ;\n          <subject_label> @linkml:String ? ;\n          <subject_category> @linkml:String ? ;\n          owl:annotatedProperty @<EntityReference> ;\n          <predicate_label> @linkml:String ? ;\n          <predicate_modifier> [ <NegatedPredicate> ] ? ;\n          owl:annotatedTarget @<EntityReference> ? ;\n          <object_label> @linkml:String ? ;\n          <object_category> @linkml:String ? ;\n          <mapping_justification> @<EntityReference> ;\n          pav:authoredBy @<EntityReference> * ;\n          <author_label> @linkml:String * ;\n          <reviewer_id> @<EntityReference> * ;\n          <reviewer_label> @linkml:String * ;\n          dc1:creator @<EntityReference> * ;\n          <creator_label> @linkml:String * ;\n          dc1:license @<NonRelativeURI> ? ;\n          <subject_type> [ owl:Class owl:ObjectProperty owl:DataProperty owl:AnnotationProperty owl:NamedIndividual skos:Concept\n             rdfs:Resource rdfs:Class rdfs:Literal rdfs:Datatype rdf:Property <ComposedEntityExpression> ] ? ;\n          <subject_source> @<EntityReference> ? ;\n          <subject_source_version> @linkml:String ? ;\n          <object_type> [ owl:Class owl:ObjectProperty owl:DataProperty owl:AnnotationProperty owl:NamedIndividual skos:Concept\n             rdfs:Resource rdfs:Class rdfs:Literal rdfs:Datatype rdf:Property <ComposedEntityExpression> ] ? ;\n          <object_source> @<EntityReference> ? ;\n          <object_source_version> @linkml:String ? ;\n          <predicate_type> [ owl:Class owl:ObjectProperty owl:DataProperty owl:AnnotationProperty owl:NamedIndividual skos:Concept\n             rdfs:Resource rdfs:Class rdfs:Literal rdfs:Datatype rdf:Property <ComposedEntityExpression> ] ? ;\n          <mapping_provider> @<NonRelativeURI> ? ;\n          <mapping_source> @<EntityReference> ? ;\n          <mapping_cardinality> [ <https://w3id.org/sssom/MappingCardinalityEnum#1%3A1>\n             <https://w3id.org/sssom/MappingCardinalityEnum#1%3An> <https://w3id.org/sssom/MappingCardinalityEnum#n%3A1>\n             <https://w3id.org/sssom/MappingCardinalityEnum#n%3An> <https://w3id.org/sssom/MappingCardinalityEnum#1%3A0>\n             <https://w3id.org/sssom/MappingCardinalityEnum#0%3A1> <https://w3id.org/sssom/MappingCardinalityEnum#0%3A0> ] ? ;\n          <cardinality_scope> @linkml:String * ;\n          <mapping_tool> @linkml:String ? ;\n          <mapping_tool_id> @<EntityReference> ? ;\n          <mapping_tool_version> @linkml:String ? ;\n          dc1:created @linkml:Date ? ;\n          dc1:issued @linkml:Date ? ;\n          <review_date> @linkml:Date ? ;\n          <confidence> @linkml:Double ? ;\n          <reviewer_agreement> @linkml:Double ? ;\n          <curation_rule> @<EntityReference> * ;\n          <curation_rule_text> @linkml:String * ;\n          <subject_match_field> @<EntityReference> * ;\n          <object_match_field> @<EntityReference> * ;\n          <match_string> @linkml:String * ;\n          <subject_preprocessing> @<EntityReference> * ;\n          <object_preprocessing> @<EntityReference> * ;\n          <similarity_score> @linkml:Double ? ;\n          <similarity_measure> @linkml:String ? ;\n          rdfs:seeAlso @<NonRelativeURI> * ;\n          <issue_tracker_item> @<EntityReference> ? ;\n          <other> @linkml:String ? ;\n          rdfs:comment @linkml:String ?\n       ) ;\n       rdf:type [ owl:Axiom ] ?\n    )\n}\n\n<MappingRegistry> CLOSED {\n    (  $<MappingRegistry_tes> (  <mapping_registry_id> @<EntityReference> ;\n          <mapping_registry_title> @linkml:String ? ;\n          <mapping_registry_description> @linkml:String ? ;\n          <imports> @<NonRelativeURI> * ;\n          <mapping_set_references> @<MappingSetReference> * ;\n          <documentation> @<NonRelativeURI> ? ;\n          <homepage> @<NonRelativeURI> ? ;\n          <issue_tracker> @<NonRelativeURI> ?\n       ) ;\n       rdf:type [ <MappingRegistry> ] ?\n    )\n}\n\n<MappingSet> CLOSED {\n    (  $<MappingSet_tes> (  <sssom_version> [ <version1.0> <version1.1> ] ? ;\n          <curie_map> @<Prefix> * ;\n          <mappings> @<Mapping> * ;\n          <mapping_set_id> @<NonRelativeURI> ;\n          owl:versionInfo @linkml:String ? ;\n          prov:wasDerivedFrom @<NonRelativeURI> * ;\n          dc1:title @linkml:String ? ;\n          dc1:description @linkml:String ? ;\n          <mapping_set_confidence> @linkml:Double ? ;\n          dc1:creator @<EntityReference> * ;\n          <creator_label> @linkml:String * ;\n          dc1:license @<NonRelativeURI> ;\n          <subject_type> [ owl:Class owl:ObjectProperty owl:DataProperty owl:AnnotationProperty owl:NamedIndividual skos:Concept\n             rdfs:Resource rdfs:Class rdfs:Literal rdfs:Datatype rdf:Property <ComposedEntityExpression> ] ? ;\n          <subject_source> @<EntityReference> ? ;\n          <subject_source_version> @linkml:String ? ;\n          <object_type> [ owl:Class owl:ObjectProperty owl:DataProperty owl:AnnotationProperty owl:NamedIndividual skos:Concept\n             rdfs:Resource rdfs:Class rdfs:Literal rdfs:Datatype rdf:Property <ComposedEntityExpression> ] ? ;\n          <object_source> @<EntityReference> ? ;\n          <object_source_version> @linkml:String ? ;\n          <predicate_type> [ owl:Class owl:ObjectProperty owl:DataProperty owl:AnnotationProperty owl:NamedIndividual skos:Concept\n             rdfs:Resource rdfs:Class rdfs:Literal rdfs:Datatype rdf:Property <ComposedEntityExpression> ] ? ;\n          <mapping_provider> @<NonRelativeURI> ? ;\n          <cardinality_scope> @linkml:String * ;\n          <mapping_tool> @linkml:String ? ;\n          <mapping_tool_id> @<EntityReference> ? ;\n          <mapping_tool_version> @linkml:String ? ;\n          dc1:created @linkml:Date ? ;\n          dc1:issued @linkml:Date ? ;\n          <subject_match_field> @<EntityReference> * ;\n          <object_match_field> @<EntityReference> * ;\n          <subject_preprocessing> @<EntityReference> * ;\n          <object_preprocessing> @<EntityReference> * ;\n          <similarity_measure> @linkml:String ? ;\n          <curation_rule> @<EntityReference> * ;\n          <curation_rule_text> @linkml:String * ;\n          rdfs:seeAlso @<NonRelativeURI> * ;\n          <issue_tracker> @<NonRelativeURI> ? ;\n          <other> @linkml:String ? ;\n          rdfs:comment @linkml:String ? ;\n          <extension_definitions> @<ExtensionDefinition> *\n       ) ;\n       rdf:type [ <MappingSet> ] ?\n    )\n}\n\n<MappingSetReference> CLOSED {\n    (  $<MappingSetReference_tes> (  <mapping_set_id> @<NonRelativeURI> ;\n          <mirror_from> @<NonRelativeURI> ? ;\n          <registry_confidence> @linkml:Double ? ;\n          <mapping_set_group> @linkml:String ? ;\n          <last_updated> @linkml:Date ? ;\n          <local_name> @linkml:String ?\n       ) ;\n       rdf:type [ <MappingSetReference> ] ?\n    )\n}\n\n<NoTermFound> CLOSED {\n    (  $<NoTermFound_tes> rdf:type . * ;\n       rdf:type [ <NoTermFound> ] ?\n    )\n}\n\n<Prefix> CLOSED {\n    (  $<Prefix_tes> (  <prefix_name> @linkml:Ncname ;\n          <prefix_url> @linkml:Uri ?\n       ) ;\n       rdf:type [ <Prefix> ]\n    )\n}\n\n<Propagatable> CLOSED {\n    (  $<Propagatable_tes> <propagated> @linkml:Boolean ? ;\n       rdf:type [ <Propagatable> ] ?\n    )\n}\n\n<Versionable> CLOSED {\n    (  $<Versionable_tes> <added_in> [ <version1.0> <version1.1> ] ? ;\n       rdf:type [ <Versionable> ] ?\n    )\n}\n"
  },
  {
    "path": "project/sqlschema/sssom_schema.sql",
    "content": "-- # Class: mapping set Description: Represents a set of mappings.\n--     * Slot: id\n--     * Slot: sssom_version Description: The version of the SSSOM specification a mapping set is compliant with.\n--     * Slot: mapping_set_id Description: A globally unique identifier for the mapping set (not each individual mapping). Should ideally be resolvable.\n--     * Slot: mapping_set_version Description: A version string for the mapping.\n--     * Slot: mapping_set_title Description: The display name of a mapping set.\n--     * Slot: mapping_set_description Description: A description of the mapping set.\n--     * Slot: mapping_set_confidence Description: Mapping-set level confidence is assigned by the creator of the mapping set to indicate their overall confidence in the correctness (i.e., precision) of mappings in the mapping set. Mapping set confidence is intended to be used in cases were the creator wants to express an overall confidence into the agent that curated the individual mappings, for example a lexical matching tool, or a group of students.When not explicitly specified, confidence estimation algorithms should consider the mapping set confidence to be 1.0 by default.\n--     * Slot: license Description: A url to the license of the mapping. In absence of a license we assume no license.\n--     * Slot: subject_type Description: The type of entity that is being mapped.\n--     * Slot: subject_source Description: URI of vocabulary or identifier source for the subject.\n--     * Slot: subject_source_version Description: Version IRI or version string of the source of the subject term.\n--     * Slot: object_type Description: The type of entity that is being mapped.\n--     * Slot: object_source Description: URI of vocabulary or identifier source for the object.\n--     * Slot: object_source_version Description: Version IRI or version string of the source of the object term.\n--     * Slot: predicate_type Description: The type of the predicate used to map the subject and object entities.\n--     * Slot: mapping_provider Description: URL pointing to the source that provided the mapping, for example an ontology that already contains the mappings, or a database from which it was derived.\n--     * Slot: mapping_tool Description: A reference to the tool or algorithm that was used to generate the mapping. Should be a URL pointing to more info about it, but can be free text. Consider using the mapping_tool_id slot for a more standardised reference.\n--     * Slot: mapping_tool_id Description: The ID (entity reference) of the tool or algorithm that was used to generate the mapping.\n--     * Slot: mapping_tool_version Description: Version string that denotes the version of the mapping tool used.\n--     * Slot: mapping_date Description: The date the mapping was asserted. This is different from the date the mapping was published or compiled in a SSSOM file.\n--     * Slot: publication_date Description: The date the mapping was published. This is different from the date the mapping was asserted.\n--     * Slot: similarity_measure Description: The measure used for computing a similarity score. This field is meant to be used in conjunction with the similarity_score field, to document, for example, the lexical or semantic match of a matching algorithm. To make processing this field as unambiguous as possible, we recommend using wikidata CURIEs, but the type of this field is deliberately unspecified.\n--     * Slot: issue_tracker Description: A URL location of the issue tracker for this entity.\n--     * Slot: other Description: Pipe separated list of key value pairs for properties not part of the SSSOM spec. Can be used to encode additional provenance data. NOTE. This field is not recommended for general use, and should be used sparingly. See https://github.com/mapping-commons/sssom/blob/master/examples/schema/extension-slots.sssom.tsv for an alternative approach based on extension slots.\n--     * Slot: comment Description: Free text field containing either curator notes or text generated by tool providing additional informative information.\n-- # Class: mapping Description: Represents an individual mapping between a pair of entities.\n--     * Slot: id\n--     * Slot: record_id Description: A unique identifier for a mapping record, that is for an instance of the Mapping class (in the SSSOM/TSV serialisation, this corresponds to an individual row after propagation is applied). This slot is intended to uniquely identify one such record within a mapping set and may for example act as the resource identifier for the record when it is serialised into RDF. This slot MUST NOT be used to “group” several records together to indicate that they pertain to a single mapping (for example, that they represent different versions of the same mapping), by assigning the same ID to several records. When it is used, every record within a set MUST have a unique, non-empty value. The identifier MUST be a URI; beyond that, its format is unconstrained and the identifier MUST be treated as an opaque string.\n--     * Slot: subject_id Description: The ID of the subject of the mapping.\n--     * Slot: subject_label Description: The label of subject of the mapping.\n--     * Slot: subject_category Description: The conceptual category to which the subject belongs to. This can be a string denoting the category or a term from a controlled vocabulary. This slot is deliberately underspecified. Conceptual categories can range from those that are found in general upper ontologies such as BFO (e.g. process, temporal region, etc) to those that serve as upper ontologies in specific domains, such as COB or BioLink (e.g. gene, disease, chemical entity). The purpose of this optional field is documentation for human reviewers - when a category is known and documented clearly, the cost of interpreting and evaluating the mapping decreases.\n--     * Slot: predicate_id Description: The ID of the predicate or relation that relates the subject and object of this match.\n--     * Slot: predicate_label Description: The label of the predicate/relation of the mapping.\n--     * Slot: predicate_modifier Description: A modifier for negating the predicate. See https://github.com/mapping-commons/sssom/issues/40 for discussion\n--     * Slot: object_id Description: The ID of the object of the mapping.\n--     * Slot: object_label Description: The label of object of the mapping.\n--     * Slot: object_category Description: The conceptual category to which the subject belongs to. This can be a string denoting the category or a term from a controlled vocabulary. This slot is deliberately underspecified. Conceptual categories can range from those that are found in general upper ontologies such as BFO (e.g. process, temporal region, etc) to those that serve as upper ontologies in specific domains, such as COB or BioLink (e.g. gene, disease, chemical entity). The purpose of this optional field is documentation for human reviewers - when a category is known and documented clearly, the cost of interpreting and evaluating the mapping decreases.\n--     * Slot: mapping_justification Description: A mapping justification is an action (or the written representation of that action) of showing a mapping to be right or reasonable.\n--     * Slot: license Description: A url to the license of the mapping. In absence of a license we assume no license.\n--     * Slot: subject_type Description: The type of entity that is being mapped.\n--     * Slot: subject_source Description: URI of vocabulary or identifier source for the subject.\n--     * Slot: subject_source_version Description: Version IRI or version string of the source of the subject term.\n--     * Slot: object_type Description: The type of entity that is being mapped.\n--     * Slot: object_source Description: URI of vocabulary or identifier source for the object.\n--     * Slot: object_source_version Description: Version IRI or version string of the source of the object term.\n--     * Slot: predicate_type Description: The type of the predicate used to map the subject and object entities.\n--     * Slot: mapping_provider Description: URL pointing to the source that provided the mapping, for example an ontology that already contains the mappings, or a database from which it was derived.\n--     * Slot: mapping_source Description: The mapping set this mapping was originally defined in. mapping_source is used for example when merging multiple mapping sets or deriving one mapping set from another.\n--     * Slot: mapping_cardinality Description: A value indicating whether the subject (respectively object) of this mapping record is present in other records involving a different object (respectively subject), within the subset of records defined by the cardinality_scope slot (or within the entire mapping set if cardinality_scope is undefined). Note that this is a convenience field, whose values can always be derived from the mapping set.\n--     * Slot: mapping_tool Description: A reference to the tool or algorithm that was used to generate the mapping. Should be a URL pointing to more info about it, but can be free text. Consider using the mapping_tool_id slot for a more standardised reference.\n--     * Slot: mapping_tool_id Description: The ID (entity reference) of the tool or algorithm that was used to generate the mapping.\n--     * Slot: mapping_tool_version Description: Version string that denotes the version of the mapping tool used.\n--     * Slot: mapping_date Description: The date the mapping was asserted. This is different from the date the mapping was published or compiled in a SSSOM file.\n--     * Slot: publication_date Description: The date the mapping was published. This is different from the date the mapping was asserted.\n--     * Slot: review_date Description: The date the mapping was reviewed. This is different from the date the mapping was asserted and published. If this field is used in a mapping, reviewer_id and/or reviewer_label MUST also be be set.\n--     * Slot: confidence Description: A value assigned by the creator of the mapping to denote the creator's confidence or estimated probability that the mapping record is correct. A value of 1.0 means the creator has full confidence in the correctness of the mapping record, while a value of 0.0 means the creator is fully unsure whether the mapping record is correct or not.When not explicitly specified, confidence estimation algorithms should consider the mapping confidence to be 1.0 by default.\n--     * Slot: reviewer_agreement Description: A value assigned by the reviewer of the mapping to denote their confidence that the mapping record is correct. A value of 1.0 means the reviewer fully agrees with the mapping record. A value of -1.0 means the reviewer fully disagrees with the mapping record. A value of 0.0 means the reviewer is not sure whether the mapping record is correct or not.When not explicitly specified, confidence estimation algorithms should consider the reviewer agreement to be 1.0 by default.\n--     * Slot: similarity_score Description: A score between 0 and 1 to denote the similarity between two entities, where 1 denotes equivalence, and 0 denotes disjointness. The score is meant to be used in conjunction with the similarity_measure field, to document, for example, the lexical or semantic match of a matching algorithm.\n--     * Slot: similarity_measure Description: The measure used for computing a similarity score. This field is meant to be used in conjunction with the similarity_score field, to document, for example, the lexical or semantic match of a matching algorithm. To make processing this field as unambiguous as possible, we recommend using wikidata CURIEs, but the type of this field is deliberately unspecified.\n--     * Slot: issue_tracker_item Description: The issue tracker item discussing this mapping.\n--     * Slot: other Description: Pipe separated list of key value pairs for properties not part of the SSSOM spec. Can be used to encode additional provenance data. NOTE. This field is not recommended for general use, and should be used sparingly. See https://github.com/mapping-commons/sssom/blob/master/examples/schema/extension-slots.sssom.tsv for an alternative approach based on extension slots.\n--     * Slot: comment Description: Free text field containing either curator notes or text generated by tool providing additional informative information.\n--     * Slot: mapping set_id Description: Autocreated FK slot\n-- # Class: mapping registry Description: A registry for managing mapping sets. It holds a set of mapping set references, and can import other registries.\n--     * Slot: id\n--     * Slot: mapping_registry_id Description: The unique identifier of a mapping registry.\n--     * Slot: mapping_registry_title Description: The title of a mapping registry.\n--     * Slot: mapping_registry_description Description: The description of a mapping registry.\n--     * Slot: documentation Description: A URL to the documentation of this mapping commons.\n--     * Slot: homepage Description: A URL to a homepage of this mapping commons.\n--     * Slot: issue_tracker Description: A URL location of the issue tracker for this entity.\n-- # Class: mapping set reference Description: A reference to a mapping set. It allows to augment mapping set metadata from the perspective of the registry, for example, providing confidence, or a local filename or a grouping.\n--     * Slot: id\n--     * Slot: mapping_set_id Description: A globally unique identifier for the mapping set (not each individual mapping). Should ideally be resolvable.\n--     * Slot: mirror_from Description: A URL location from which to obtain a resource, such as a mapping set.\n--     * Slot: registry_confidence Description: This value is set by the creator/maintainer of the mapping registry and reflects the confidence the mapping registry has in the correctness (i.e., precision) of mappings in the mapping set.When not explicitly specified, confidence estimation algorithms should consider the registry confidence in a mapping set to be 1.0 by default.\n--     * Slot: mapping_set_group Description: Set by the owners of the mapping registry. A way to group related mapping sets for example for UI purposes.\n--     * Slot: last_updated Description: The date this reference was last updated.\n--     * Slot: local_name Description: The local name assigned to file that corresponds to the downloaded mapping set.\n-- # Class: prefix\n--     * Slot: prefix_name\n--     * Slot: prefix_url\n--     * Slot: mapping set_id Description: Autocreated FK slot\n-- # Class: extension definition Description: A definition of an extension (non-standard) slot.\n--     * Slot: id\n--     * Slot: slot_name Description: The name of the extension slot.\n--     * Slot: property Description: The property associated with the extension slot. It is intended to provide a non-ambiguous meaning to the slot (contrary to the slot_name, which for brevity reasons may be ambiguous).\n--     * Slot: type_hint Description: Expected type of the values of the extension slot.\n-- # Class: Propagatable Description: Metamodel extension class to describe slots whose value can be propagated down from the MappingSet class to the Mapping class.\n--     * Slot: id\n--     * Slot: propagated Description: Indicates whether a slot can be propagated from a mapping down to individual mappings.\n-- # Class: Versionable Description: Metamodel extension class to manage slots that may not exist in all versions of the model.\n--     * Slot: id\n--     * Slot: added_in Description: The version of the specification in which the slot was added. If not specified, the slot must be assumed to have been added in version 1.0.\n-- # Class: NoTermFound Description: sssom:NoTermFound can be used in place of a subject_id or object_id when the corresponding entity could not be found. It SHOULD be used in conjunction with a corresponding subject_source or object_source to signify where the term was not found.\n--     * Slot: id\n-- # Class: mapping set_mapping_set_source\n--     * Slot: mapping set_id Description: Autocreated FK slot\n--     * Slot: mapping_set_source Description: A mapping set or set of mapping set that was used to derive the mapping set.\n-- # Class: mapping set_creator_id\n--     * Slot: mapping set_id Description: Autocreated FK slot\n--     * Slot: creator_id Description: Identifies the persons or groups responsible for the creation of the mapping. The creator is the agent that put the mapping in its published form, which may be different from the author, which is a person that was actively involved in the assertion of the mapping. Recommended to be a list of ORCIDs or otherwise identifying URIs.\n-- # Class: mapping set_creator_label\n--     * Slot: mapping set_id Description: Autocreated FK slot\n--     * Slot: creator_label Description: A string representing the creator of this mapping. This should only be used in the absence of a proper semantic identifier (which would be stored in creator_id) for that creator. It is not expected that there should be any link between creator_id and creator_label; in particular, creator_label is not intended to provide a human-friendly version of an identifier in creator_id.\n-- # Class: mapping set_cardinality_scope\n--     * Slot: mapping set_id Description: Autocreated FK slot\n--     * Slot: cardinality_scope Description: A list of mapping slots that define the scope for the value found in the mapping_cardinality slot. Mappings are considered to belong to the same scope if they have the same value for all slots listed in the scope. If no scope is defined, the default scope is empty, meaning that all mappings belong to a single scope that is identical to the entire mapping set. The behaviour if a value in the list does not correspond to a valid slot name is undefined.\n-- # Class: mapping set_subject_match_field\n--     * Slot: mapping set_id Description: Autocreated FK slot\n--     * Slot: subject_match_field Description: A list of properties, annotations or attributes related to the subject that was used to establish the match. This property is recommended for use in conjunction with  mapping justifications related to lexical matching, such as `semapv:LexicalMatching`.  For additional information see the 'See Also' section.\n-- # Class: mapping set_object_match_field\n--     * Slot: mapping set_id Description: Autocreated FK slot\n--     * Slot: object_match_field Description: A list of properties, annotations or attributes related to the object that was used to establish the match. This property is recommended for use in conjunction with  mapping justifications related to lexical matching, such as `semapv:LexicalMatching`.  For additional information see the 'See Also' section.\n-- # Class: mapping set_subject_preprocessing\n--     * Slot: mapping set_id Description: Autocreated FK slot\n--     * Slot: subject_preprocessing Description: Method of preprocessing applied to the fields of the subject. If different preprocessing steps were performed on different fields, it is recommended to store the match in separate rows.\n-- # Class: mapping set_object_preprocessing\n--     * Slot: mapping set_id Description: Autocreated FK slot\n--     * Slot: object_preprocessing Description: Method of preprocessing applied to the fields of the object. If different preprocessing steps were performed on different fields, it is recommended to store the match in separate rows.\n-- # Class: mapping set_curation_rule\n--     * Slot: mapping set_id Description: Autocreated FK slot\n--     * Slot: curation_rule Description: A curation rule is a (potentially) complex condition executed by an agent that led to the establishment of a mapping. Curation rules often involve complex domain-specific considerations, which are hard to capture in an automated fashion. The curation rule is captured as a resource rather than a string, which enables higher levels of transparency and sharing across mapping sets. The URI representation of the curation rule is expected to be a resolvable identifier which provides details about the nature of the curation rule.\n-- # Class: mapping set_curation_rule_text\n--     * Slot: mapping set_id Description: Autocreated FK slot\n--     * Slot: curation_rule_text Description: A curation rule is a (potentially) complex condition executed by an agent that led to the establishment of a mapping. Curation rules often involve complex domain-specific considerations, which are hard to capture in an automated fashion. The curation rule should be captured as a resource (entity reference) rather than a string (see curation_rule element), which enables higher levels of transparency and sharing across mapping sets. The textual representation of curation rule is intended to be used in cases where the creation of a resource is not practical from the perspective of the mapping_provider.\n-- # Class: mapping set_see_also\n--     * Slot: mapping set_id Description: Autocreated FK slot\n--     * Slot: see_also Description: A URL specific for the mapping instance. E.g. for kboom we have a per-mapping image that shows surrounding axioms that drive probability. Could also be a github issue URL that discussed a complicated alignment\n-- # Class: mapping set_extension_definitions\n--     * Slot: mapping set_id Description: Autocreated FK slot\n--     * Slot: extension_definitions_id Description: A list that defines the extension slots used in the mapping set.\n-- # Class: mapping_author_id\n--     * Slot: mapping_id Description: Autocreated FK slot\n--     * Slot: author_id Description: Identifies the persons or groups responsible for asserting the mappings. Recommended to be a list of ORCIDs or otherwise identifying URIs.\n-- # Class: mapping_author_label\n--     * Slot: mapping_id Description: Autocreated FK slot\n--     * Slot: author_label Description: A string representing the author of this mapping. This should only be used in the absence of a proper semantic identifier (which would be stored in author_id) for that author. It is not expected that there should be any link between author_id and author_label; in particular, author_label is not intended to provide a human-friendly version of an identifier in author_id.\n-- # Class: mapping_reviewer_id\n--     * Slot: mapping_id Description: Autocreated FK slot\n--     * Slot: reviewer_id Description: Identifies the persons or groups that reviewed and confirmed the mapping. Recommended to be a list of ORCIDs or otherwise identifying URIs.\n-- # Class: mapping_reviewer_label\n--     * Slot: mapping_id Description: Autocreated FK slot\n--     * Slot: reviewer_label Description: A string representing the reviewer of this mapping. This should only be used in the absence of a proper semantic identifier (which would be stored in reviewer_id) for that reviewer. It is not expected that there should be any link between reviewer_id and reviewer_label; in particular, reviewer_label is not intended to provide a human-friendly version of an identifier in reviewer_id.\n-- # Class: mapping_creator_id\n--     * Slot: mapping_id Description: Autocreated FK slot\n--     * Slot: creator_id Description: Identifies the persons or groups responsible for the creation of the mapping. The creator is the agent that put the mapping in its published form, which may be different from the author, which is a person that was actively involved in the assertion of the mapping. Recommended to be a list of ORCIDs or otherwise identifying URIs.\n-- # Class: mapping_creator_label\n--     * Slot: mapping_id Description: Autocreated FK slot\n--     * Slot: creator_label Description: A string representing the creator of this mapping. This should only be used in the absence of a proper semantic identifier (which would be stored in creator_id) for that creator. It is not expected that there should be any link between creator_id and creator_label; in particular, creator_label is not intended to provide a human-friendly version of an identifier in creator_id.\n-- # Class: mapping_cardinality_scope\n--     * Slot: mapping_id Description: Autocreated FK slot\n--     * Slot: cardinality_scope Description: A list of mapping slots that define the scope for the value found in the mapping_cardinality slot. Mappings are considered to belong to the same scope if they have the same value for all slots listed in the scope. If no scope is defined, the default scope is empty, meaning that all mappings belong to a single scope that is identical to the entire mapping set. The behaviour if a value in the list does not correspond to a valid slot name is undefined.\n-- # Class: mapping_curation_rule\n--     * Slot: mapping_id Description: Autocreated FK slot\n--     * Slot: curation_rule Description: A curation rule is a (potentially) complex condition executed by an agent that led to the establishment of a mapping. Curation rules often involve complex domain-specific considerations, which are hard to capture in an automated fashion. The curation rule is captured as a resource rather than a string, which enables higher levels of transparency and sharing across mapping sets. The URI representation of the curation rule is expected to be a resolvable identifier which provides details about the nature of the curation rule.\n-- # Class: mapping_curation_rule_text\n--     * Slot: mapping_id Description: Autocreated FK slot\n--     * Slot: curation_rule_text Description: A curation rule is a (potentially) complex condition executed by an agent that led to the establishment of a mapping. Curation rules often involve complex domain-specific considerations, which are hard to capture in an automated fashion. The curation rule should be captured as a resource (entity reference) rather than a string (see curation_rule element), which enables higher levels of transparency and sharing across mapping sets. The textual representation of curation rule is intended to be used in cases where the creation of a resource is not practical from the perspective of the mapping_provider.\n-- # Class: mapping_subject_match_field\n--     * Slot: mapping_id Description: Autocreated FK slot\n--     * Slot: subject_match_field Description: A list of properties, annotations or attributes related to the subject that was used to establish the match. This property is recommended for use in conjunction with  mapping justifications related to lexical matching, such as `semapv:LexicalMatching`.  For additional information see the 'See Also' section.\n-- # Class: mapping_object_match_field\n--     * Slot: mapping_id Description: Autocreated FK slot\n--     * Slot: object_match_field Description: A list of properties, annotations or attributes related to the object that was used to establish the match. This property is recommended for use in conjunction with  mapping justifications related to lexical matching, such as `semapv:LexicalMatching`.  For additional information see the 'See Also' section.\n-- # Class: mapping_match_string\n--     * Slot: mapping_id Description: Autocreated FK slot\n--     * Slot: match_string Description: String that is shared by subj/obj. It is recommended to indicate the fields for the match using the object and subject_match_field slots.\n-- # Class: mapping_subject_preprocessing\n--     * Slot: mapping_id Description: Autocreated FK slot\n--     * Slot: subject_preprocessing Description: Method of preprocessing applied to the fields of the subject. If different preprocessing steps were performed on different fields, it is recommended to store the match in separate rows.\n-- # Class: mapping_object_preprocessing\n--     * Slot: mapping_id Description: Autocreated FK slot\n--     * Slot: object_preprocessing Description: Method of preprocessing applied to the fields of the object. If different preprocessing steps were performed on different fields, it is recommended to store the match in separate rows.\n-- # Class: mapping_see_also\n--     * Slot: mapping_id Description: Autocreated FK slot\n--     * Slot: see_also Description: A URL specific for the mapping instance. E.g. for kboom we have a per-mapping image that shows surrounding axioms that drive probability. Could also be a github issue URL that discussed a complicated alignment\n-- # Class: mapping registry_imports\n--     * Slot: mapping registry_id Description: Autocreated FK slot\n--     * Slot: imports Description: A list of registries that should be imported into this one.\n-- # Class: mapping registry_mapping_set_references\n--     * Slot: mapping registry_id Description: Autocreated FK slot\n--     * Slot: mapping_set_references_id Description: A list of mapping set references.\n\nCREATE TABLE \"mapping set\" (\n\tid INTEGER NOT NULL,\n\tsssom_version VARCHAR(3),\n\tmapping_set_id TEXT NOT NULL,\n\tmapping_set_version TEXT,\n\tmapping_set_title TEXT,\n\tmapping_set_description TEXT,\n\tmapping_set_confidence FLOAT,\n\tlicense TEXT NOT NULL,\n\tsubject_type VARCHAR(26),\n\tsubject_source TEXT,\n\tsubject_source_version TEXT,\n\tobject_type VARCHAR(26),\n\tobject_source TEXT,\n\tobject_source_version TEXT,\n\tpredicate_type VARCHAR(26),\n\tmapping_provider TEXT,\n\tmapping_tool TEXT,\n\tmapping_tool_id TEXT,\n\tmapping_tool_version TEXT,\n\tmapping_date DATE,\n\tpublication_date DATE,\n\tsimilarity_measure TEXT,\n\tissue_tracker TEXT,\n\tother TEXT,\n\tcomment TEXT,\n\tPRIMARY KEY (id)\n);\nCREATE INDEX \"ix_mapping set_id\" ON \"mapping set\" (id);\n\nCREATE TABLE \"mapping registry\" (\n\tid INTEGER NOT NULL,\n\tmapping_registry_id TEXT NOT NULL,\n\tmapping_registry_title TEXT,\n\tmapping_registry_description TEXT,\n\tdocumentation TEXT,\n\thomepage TEXT,\n\tissue_tracker TEXT,\n\tPRIMARY KEY (id)\n);\nCREATE INDEX \"ix_mapping registry_id\" ON \"mapping registry\" (id);\n\nCREATE TABLE \"mapping set reference\" (\n\tid INTEGER NOT NULL,\n\tmapping_set_id TEXT NOT NULL,\n\tmirror_from TEXT,\n\tregistry_confidence FLOAT,\n\tmapping_set_group TEXT,\n\tlast_updated DATE,\n\tlocal_name TEXT,\n\tPRIMARY KEY (id)\n);\nCREATE INDEX \"ix_mapping set reference_id\" ON \"mapping set reference\" (id);\n\nCREATE TABLE \"extension definition\" (\n\tid INTEGER NOT NULL,\n\tslot_name TEXT NOT NULL,\n\tproperty TEXT,\n\ttype_hint TEXT,\n\tPRIMARY KEY (id)\n);\nCREATE INDEX \"ix_extension definition_id\" ON \"extension definition\" (id);\n\nCREATE TABLE \"Propagatable\" (\n\tid INTEGER NOT NULL,\n\tpropagated BOOLEAN,\n\tPRIMARY KEY (id)\n);\nCREATE INDEX \"ix_Propagatable_id\" ON \"Propagatable\" (id);\n\nCREATE TABLE \"Versionable\" (\n\tid INTEGER NOT NULL,\n\tadded_in VARCHAR(3),\n\tPRIMARY KEY (id)\n);\nCREATE INDEX \"ix_Versionable_id\" ON \"Versionable\" (id);\n\nCREATE TABLE \"NoTermFound\" (\n\tid INTEGER NOT NULL,\n\tPRIMARY KEY (id)\n);\nCREATE INDEX \"ix_NoTermFound_id\" ON \"NoTermFound\" (id);\n\nCREATE TABLE mapping (\n\tid INTEGER NOT NULL,\n\trecord_id TEXT,\n\tsubject_id TEXT,\n\tsubject_label TEXT,\n\tsubject_category TEXT,\n\tpredicate_id TEXT NOT NULL,\n\tpredicate_label TEXT,\n\tpredicate_modifier VARCHAR(3),\n\tobject_id TEXT,\n\tobject_label TEXT,\n\tobject_category TEXT,\n\tmapping_justification TEXT NOT NULL,\n\tlicense TEXT,\n\tsubject_type VARCHAR(26),\n\tsubject_source TEXT,\n\tsubject_source_version TEXT,\n\tobject_type VARCHAR(26),\n\tobject_source TEXT,\n\tobject_source_version TEXT,\n\tpredicate_type VARCHAR(26),\n\tmapping_provider TEXT,\n\tmapping_source TEXT,\n\tmapping_cardinality VARCHAR(3),\n\tmapping_tool TEXT,\n\tmapping_tool_id TEXT,\n\tmapping_tool_version TEXT,\n\tmapping_date DATE,\n\tpublication_date DATE,\n\treview_date DATE,\n\tconfidence FLOAT,\n\treviewer_agreement FLOAT,\n\tsimilarity_score FLOAT,\n\tsimilarity_measure TEXT,\n\tissue_tracker_item TEXT,\n\tother TEXT,\n\tcomment TEXT,\n\t\"mapping set_id\" INTEGER,\n\tPRIMARY KEY (id),\n\tUNIQUE (record_id),\n\tFOREIGN KEY(\"mapping set_id\") REFERENCES \"mapping set\" (id)\n);\nCREATE INDEX mapping_record_id_idx ON mapping (record_id);\nCREATE INDEX ix_mapping_id ON mapping (id);\n\nCREATE TABLE prefix (\n\tprefix_name TEXT NOT NULL,\n\tprefix_url TEXT,\n\t\"mapping set_id\" INTEGER,\n\tPRIMARY KEY (prefix_name, prefix_url, \"mapping set_id\"),\n\tUNIQUE (\"mapping set_id\", prefix_name),\n\tFOREIGN KEY(\"mapping set_id\") REFERENCES \"mapping set\" (id)\n);\nCREATE INDEX \"prefix_mapping set_id_prefix_name_idx\" ON prefix (\"mapping set_id\", prefix_name);\nCREATE INDEX \"ix_prefix_mapping set_id\" ON prefix (\"mapping set_id\");\nCREATE INDEX ix_prefix_prefix_url ON prefix (prefix_url);\nCREATE INDEX ix_prefix_prefix_name ON prefix (prefix_name);\n\nCREATE TABLE \"mapping set_mapping_set_source\" (\n\t\"mapping set_id\" INTEGER,\n\tmapping_set_source TEXT,\n\tPRIMARY KEY (\"mapping set_id\", mapping_set_source),\n\tFOREIGN KEY(\"mapping set_id\") REFERENCES \"mapping set\" (id)\n);\nCREATE INDEX \"ix_mapping set_mapping_set_source_mapping_set_source\" ON \"mapping set_mapping_set_source\" (mapping_set_source);\nCREATE INDEX \"ix_mapping set_mapping_set_source_mapping set_id\" ON \"mapping set_mapping_set_source\" (\"mapping set_id\");\n\nCREATE TABLE \"mapping set_creator_id\" (\n\t\"mapping set_id\" INTEGER,\n\tcreator_id TEXT,\n\tPRIMARY KEY (\"mapping set_id\", creator_id),\n\tFOREIGN KEY(\"mapping set_id\") REFERENCES \"mapping set\" (id)\n);\nCREATE INDEX \"ix_mapping set_creator_id_creator_id\" ON \"mapping set_creator_id\" (creator_id);\nCREATE INDEX \"ix_mapping set_creator_id_mapping set_id\" ON \"mapping set_creator_id\" (\"mapping set_id\");\n\nCREATE TABLE \"mapping set_creator_label\" (\n\t\"mapping set_id\" INTEGER,\n\tcreator_label TEXT,\n\tPRIMARY KEY (\"mapping set_id\", creator_label),\n\tFOREIGN KEY(\"mapping set_id\") REFERENCES \"mapping set\" (id)\n);\nCREATE INDEX \"ix_mapping set_creator_label_mapping set_id\" ON \"mapping set_creator_label\" (\"mapping set_id\");\nCREATE INDEX \"ix_mapping set_creator_label_creator_label\" ON \"mapping set_creator_label\" (creator_label);\n\nCREATE TABLE \"mapping set_cardinality_scope\" (\n\t\"mapping set_id\" INTEGER,\n\tcardinality_scope TEXT,\n\tPRIMARY KEY (\"mapping set_id\", cardinality_scope),\n\tFOREIGN KEY(\"mapping set_id\") REFERENCES \"mapping set\" (id)\n);\nCREATE INDEX \"ix_mapping set_cardinality_scope_mapping set_id\" ON \"mapping set_cardinality_scope\" (\"mapping set_id\");\nCREATE INDEX \"ix_mapping set_cardinality_scope_cardinality_scope\" ON \"mapping set_cardinality_scope\" (cardinality_scope);\n\nCREATE TABLE \"mapping set_subject_match_field\" (\n\t\"mapping set_id\" INTEGER,\n\tsubject_match_field TEXT,\n\tPRIMARY KEY (\"mapping set_id\", subject_match_field),\n\tFOREIGN KEY(\"mapping set_id\") REFERENCES \"mapping set\" (id)\n);\nCREATE INDEX \"ix_mapping set_subject_match_field_subject_match_field\" ON \"mapping set_subject_match_field\" (subject_match_field);\nCREATE INDEX \"ix_mapping set_subject_match_field_mapping set_id\" ON \"mapping set_subject_match_field\" (\"mapping set_id\");\n\nCREATE TABLE \"mapping set_object_match_field\" (\n\t\"mapping set_id\" INTEGER,\n\tobject_match_field TEXT,\n\tPRIMARY KEY (\"mapping set_id\", object_match_field),\n\tFOREIGN KEY(\"mapping set_id\") REFERENCES \"mapping set\" (id)\n);\nCREATE INDEX \"ix_mapping set_object_match_field_object_match_field\" ON \"mapping set_object_match_field\" (object_match_field);\nCREATE INDEX \"ix_mapping set_object_match_field_mapping set_id\" ON \"mapping set_object_match_field\" (\"mapping set_id\");\n\nCREATE TABLE \"mapping set_subject_preprocessing\" (\n\t\"mapping set_id\" INTEGER,\n\tsubject_preprocessing TEXT,\n\tPRIMARY KEY (\"mapping set_id\", subject_preprocessing),\n\tFOREIGN KEY(\"mapping set_id\") REFERENCES \"mapping set\" (id)\n);\nCREATE INDEX \"ix_mapping set_subject_preprocessing_mapping set_id\" ON \"mapping set_subject_preprocessing\" (\"mapping set_id\");\nCREATE INDEX \"ix_mapping set_subject_preprocessing_subject_preprocessing\" ON \"mapping set_subject_preprocessing\" (subject_preprocessing);\n\nCREATE TABLE \"mapping set_object_preprocessing\" (\n\t\"mapping set_id\" INTEGER,\n\tobject_preprocessing TEXT,\n\tPRIMARY KEY (\"mapping set_id\", object_preprocessing),\n\tFOREIGN KEY(\"mapping set_id\") REFERENCES \"mapping set\" (id)\n);\nCREATE INDEX \"ix_mapping set_object_preprocessing_mapping set_id\" ON \"mapping set_object_preprocessing\" (\"mapping set_id\");\nCREATE INDEX \"ix_mapping set_object_preprocessing_object_preprocessing\" ON \"mapping set_object_preprocessing\" (object_preprocessing);\n\nCREATE TABLE \"mapping set_curation_rule\" (\n\t\"mapping set_id\" INTEGER,\n\tcuration_rule TEXT,\n\tPRIMARY KEY (\"mapping set_id\", curation_rule),\n\tFOREIGN KEY(\"mapping set_id\") REFERENCES \"mapping set\" (id)\n);\nCREATE INDEX \"ix_mapping set_curation_rule_mapping set_id\" ON \"mapping set_curation_rule\" (\"mapping set_id\");\nCREATE INDEX \"ix_mapping set_curation_rule_curation_rule\" ON \"mapping set_curation_rule\" (curation_rule);\n\nCREATE TABLE \"mapping set_curation_rule_text\" (\n\t\"mapping set_id\" INTEGER,\n\tcuration_rule_text TEXT,\n\tPRIMARY KEY (\"mapping set_id\", curation_rule_text),\n\tFOREIGN KEY(\"mapping set_id\") REFERENCES \"mapping set\" (id)\n);\nCREATE INDEX \"ix_mapping set_curation_rule_text_curation_rule_text\" ON \"mapping set_curation_rule_text\" (curation_rule_text);\nCREATE INDEX \"ix_mapping set_curation_rule_text_mapping set_id\" ON \"mapping set_curation_rule_text\" (\"mapping set_id\");\n\nCREATE TABLE \"mapping set_see_also\" (\n\t\"mapping set_id\" INTEGER,\n\tsee_also TEXT,\n\tPRIMARY KEY (\"mapping set_id\", see_also),\n\tFOREIGN KEY(\"mapping set_id\") REFERENCES \"mapping set\" (id)\n);\nCREATE INDEX \"ix_mapping set_see_also_mapping set_id\" ON \"mapping set_see_also\" (\"mapping set_id\");\nCREATE INDEX \"ix_mapping set_see_also_see_also\" ON \"mapping set_see_also\" (see_also);\n\nCREATE TABLE \"mapping set_extension_definitions\" (\n\t\"mapping set_id\" INTEGER,\n\textension_definitions_id INTEGER,\n\tPRIMARY KEY (\"mapping set_id\", extension_definitions_id),\n\tFOREIGN KEY(\"mapping set_id\") REFERENCES \"mapping set\" (id),\n\tFOREIGN KEY(extension_definitions_id) REFERENCES \"extension definition\" (id)\n);\nCREATE INDEX \"ix_mapping set_extension_definitions_mapping set_id\" ON \"mapping set_extension_definitions\" (\"mapping set_id\");\nCREATE INDEX \"ix_mapping set_extension_definitions_extension_definitions_id\" ON \"mapping set_extension_definitions\" (extension_definitions_id);\n\nCREATE TABLE \"mapping registry_imports\" (\n\t\"mapping registry_id\" INTEGER,\n\timports TEXT,\n\tPRIMARY KEY (\"mapping registry_id\", imports),\n\tFOREIGN KEY(\"mapping registry_id\") REFERENCES \"mapping registry\" (id)\n);\nCREATE INDEX \"ix_mapping registry_imports_mapping registry_id\" ON \"mapping registry_imports\" (\"mapping registry_id\");\nCREATE INDEX \"ix_mapping registry_imports_imports\" ON \"mapping registry_imports\" (imports);\n\nCREATE TABLE \"mapping registry_mapping_set_references\" (\n\t\"mapping registry_id\" INTEGER,\n\tmapping_set_references_id INTEGER,\n\tPRIMARY KEY (\"mapping registry_id\", mapping_set_references_id),\n\tFOREIGN KEY(\"mapping registry_id\") REFERENCES \"mapping registry\" (id),\n\tFOREIGN KEY(mapping_set_references_id) REFERENCES \"mapping set reference\" (id)\n);\nCREATE INDEX \"ix_mapping registry_mapping_set_references_mapping_set_references_id\" ON \"mapping registry_mapping_set_references\" (mapping_set_references_id);\nCREATE INDEX \"ix_mapping registry_mapping_set_references_mapping registry_id\" ON \"mapping registry_mapping_set_references\" (\"mapping registry_id\");\n\nCREATE TABLE mapping_author_id (\n\tmapping_id INTEGER,\n\tauthor_id TEXT,\n\tPRIMARY KEY (mapping_id, author_id),\n\tFOREIGN KEY(mapping_id) REFERENCES mapping (id)\n);\nCREATE INDEX ix_mapping_author_id_author_id ON mapping_author_id (author_id);\nCREATE INDEX ix_mapping_author_id_mapping_id ON mapping_author_id (mapping_id);\n\nCREATE TABLE mapping_author_label (\n\tmapping_id INTEGER,\n\tauthor_label TEXT,\n\tPRIMARY KEY (mapping_id, author_label),\n\tFOREIGN KEY(mapping_id) REFERENCES mapping (id)\n);\nCREATE INDEX ix_mapping_author_label_author_label ON mapping_author_label (author_label);\nCREATE INDEX ix_mapping_author_label_mapping_id ON mapping_author_label (mapping_id);\n\nCREATE TABLE mapping_reviewer_id (\n\tmapping_id INTEGER,\n\treviewer_id TEXT,\n\tPRIMARY KEY (mapping_id, reviewer_id),\n\tFOREIGN KEY(mapping_id) REFERENCES mapping (id)\n);\nCREATE INDEX ix_mapping_reviewer_id_reviewer_id ON mapping_reviewer_id (reviewer_id);\nCREATE INDEX ix_mapping_reviewer_id_mapping_id ON mapping_reviewer_id (mapping_id);\n\nCREATE TABLE mapping_reviewer_label (\n\tmapping_id INTEGER,\n\treviewer_label TEXT,\n\tPRIMARY KEY (mapping_id, reviewer_label),\n\tFOREIGN KEY(mapping_id) REFERENCES mapping (id)\n);\nCREATE INDEX ix_mapping_reviewer_label_mapping_id ON mapping_reviewer_label (mapping_id);\nCREATE INDEX ix_mapping_reviewer_label_reviewer_label ON mapping_reviewer_label (reviewer_label);\n\nCREATE TABLE mapping_creator_id (\n\tmapping_id INTEGER,\n\tcreator_id TEXT,\n\tPRIMARY KEY (mapping_id, creator_id),\n\tFOREIGN KEY(mapping_id) REFERENCES mapping (id)\n);\nCREATE INDEX ix_mapping_creator_id_creator_id ON mapping_creator_id (creator_id);\nCREATE INDEX ix_mapping_creator_id_mapping_id ON mapping_creator_id (mapping_id);\n\nCREATE TABLE mapping_creator_label (\n\tmapping_id INTEGER,\n\tcreator_label TEXT,\n\tPRIMARY KEY (mapping_id, creator_label),\n\tFOREIGN KEY(mapping_id) REFERENCES mapping (id)\n);\nCREATE INDEX ix_mapping_creator_label_creator_label ON mapping_creator_label (creator_label);\nCREATE INDEX ix_mapping_creator_label_mapping_id ON mapping_creator_label (mapping_id);\n\nCREATE TABLE mapping_cardinality_scope (\n\tmapping_id INTEGER,\n\tcardinality_scope TEXT,\n\tPRIMARY KEY (mapping_id, cardinality_scope),\n\tFOREIGN KEY(mapping_id) REFERENCES mapping (id)\n);\nCREATE INDEX ix_mapping_cardinality_scope_cardinality_scope ON mapping_cardinality_scope (cardinality_scope);\nCREATE INDEX ix_mapping_cardinality_scope_mapping_id ON mapping_cardinality_scope (mapping_id);\n\nCREATE TABLE mapping_curation_rule (\n\tmapping_id INTEGER,\n\tcuration_rule TEXT,\n\tPRIMARY KEY (mapping_id, curation_rule),\n\tFOREIGN KEY(mapping_id) REFERENCES mapping (id)\n);\nCREATE INDEX ix_mapping_curation_rule_mapping_id ON mapping_curation_rule (mapping_id);\nCREATE INDEX ix_mapping_curation_rule_curation_rule ON mapping_curation_rule (curation_rule);\n\nCREATE TABLE mapping_curation_rule_text (\n\tmapping_id INTEGER,\n\tcuration_rule_text TEXT,\n\tPRIMARY KEY (mapping_id, curation_rule_text),\n\tFOREIGN KEY(mapping_id) REFERENCES mapping (id)\n);\nCREATE INDEX ix_mapping_curation_rule_text_curation_rule_text ON mapping_curation_rule_text (curation_rule_text);\nCREATE INDEX ix_mapping_curation_rule_text_mapping_id ON mapping_curation_rule_text (mapping_id);\n\nCREATE TABLE mapping_subject_match_field (\n\tmapping_id INTEGER,\n\tsubject_match_field TEXT,\n\tPRIMARY KEY (mapping_id, subject_match_field),\n\tFOREIGN KEY(mapping_id) REFERENCES mapping (id)\n);\nCREATE INDEX ix_mapping_subject_match_field_subject_match_field ON mapping_subject_match_field (subject_match_field);\nCREATE INDEX ix_mapping_subject_match_field_mapping_id ON mapping_subject_match_field (mapping_id);\n\nCREATE TABLE mapping_object_match_field (\n\tmapping_id INTEGER,\n\tobject_match_field TEXT,\n\tPRIMARY KEY (mapping_id, object_match_field),\n\tFOREIGN KEY(mapping_id) REFERENCES mapping (id)\n);\nCREATE INDEX ix_mapping_object_match_field_object_match_field ON mapping_object_match_field (object_match_field);\nCREATE INDEX ix_mapping_object_match_field_mapping_id ON mapping_object_match_field (mapping_id);\n\nCREATE TABLE mapping_match_string (\n\tmapping_id INTEGER,\n\tmatch_string TEXT,\n\tPRIMARY KEY (mapping_id, match_string),\n\tFOREIGN KEY(mapping_id) REFERENCES mapping (id)\n);\nCREATE INDEX ix_mapping_match_string_mapping_id ON mapping_match_string (mapping_id);\nCREATE INDEX ix_mapping_match_string_match_string ON mapping_match_string (match_string);\n\nCREATE TABLE mapping_subject_preprocessing (\n\tmapping_id INTEGER,\n\tsubject_preprocessing TEXT,\n\tPRIMARY KEY (mapping_id, subject_preprocessing),\n\tFOREIGN KEY(mapping_id) REFERENCES mapping (id)\n);\nCREATE INDEX ix_mapping_subject_preprocessing_subject_preprocessing ON mapping_subject_preprocessing (subject_preprocessing);\nCREATE INDEX ix_mapping_subject_preprocessing_mapping_id ON mapping_subject_preprocessing (mapping_id);\n\nCREATE TABLE mapping_object_preprocessing (\n\tmapping_id INTEGER,\n\tobject_preprocessing TEXT,\n\tPRIMARY KEY (mapping_id, object_preprocessing),\n\tFOREIGN KEY(mapping_id) REFERENCES mapping (id)\n);\nCREATE INDEX ix_mapping_object_preprocessing_object_preprocessing ON mapping_object_preprocessing (object_preprocessing);\nCREATE INDEX ix_mapping_object_preprocessing_mapping_id ON mapping_object_preprocessing (mapping_id);\n\nCREATE TABLE mapping_see_also (\n\tmapping_id INTEGER,\n\tsee_also TEXT,\n\tPRIMARY KEY (mapping_id, see_also),\n\tFOREIGN KEY(mapping_id) REFERENCES mapping (id)\n);\nCREATE INDEX ix_mapping_see_also_see_also ON mapping_see_also (see_also);\nCREATE INDEX ix_mapping_see_also_mapping_id ON mapping_see_also (mapping_id);\n"
  },
  {
    "path": "project.Makefile",
    "content": "## Add your own custom Makefile targets here\n# Added by H2\nEXCEL_DIR = $(DEST)/excel\n\ngen-excel:\n\tmkdir -p $(EXCEL_DIR)\n\t$(RUN) gen-excel --output $(EXCEL_DIR)/sssom_schema.xlsx $(SOURCE_SCHEMA_PATH)\n\nbuild:\n\tuv build\n\npypi:\n\tuv publish\n\n#######################################\n##### Mapping validation  #############\n#######################################\n\nMAPPING_DIR_SCHEMA=examples/schema\nMAPPING_DIR_EMBEDDED=examples/embedded\nTMPDIR = tmp\n\nvalidate-example-schema-%:\n\tmkdir -p $(TMPDIR)\n\ttsvalid $(MAPPING_DIR_SCHEMA)/$*.sssom.tsv --comment \"#\" --skip E1\n\tsssom validate $(MAPPING_DIR_SCHEMA)/$*.sssom.tsv\n\tsssom convert $(MAPPING_DIR_SCHEMA)/$*.sssom.tsv -o $(TMPDIR)/schema-$*.sssom.ttl\n\nvalidate-example-embedded-%:\n\tmkdir -p $(TMPDIR)\n\ttsvalid $(MAPPING_DIR_EMBEDDED)/$*.sssom.tsv --comment \"#\" --skip E1\n\tsssom validate $(MAPPING_DIR_EMBEDDED)/$*.sssom.tsv\n\tsssom convert $(MAPPING_DIR_EMBEDDED)/$*.sssom.tsv -o $(TMPDIR)/embedded-$*.sssom.ttl\n\nMAPPINGS_SCHEMA=$(notdir $(wildcard $(MAPPING_DIR_SCHEMA)/*.sssom.tsv))\nVALIDATE_MAPPINGS_SCHEMA=$(patsubst %.sssom.tsv, validate-example-schema-%, $(notdir $(wildcard $(MAPPING_DIR_SCHEMA)/*.sssom.tsv)))\n\nMAPPINGS_EMBEDDED=$(notdir $(wildcard $(MAPPING_DIR_EMBEDDED)/*.sssom.tsv))\nVALIDATE_MAPPINGS_EMBEDDED=$(patsubst %.sssom.tsv, validate-example-embedded-%, $(notdir $(wildcard $(MAPPING_DIR_EMBEDDED)/*.sssom.tsv)))\n\nvalidate_mappings: \n\t$(MAKE) $(VALIDATE_MAPPINGS_SCHEMA)\n\t$(MAKE) $(VALIDATE_MAPPINGS_EMBEDDED)\n"
  },
  {
    "path": "pyproject.toml",
    "content": "[build-system]\nrequires = [\"poetry-core>=1.0.0\", \"poetry-dynamic-versioning\"]\nbuild-backend = \"poetry_dynamic_versioning.backend\"\n\n[project]\nname = \"sssom-schema\"\ndescription = \"SSSOM is a Simple Standard for Sharing Ontology Mappings.\"\nauthors = [\n  {name = \"Nicolas Matentzoglu\", email = \"nicolas.matentzoglu@gmail.com\"},\n  {name = \"Harshad Hegde\", email = \"hhegde@lbl.gov\"},\n]\nlicense = \"MIT\"\nlicense-files = [\"LICENSE\"]\nreadme = \"README.md\"\nkeywords = [\"schema\", \"ontology\", \"mappings\", \"sssom\"]\nclassifiers = [\n    \"Development Status :: 5 - Production/Stable\",\n    \"Environment :: Console\",\n    \"Intended Audience :: Developers\",\n    \"Intended Audience :: Science/Research\",\n    \"Topic :: Software Development :: Libraries :: Python Modules\",\n    \"Programming Language :: Python :: 3.10\",\n    \"Programming Language :: Python :: 3.11\",\n    \"Programming Language :: Python :: 3.12\",\n    \"Programming Language :: Python :: 3.13\",\n    \"Programming Language :: Python :: 3.14\",\n]\nrequires-python = \">=3.10.0\"\ndynamic = [\"version\"]\ndependencies = [\n    \"jinjanator\",\n    \"linkml>=1.10.0\",\n    \"linkml-runtime>=1.10.0\",\n]\n\n[dependency-groups]\ntests = [\n    \"pytest\"\n]\ndocs = [\n    \"mkdocs-material==9.0.0\",\n    \"mkdocs-mermaid2-plugin==1.1.1\",\n    \"mike\"\n]\n\n[tool.poetry]\nrequires-poetry = \">=2.0\"\nversion = \"0.0.0\"\n\n[tool.poetry.dependencies]\npython = \"^3.10\"\n\n[tool.poetry.requires-plugins]\npoetry-dynamic-versioning = \">=1.8.2\"\n\n[tool.poetry-dynamic-versioning]\nenable = true\nvcs = \"git\"\nstyle = \"pep440\"\n\n[tool.codespell]\n# Ref: https://github.com/codespell-project/codespell#using-a-config-file\nskip = '.git*,*.pdf,*.lock,*.svg'\ncheck-hidden = true\nignore-regex = '\\b(COMENT|EHR|LOD)\\b'\nignore-words-list = 'disjointness'\n"
  },
  {
    "path": "run.sh",
    "content": "#!/bin/sh\n# Wrapper script for docker.\n#\n# This is used primarily for wrapping the GNU Make workflow.\n# Instead of typing \"make TARGET\", type \"./run.sh make TARGET\".\n# This will run the make workflow within a docker container.\n#\n# The assumption is that you are working in the src/ontology folder;\n# we therefore map the whole repo (../..) to a docker volume.\n#\n# See README-editors.md for more details.\ndocker run -v $PWD:/work -w /work -e ROBOT_JAVA_ARGS='-Xmx8G' --rm -ti obolibrary/odkfull \"$@\""
  },
  {
    "path": "scripts/gh_table.pl",
    "content": "#!/usr/bin/perl\n\nmy $n=0;\nmy $len;\nmy $hlen;\nwhile(<>) {\n    chomp;\n    if ($n==0 && m@^\\#@) {\n        s@^\\#@@;\n    }\n    my (@vals) = split(/\\t/,$_);\n    @vals = map {s@\\|@, @g; $_} @vals;\n    if (!$hlen) {\n        $hlen = scalar(@vals);\n    }\n    while (scalar(@vals) < $hlen) {\n        push(@vals, '');\n    }\n    print '|'.join('|',@vals).\"|\\n\";\n    $nulen = scalar(@vals);\n    if ($n > 0) {\n        if ($len ne $nulen) {\n            print STDERR \"MISMATCH: $len != $nulen\\n\";\n        }\n    }\n    $len = $nulen;\n    if ($n ==0) {\n        @vals = map {\"---\"} @vals;\n        print '|'.join('|',@vals).\"|\\n\";\n    }\n    $n++;\n}"
  },
  {
    "path": "src/CONFIG.yaml",
    "content": "model_organization: mapping-commons # Name of github individual organization where this cone exists (e.g. linkml / mygithub\nmodel_name: sssom # Name of target repository (e.g. my-wonderful-model)\nroot_schema: sssom # the name of the base schema file (w/o .yaml)\nmodel_root_class: MappingSet # <name of the base class in the schema for testing\n\nmodel_author: ABC # Your name\nmodel_author_email: abc@xyz # Your email\nmodel_synopsis: SSSOM # One liner about the model\nmodel_description: |- # Longer description of the model\n  SSSOM\n\n# Trove Classifiers (https://pypi.org/classifiers/) -- these can be omitted if the elements below are sufficient\nclassifiers:\n  - \"Development Status :: 4 - Beta\"\n  - \"Environment :: Console\"\n  - \"Intended Audience :: Developers\"\n  - \"Intended Audience :: Science/Research\"\n  - \"Intended Audience :: Information Technology\"\n  - \"License :: CC0 1.0 Universal (CC0 1.0) Public Domain Dedication\"\n  - \"Programming Language :: Python :: 3 :: Only\"\n  - \"Programming Language :: Python :: 3.7\"\n  - \"Programming Language :: Python :: 3.8\"\n  - \"Programming Language :: Python :: 3.9\"\n\n# Keywords -- these can also be omitted from this file if the below is ok\nkeywords: [linkml, LOD, Modeling, Linked open data, model]\n\n# Elements to be generated\n# See: https://github.com/linkml/linkml/generators/README.md for what the outputs look like\n# Possible values: graphql -- graphql schema for the model\n#                  json -- LinkML model definition in JSON syntax\n#                  jsonld_context -- JSON-LD context definitions for model\n#                  json_schema -- Model schema in json schema\n#                  owl -- OWL representation of model schema\n#                  rdf -- LinkML Model definition in RDF\n#                  shex -- LinkML model definition in ShEx\n#                  sqlddl -- SQL ddl of the model\n#                  model -- copy model/schema to distribution directory\ngenerate: [jsonld_context, json_schema, model]\n"
  },
  {
    "path": "src/doc-templates/class.md.jinja2",
    "content": "# Class: {{ gen.name(element) }}\n\n{%- if header -%}\n{{header}}\n{%- endif -%}\n\n\n{% if element.description %}\n{% set element_description_lines = element.description.split('\\n') %}\n{% for element_description_line in element_description_lines %}\n_{{ element_description_line }}_\n{% endfor %}\n{% endif %}\n\n{% if element.abstract %}\n* __NOTE__: this is an abstract class and should not be instantiated directly\n{% endif %}\n\nURI: {{ gen.uri_link(element) }}\n\n\n{% if diagram_type == \"er_diagram\" %}\n```{{ gen.mermaid_directive() }}\n{{ gen.mermaid_diagram([element.name]) }}\n```\n{% else %}\n{% include \"class_diagram.md.jinja2\" %}\n{% endif %}\n\n{% if schemaview.class_parents(element.name) or schemaview.class_children(element.name, mixins=False) %}\n\n## Inheritance\n{{ gen.inheritance_tree(element, mixins=True) }}\n{% else %}\n<!-- no inheritance hierarchy -->\n{% endif %}\n\n## Slots\n\n| Name | Cardinality and Range | Description | Inheritance |\n| ---  | --- | --- | --- |\n{% if gen.get_direct_slots(element)|length > 0 %}\n{%- for slot in gen.get_direct_slots(element) -%}\n| {{ gen.link(slot) }} | {{ gen.cardinality(slot) }} <br/> {{ gen.link(slot.range) }} | {{ slot.description|enshorten }} | direct |\n{% endfor -%}\n{% endif -%}\n{% if gen.get_indirect_slots(element)|length > 0 %}\n{%- for slot in gen.get_indirect_slots(element) -%}\n| {{ gen.link(slot) }} | {{ gen.cardinality(slot) }} <br/> {{ gen.link(slot.range) }} | {{ slot.description|enshorten }} | {{ gen.links(gen.get_slot_inherited_from(element.name, slot.name))|join(', ') }} |\n{% endfor -%}\n{% endif %}\n\n{% if schemaview.is_mixin(element.name) %}\n## Mixin Usage\n\n| mixed into | description |\n| --- | --- |\n{% for c in schemaview.class_children(element.name, is_a=False) -%}\n| {{ gen.link(c) }} | {{ schemaview.get_class(c).description|enshorten }} |\n{% endfor %}\n{% endif %}\n\n{% if schemaview.usage_index().get(element.name) %}\n## Usages\n\n| used by | used in | type | used |\n| ---  | --- | --- | --- |\n{% for usage in schemaview.usage_index().get(element.name) -%}\n| {{gen.link(usage.used_by)}} | {{gen.link(usage.slot)}} | {{usage.metaslot}} | {{ gen.link(usage.used) }} |\n{% endfor %}\n{% endif %}\n\n{% include \"common_metadata.md.jinja2\" %}\n\n\n{% if schemaview.get_mappings(element.name).items() -%}\n## Mappings\n\n| Mapping Type | Mapped Value |\n| ---  | ---  |\n{% for m, mt in schemaview.get_mappings(element.name).items() -%}\n{% if mt|length > 0 -%}\n| {{ m }} | {{ mt|join(', ') }} |\n{% endif -%}\n{% endfor %}\n\n{% endif -%}\n\n{% if gen.example_object_blobs(element.name) -%}\n## Examples\n{% for name, blob in gen.example_object_blobs(element.name) -%}\n### Example: {{name}}\n\n```yaml\n{{ blob }}\n```\n{% endfor %}\n{% endif %}\n\n\n## LinkML Source\n\n<!-- TODO: investigate https://stackoverflow.com/questions/37606292/how-to-create-tabbed-code-blocks-in-mkdocs-or-sphinx -->\n\n### Direct\n\n<details>\n```yaml\n{{gen.yaml(element)}}\n```\n</details>\n\n### Induced\n\n<details>\n```yaml\n{{gen.yaml(element, inferred=True)}}\n```\n</details>\n\n{%- if footer -%}\n{{footer}}\n{%- endif -%}"
  },
  {
    "path": "src/doc-templates/class_diagram.md.jinja2",
    "content": "{% if schemaview.class_parents(element.name) and schemaview.class_children(element.name) %}\n```{{ gen.mermaid_directive() }}\n classDiagram\n    class {{ gen.name(element) }}\n      {% for s in schemaview.class_parents(element.name)|sort(attribute='name') -%}\n        {{ gen.name(schemaview.get_element(s)) }} <|-- {{ gen.name(element) }}\n      {% endfor %}\n\n      {% for s in schemaview.class_children(element.name)|sort(attribute='name') -%}\n        {{ gen.name(element) }} <|-- {{ gen.name(schemaview.get_element(s)) }}\n      {% endfor %}\n      \n      {% for s in schemaview.class_induced_slots(element.name)|sort(attribute='name') -%}\n        {{ gen.name(element) }} : {{gen.name(s)}}\n        {% if s.range not in gen.all_type_object_names() %}\n          {{ gen.name(element) }} --|> {{ s.range }} : {{ gen.name(s) }}\n        {% endif %}\n      {% endfor %}\n```\n{% elif schemaview.class_parents(element.name) %}\n```{{ gen.mermaid_directive() }}\n classDiagram\n    class {{ gen.name(element) }}\n      {% for s in schemaview.class_parents(element.name)|sort(attribute='name') -%}\n        {{ gen.name(schemaview.get_element(s)) }} <|-- {{ gen.name(element) }}\n      {% endfor %}\n      {% for s in schemaview.class_induced_slots(element.name)|sort(attribute='name') -%}\n        {{ gen.name(element) }} : {{gen.name(s)}}\n        {% if s.range not in gen.all_type_object_names() %}\n          {{ gen.name(element) }} --|> {{ s.range }} : {{ gen.name(s) }}\n        {% endif %}\n      {% endfor %}\n```\n{% elif schemaview.class_children(element.name)  %}\n```{{ gen.mermaid_directive() }}\n classDiagram\n    class {{ gen.name(element) }}\n      {% for s in schemaview.class_children(element.name)|sort(attribute='name') -%}\n        {{ gen.name(element) }} <|-- {{ gen.name(schemaview.get_element(s)) }}\n      {% endfor %}\n      {% for s in schemaview.class_induced_slots(element.name)|sort(attribute='name') -%}\n        {{ gen.name(element) }} : {{gen.name(s)}}\n        {% if s.range not in gen.all_type_object_names() %}\n          {{ gen.name(element) }} --|> {{ s.range }} : {{ gen.name(s) }}\n        {% endif %}\n      {% endfor %}\n```\n{% else %}\n```{{ gen.mermaid_directive() }}\n classDiagram\n    class {{ gen.name(element) }}\n      {% for s in schemaview.class_induced_slots(element.name)|sort(attribute='name') -%}\n        {{ gen.name(element) }} : {{gen.name(s)}}\n        {% if s.range not in gen.all_type_object_names() %}\n          {{ gen.name(element) }} --|> {{ s.range }} : {{ gen.name(s) }}\n        {% endif %}\n      {% endfor %}\n```\n{% endif %}"
  },
  {
    "path": "src/doc-templates/common_metadata.md.jinja2",
    "content": "{% if element.aliases %}\n## Aliases\n\n{% for alias in element.aliases %}\n* {{ alias }}\n{%- endfor %}\n{% endif %}\n\n\n{% if element.examples %}\n## Examples\n\n| Value |\n| --- |\n{% for x in element.examples -%}\n| {{ x.value }} |\n{% endfor %}\n{% endif -%}\n\n{% if element.comments -%}\n## Comments\n\n{% for x in element.comments -%}\n* {{x}}\n{% endfor %}\n{% endif -%}\n\n{% if element.todos -%}\n## TODOs\n\n{% for x in element.todos -%}\n* {{x}}\n{% endfor %}\n{% endif -%}\n\n{% if element.see_also -%}\n## See Also\n\n{% for x in element.see_also -%}\n* {{ gen.uri_link(x) }}\n{% endfor %}\n{% endif -%}\n\n## Identifier and Mapping Information\n\n{% if element.id_prefixes %}\n### Valid ID Prefixes\n\nInstances of this class *should* have identifiers with one of the following prefixes:\n{% for p in element.id_prefixes %}\n* {{p}}\n{% endfor %}\n\n{% endif %}\n\n\n{% if element.annotations %}\n### Annotations\n\n| property | value |\n| --- | --- |\n{% for a in element.annotations -%}\n{%- if a|string|first != '_' -%}\n| {{ a }} | {{ element.annotations[a].value }} |\n{%- endif -%}\n{% endfor %}\n{% endif %}\n\n{% if element.from_schema or element.imported_from %}\n### Schema Source\n\n{% if element.from_schema %}\n* from schema: {{ element.from_schema }}\n{% endif %}\n{% if element.imported_from %}\n* imported from: {{ element.imported_from }}\n{% endif %}\n{% endif %}"
  },
  {
    "path": "src/doc-templates/frontpage.md.jinja2",
    "content": "---\nhide:\n  - edit\n---\n\n[edit page](https://github.com/mapping-commons/sssom/edit/master/src/doc-templates/frontpage.md.jinja2)\n\n[//]: # (This file is automatically generated, please edit src/doc-templates/frontpage.md.jinja2)\n\n# Simple Standard for Sharing Ontological Mappings (SSSOM)\n\n![SSSOM banner](images/sssom-banner.png)\n\nThe Simple Standard for Sharing Ontological Mappings (SSSOM) is a community-driven standard designed to facilitate the exchange and integration of semantic entity mappings.\nAs data interoperability becomes increasingly crucial across various domains, SSSOM provides a standardized format to share mappings, enabling researchers and developers to more easily connect and utilize diverse datasets.\nBy establishing a common framework, SSSOM enhances the consistency, quality, and discoverability of mappings, thereby supporting more effective data integration and analysis.\n\n- **Standardization**: SSSOM provides a unified format for representing semantic, or ontological, mappings, making it easier for different systems and organizations to exchange mapping data consistently.\n- **Interoperability**: By using SSSOM, data from diverse sources can be integrated more seamlessly, allowing for improved data analysis and research across various fields, including biology, healthcare, and information technology.\n\nBeyond defining the standard itself, the **SSSOM Core Team** and the SSSOM community also develop reference tools and software libraries for working with the standard.\n\n## SSSOM at a glance: Model and Exchange Format\n\n### Basic model\n\nThe [data model](spec-model.md) of SSSOM is centered around two fundamental concepts: mappings and mapping sets.\n\nA **SSSOM mapping** is a statement that there is a correspondence between two semantic entities. It comprises two components:\n\n1. The **core mapping** (or **raw mapping**), which is a triple `<subject, predicate, object>` that represents the correspondence itself between a subject entity, for example a class in an ontology, and an object entity, for example an identifier in some database, via a semantic mapping predicate, for example `skos:exactMatch`.\n2. **Metadata** that provide supplementary pieces of information about the core mapping. This notably includes information about the *provenance* of the statement (for example, who authored the statement), the *confidence* with which the mappings holds, and its *justification* (a reason that supports the fidelity of the mapping between the subject and the object, such as _expert review_, or _exact lexical matching_ on the entities' primary names).\n\nA **SSSOM mapping set** is a collection of SSSOM mappings. Mapping sets can also be associated with metadata, such as license statements, or a description.\n\n### Example\n\nWhile the SSSOM model is quite general and mappings can be shared in different formats, the most common format is the [SSSOM/TSV format](spec-formats-tsv.md).\nHere is a tabular representation of some example mappings for illustration purposes:\n\n| subject_id    | subject_label | predicate_id    | object_id       | object_label         | mapping_justification       | author_id               | confidence | comment                                                                                                                         |\n|---------------|---------------|-----------------|-----------------|----------------------|-----------------------------|-------------------------|------------|---------------------------------------------------------------------------------------------------------------------------------|\n| KF_FOOD:F001  | apple         | skos:exactMatch | FOODON:00002473 | apple (whole)        | semapv:ManualMappingCuration | orcid:0000-0002-7356-1779 | 0.95       | \"We could map to FOODON:03310788 instead to cover sliced apples, but only 'whole' apple types exist.\"                          |\n| KF_FOOD:F002  | gala          | skos:exactMatch | FOODON:00003348 | Gala apple (whole)   | semapv:ManualMappingCuration | orcid:0000-0002-7356-1779 | 1.0        |                                                                                                                                |\n| KF_FOOD:F003  | pink          | skos:exactMatch | FOODON:00004186 | Pink apple (whole)   | semapv:ManualMappingCuration | orcid:0000-0002-7356-1779 | 0.9        | \"We could map to FOODON:00004187 instead which more specifically refers to 'raw' Pink apples. Decided against to be consistent with other mapping choices.\" |\n| KF_FOOD:F004  | braeburn      | skos:broadMatch | FOODON:00002473 | apple (whole)        | semapv:ManualMappingCuration | orcid:0000-0002-7356-1779 | 1.0        |                                                                                                                                |\n\nIn the TSV format, mapping set metadata is included at the top of the file, before the mappings themselves, in yaml-like key-value pairs:\n\n```yaml\ncurie_map:\n  FOODON: http://purl.obolibrary.org/obo/FOODON_\n  KF_FOOD: https://kewl-foodie.inc/food/\n  orcid: https://orcid.org/\nmapping_set_id: https://w3id.org/sssom/tutorial/example1.sssom.tsv\nmapping_set_description: Manually curated alignment of KEWL FOODIE INC internal food and nutrition database with Food Ontology (FOODON). Intended to be used for ontological analysis and grouping of KEWL FOODIE INC related data.\nlicense: https://creativecommons.org/licenses/by/4.0/\nmapping_date: 2022-05-02\n```\n\nSee [here](https://github.com/mapping-commons/sssom/tree/master/examples/schema) for concrete examples.\n\n### Quick reference for mapping metadata\n\nFor mapping set metadata please see [here](MappingSet.md).\n\n| Column/Field       | Description                                             | Value                                  | Examples                  | Required    |\n|--------------------|---------------------------------------------------------|----------------------------------------|---------------------------|-------------|\n{%- for slot in classes['mapping'].slots %}\n{%- set slot_info = slots[slot] %}\n| **[{{ slot }}]({{ slot }}.md)**     | {{ slot_info.description | default(\"No description\") }} | {% if slot_info.range in enums %}{{ enums[slot_info.range].permissible_values.keys() | join(\", \") }}{% else %}{% if slot_info.range == \"EntityReference\" %}entity reference (e.g. CURIE in TSV){% else %}{{ slot_info.range }}{% endif %}{% endif %} | {% if slot_info.examples is defined and slot_info.examples | length > 0 %}{% if slot_info.examples[0] is string %}{{ slot_info.examples[0].replace(\"|\", \"\\|\") }}{% elif slot_info.examples[0] is mapping %}{{ slot_info.examples[0].value | default(\"N/A\") | replace(\"|\", \"\\|\") }}{% else %}{{ slot_info.examples[0] }}{% endif %}{% else %}N/A{% endif %} | {% if slot_info.required | default(false) %}Required{% elif slot_info.recommended | default(false) %}Recommended{% else %}Optional{% endif %} |\n{%- endfor %}\n\n### Quick links\n\n**General**\n\n- [GitHub page](https://github.com/mapping-commons/sssom)\n- [Detailed description](introduction.md)\n- [Formal specification](spec-intro.md)\n\n**Publications**\n\n- [A Simple Standard for Sharing Ontological Mappings (SSSOM)](https://doi.org/10.1093/database/baac035) (initial publication in _Database_)\n- [A Simple Standard for Ontological Mappings 2022: Updates of data model and outlook](https://zenodo.org/record/7672104) (paper and presentation at the Ontology Matching Workshop 2022)\n- [A Simple Standard for Ontological Mappings 2023: Updates on data model, collaborations and tooling](https://zenodo.org/record/8202395) (paper and presentation at the Ontology Matching Workshop 2023)\n- [Other presentations](presentations.md)\n\n**Related software**\n\n- [SSSOM-Java](https://incenp.org/dvlpt/sssom-java/) (reference implementation of the SSSOM standard in Java, most up to date with the current standard; provides a Java library, a command-line tool, and a ROBOT plugin)\n- [sssom-py](https://mapping-commons.github.io/sssom-py/) (an implementation of the standard, a toolkit and API for processing mappings, written in Python using Pandas dataframes and/or LinkML objects as a primary data structure)\n- [sssom-pydantic](https://github.com/cthoyt/sssom-pydantic) (an implementation of the standard, a toolkit and API for processing mappings, written in Python using Pydantic as a primary data structure)\n- [sssom-js](https://www.npmjs.org/package/sssom-js) (an implementation of the SSSOM standard in JavaScript)\n\n## The SSSOM Core Team\n\n### Contact\n\nThe preferred way to contact the SSSOM team is through the [issue tracker](https://github.com/mapping-commons/issues) (for problems with SSSOM) or the [GitHub discussion forums](https://github.com/mapping-commons/sssom/discussions) (for general questions).\n\nYou can find any of the members of the SSSOM core team [on GitHub](https://github.com/orgs/mapping-commons/teams/sssom-core). Their GitHub profiles usually also provide email addresses.\n\nYou can also reach us in the [OBO Foundry Slack](https://obo-communitygroup.slack.com/archives/C01DP18L5GW), in the `#sssom` channel.\n\n### Steering committee\n\nThe Steering committee is a self-appointed group of SSSOM contributors, whose aim is to drive the evolution of the standard and coordinate community contributions.\n\n* [Nicolas Matentzoglu](https://orcid.org/0000-0002-7356-1779) (Independent Consultant (semanticly.ai), [@matentzn](https://github.com/matentzn))\n* [Damien Goutte-Gattat](https://orcid.org/0000-0002-6095-8718) (German BioImaging e.V.)\n* [Chris Mungall](https://orcid.org/0000-0002-6601-2165) (LBNL)\n* [Melissa Haendel](https://orcid.org/0000-0001-9114-8737) (UNC)\n* [Charles Tapley Hoyt](https://orcid.org/0000-0003-4423-4370) (RWTH Aachen University; [@cthoyt](https://github.com/cthoyt))\n\n### Documentation/specification editors\n\n* [Anita Caron](https://orcid.org/0000-0002-6523-4866) (EMBL-EBI)\n* [David Osumi-Sutherland](https://orcid.org/0000-0002-7073-9172) (Wellcome Sanger Institute)\n* [Emily Hartley](https://orcid.org/0000-0001-5839-2535) (Critical Path Institute)\n* [Ernesto Jimenez-Ruiz](https://orcid.org/0000-0002-9083-4599) (City, University of London)\n* [Harry Caufield](https://orcid.org/0000-0001-5705-7831) (LBNL)\n* [Harshad Hegde](https://orcid.org/0000-0002-2411-565X) (LBNL)\n* [Henriette Harmse](https://orcid.org/0000-0001-7251-9504) (EMBL-EBI)\n* [James McLaughlin](https://orcid.org/0000-0002-8361-2795) (EMBL-EBI)\n* [John Graybeal](https://orcid.org/0000-0001-6875-5360) (Independent Consultant)\n* [Sierra Moxon](https://orcid.org/0000-0002-8719-7760) (LBNL)\n* [Simon Jupp](https://orcid.org/0000-0002-0643-3144) (SciBite)\n* [Thomas Liener](https://orcid.org/0000-0003-3257-9937) (Independent Consultant)\n* [Tiffany Callahan](https://orcid.org/0000-0002-8169-9049) ([@callahantiff](https://github.com/callahantiff))\n* [William Duncan](https://orcid.org/0000-0001-9625-1899) (University of Florida)\n\n### Contributors\n\n* [Alasdair Gray](https://orcid.org/0000-0002-5711-4872)\n* [Alex Wagner](https://orcid.org/0000-0002-2502-8961)\n* [Amelia L. Hoyt](https://orcid.org/0000-0003-1307-2508)\n* [Andrew Williams](https://orcid.org/0000-0002-0692-412X)\n* [Anne Thessen](https://orcid.org/0000-0002-2908-3327)\n* [Benjamin M. Gyori](https://orcid.org/0000-0001-9439-5346)\n* [Bill Baumgartner](https://orcid.org/0000-0001-6717-5313)\n* [Cassia Trojahn](https://orcid.org/0000-0002-0096-2766)\n* [Clement Jonquet](https://orcid.org/0000-0002-2404-1582)\n* [Christopher Chute](https://orcid.org/0000-0001-5437-2545)\n* [Chris T. Evelo](https://orcid.org/0000-0002-5301-3142)\n* [Damion Dooley](https://orcid.org/0000-0002-8844-9165)\n* [Davera Gabriel](https://orcid.org/0000-0001-9041-4597)\n* [Harold Solbrig](https://www.wikidata.org/wiki/Q44607574)\n* [HyeongSik Kim](https://orcid.org/0000-0002-3002-9838)\n* [Ian Harrow](https://orcid.org/0000-0003-0109-0522)\n* [Ian Braun](https://orcid.org/0000-0002-2389-9288)\n* [James Malone](https://orcid.org/0000-0002-1615-2899)\n* [James Overton](https://orcid.org/0000-0001-5139-5557)\n* [James P. Balhoff](https://orcid.org/0000-0002-8688-6599)\n* [James Stevenson](https://orcid.org/0000-0002-2568-6163)\n* [Javier Millán Acosta](https://orcid.org/0000-0002-4166-7093)\n* [Jiao Dahzi](https://orcid.org/0000-0001-5052-3836)\n* [Joe Flack](https://orcid.org/0000-0002-2906-7319)\n* [Jooho Lee](https://orcid.org/0000-0002-2955-3405)\n* [Julie McMurry](https://orcid.org/0000-0002-9353-5498)\n* [Kori Kuzma](https://orcid.org/0000-0002-9954-7449)\n* [Kristin Kostka](https://orcid.org/0000-0003-2595-8736)\n* [Lauren Chan](https://orcid.org/0000-0002-7463-6306)\n* [Melissa Haendel](https://orcid.org/0000-0001-9114-8737)\n* [Monica Munoz-Torres](https://orcid.org/0000-0001-8430-6039)\n* [Nicole Vasilevsky](https://orcid.org/0000-0001-5208-3432)\n* [Nomi Harris](https://orcid.org/0000-0001-6315-3707)\n* [Núria Queralt-Rosinach](https://orcid.org/0000-0003-0169-8159)\n* [Sabrina Toro](https://orcid.org/0000-0002-4142-7153)\n* [Sebastian Koehler](https://orcid.org/0000-0002-5316-1399)\n* [Shahim Essaid](https://orcid.org/0000-0003-2338-2550)\n* [Sophie Aubin](https://orcid.org/0000-0003-4805-8220)\n* [Sue Bello](https://orcid.org/0000-0003-4606-0597)\n* [Sujay Patil](https://orcid.org/0000-0001-6142-1106)\n* [Sven Hertling](https://orcid.org/0000-0003-0333-5888)\n* [Tim Putman](https://orcid.org/0000-0002-4291-0737)\n* [Vinicius de Souza](https://orcid.org/0000-0002-4971-0439)\n\n## Acknowledgements\n\n- See [Funding](funding.md) for details on direct contributions.\n- We thank the [Link Model Language (LinkML) project](https://github.com/linkml) and team for their great framework and the LinkML team for their support developing the schema.\n"
  },
  {
    "path": "src/doc-templates/index.md.jinja2",
    "content": "# SSSOM Official Data Model Documentation\n\n![SSSOM banner](images/sssom-banner.png)\n\n{% if schema.description %}{{ schema.description }}{% endif %}\n\n**Schema PURL**: {{ schema.id }}\n\n## Introduction\n\nWhile the SSSOM model is quite general and mappings can be shared in different formats, the most common format is the [SSSOM/TSV format](spec-formats-tsv.md).\nHere is a tabular representation of some example mappings for illustration purposes:\n\n| subject_id    | subject_label | predicate_id    | object_id       | object_label         | mapping_justification       | author_id               | confidence | comment                                                                                                                         |\n|---------------|---------------|-----------------|-----------------|----------------------|-----------------------------|-------------------------|------------|---------------------------------------------------------------------------------------------------------------------------------|\n| KF_FOOD:F001  | apple         | skos:exactMatch | FOODON:00002473 | apple (whole)        | semapv:ManualMappingCuration | orcid:0000-0002-7356-1779 | 0.95       | \"We could map to FOODON:03310788 instead to cover sliced apples, but only 'whole' apple types exist.\"                          |\n| KF_FOOD:F002  | gala          | skos:exactMatch | FOODON:00003348 | Gala apple (whole)   | semapv:ManualMappingCuration | orcid:0000-0002-7356-1779 | 1.0        |                                                                                                                                |\n| KF_FOOD:F003  | pink          | skos:exactMatch | FOODON:00004186 | Pink apple (whole)   | semapv:ManualMappingCuration | orcid:0000-0002-7356-1779 | 0.9        | \"We could map to FOODON:00004187 instead which more specifically refers to 'raw' Pink apples. Decided against to be consistent with other mapping choices.\" |\n| KF_FOOD:F004  | braeburn      | skos:broadMatch | FOODON:00002473 | apple (whole)        | semapv:ManualMappingCuration | orcid:0000-0002-7356-1779 | 1.0        |                                                                                                                                |\n\nIn the TSV format, mapping set metadata is included at the top of the file, before the mappings themselves, in yaml-like key-value pairs:\n\n\n!!! info \"Example header (YAML format)\"\n\n    <pre>\n    curie_map:\n      FOODON: http://purl.obolibrary.org/obo/FOODON_\n      KF_FOOD: https://kewl-foodie.inc/food/\n      orcid: https://orcid.org/\n    mapping_set_id: https://w3id.org/sssom/tutorial/example1.sssom.tsv\n    mapping_set_description: >\n      Manually curated alignment of KEWL FOODIE INC internal food and \n      nutrition database with Food Ontology (FOODON). Intended to be \n      used for ontological analysis and grouping of KEWL FOODIE INC \n      related data.\n    license: https://creativecommons.org/licenses/by/4.0/\n    mapping_date: 2022-05-02\n    </pre>\n\nSee [here](https://github.com/mapping-commons/sssom/tree/master/examples/schema) for concrete examples.\n\n\n## Mapping metadata elements\n\n{% for c in gen.all_class_objects()|sort(attribute=sort_by) -%}\n{% if c.name == \"mapping\" %}\n{{gen.link(c)}}: {{c.description|enshorten}}\n\n| Column/Field       | Description                                             | Required    |\n|--------------------|---------------------------------------------------------|-------------|\n{%- for slot in c.slots %}\n{%- set slot_info = schemaview.induced_slot(slot, c.name) %}\n| **{{ gen.link(slot) }}**     | {{ slot_info.description | default(\"No description\") }} | {% if slot_info.required | default(false) %}Required{% elif slot_info.recommended | default(false) %}Recommended{% else %}Optional{% endif %} |\n{%- endfor %}\n{%- endif %}\n{%- endfor %}\n\n## Mappings set metadata elements\n\n{% for c in gen.all_class_objects()|sort(attribute=sort_by) -%}\n{% if c.name == \"mapping set\" %}\n{{gen.link(c)}}: {{c.description|enshorten}}\n\n| Column/Field       | Description                                             | Required    |\n|--------------------|---------------------------------------------------------|-------------|\n{%- for slot in c.slots %}\n{%- set slot_info = schemaview.induced_slot(slot, c.name) %}\n| **{{ gen.link(slot) }}**     | {{ slot_info.description | default(\"No description\") }} | {% if slot_info.required | default(false) %}Required{% elif slot_info.recommended | default(false) %}Recommended{% else %}Optional{% endif %} |\n{%- endfor %}\n{%- endif %}\n{%- endfor %}\n\n{#\n## Schema Diagram\n\n```{{ gen.mermaid_directive() }}\n{{ gen.mermaid_diagram() }}\n```\n#}\n## Index (all classes, enums and elements)\n\n### Columns/Slots/Fields\n\n| Slot | Description |\n| --- | --- |\n{% for s in gen.all_slot_objects()|sort(attribute=sort_by) -%}\n| {{gen.link(s)}} | {{s.description|enshorten}} |\n{% endfor %}\n\n### Classes\n\n| Class | Description |\n| --- | --- |\n{% if gen.hierarchical_class_view -%}\n{% for u, v in gen.class_hierarchy_as_tuples() -%}\n| {{ \"&nbsp;\"|safe*u*8 }}{{ gen.link(schemaview.get_class(v)) }} | {{ schemaview.get_class(v).description }} |\n{% endfor %}\n{% else -%}\n{% for c in gen.all_class_objects()|sort(attribute=sort_by) -%}\n| {{gen.link(c)}} | {{c.description|enshorten}} |\n{% endfor %}\n{% endif %}\n\n### Enumerations\n\n| Enumeration | Description |\n| --- | --- |\n{% for e in gen.all_enum_objects()|sort(attribute=sort_by) -%}\n| {{gen.link(e)}} | {{e.description|enshorten}} |\n{% endfor %}\n\n### Types\n\n| Type | Description |\n| --- | --- |\n{% for t in gen.all_type_objects()|sort(attribute=sort_by) -%}\n| {{gen.link(t)}} | {{t.description|enshorten}} |\n{% endfor %}\n"
  },
  {
    "path": "src/doc-templates/slot.md.jinja2",
    "content": "# {{ gen.name(element) }}\n\n**URI**: {{ gen.uri_link(element) }}\n\n**Applicable to**: {% for c in schemaview.get_classes_by_slot(element, include_induced=True) %}{{ gen.link(c) }}{% if not loop.last %}, {% endif %}{% endfor -%}\n\n{%- if element.description %}\n{%- set element_description_lines = element.description.split('\\n') %}\n!!! info \"Description\"\n\n    {% for element_description_line in element_description_lines %}\n    _{{ element_description_line }}_\n    {%- endfor %}\n{%- endif -%}\n{#\n{% if schemaview.slot_parents(element.name) or schemaview.slot_children(element.name, mixins=False) %}\n\n## Inheritance\n\n{{ gen.inheritance_tree(element, mixins=True) }}\n{% else %}\n<!-- no inheritance hierarchy -->\n{% endif %}\n\n{% if schemaview.get_classes_by_slot(element, include_induced=True) %}\n#}\n{#\n{% if schemaview.is_mixin(element.name) %}\n\n## Mixin Usage\n\n| mixed into | description | range | domain |\n| --- | --- | --- | --- |\n{% for s in schemaview.slot_children(element.name, is_a=False) -%}\n| {{ gen.link(s) }} | {{ schemaview.get_slot(s).description|enshorten }} | {{ schemaview.get_slot(s).range }} | {{ schemaview.get_classes_by_slot(schemaview.get_slot(s))|join(', ') }} |\n{% endfor %}\n{% endif %}\n#}\n## Properties\n\n* **Range**: {{gen.link(element.range)}}. The range of the element is the type of the value that can be assigned to it.\n{% if element.multivalued %}* **Multivalued**: {{ element.multivalued }}. If the element is multivalued, more than one value can be attached to the same field. In the TSV format, these are `|` separated.{% endif %}\n{% if element.minimum_value is not none %}* **Minimum Value**: {{ element.minimum_value|int }}{% endif -%}\n{% if element.maximum_value is not none %}* **Maximum Value**: {{ element.maximum_value|int }}{% endif -%}\n{% if element.pattern %}* **Regex pattern**: {{ '`' }}{{  element.pattern }}{{ '`' }}{% endif -%}\n{#\n\n{% if schemaview.usage_index().get(element.name) %}\n## Usages\n\n| used by | used in | type | used |\n| ---  | --- | --- | --- |\n{% for usage in schemaview.usage_index().get(element.name) -%}\n| {{gen.link(usage.used_by)}} | {{gen.link(usage.slot)}} | {{usage.metaslot}} | {{ gen.link(usage.used) }} |\n{% endfor %}\n{% endif %}\n#}\n{% if element.examples %}\n## Examples\n\n{% for x in element.examples -%}\n!!! example \"Example: {{ x.value }}\"\n\n    <strong>Example value</strong>:\n        \n    ```\n    {{ x.value }}\n    ```\n\n    {% if x.description %}<strong>Description</strong>: {{ x.description }}{% endif %}\n{% endfor %}\n{% endif -%}\n\n{% if element.comments -%}\n## Comments\n\n{% for x in element.comments -%}\n* {{x}}\n{% endfor %}\n{% endif -%}\n\n{% if element.see_also -%}\n## See Also\n\nThese are some relevant resources you might find useful to get additional information about the element,\nsuch as example implementations, issues and pull requests.\n\n{% for x in element.see_also -%}\n* {{ gen.uri_link(x) }}\n{% endfor %}\n{% endif -%}\n\n## Schema developer documentation\n\n<details><summary>LinkML source</summary>\n\n```yaml\n{{ gen.yaml(element) }}\n```\n</details>"
  },
  {
    "path": "src/docs/5star-mappings.md",
    "content": "# 5-Star Entity Mappings - Cheatsheet\n\n[Download as PDF](resources/sssom_5star_mappings.pdf).\n\nThis document is under development. Get involved by opening an issue on the [issue tracker](https://github.com/mapping-commons/sssom/issues).\n\n## Towards more reusable and transparent mappings for Open Science.\n\nEntity Mappings connect clinical codes, data model enums, ontology classes and terms in clinical terminologies \nacross knowledge organization systems and databases. Entity mappings are pivotal for the integration of \nhealthcare data, but they are expensive to produce and often use-case-dependent. \nDespite the cost of creating these mappings, they are rarely shared across organizations, and even \nif they are made available, they lack standardization and metadata. Here we outline a \n5-Star mapping system (inspired by Tim Berners-Lee’s 5-star system for Linked Data) \nto help you bring mapping production in your organization to the next level - step by step.\n\n## :star: 1-Star Mappings\n\n* **Goal**: Export mapping in a computationally accessible format, make it publicly available and record mapping precision.\n* **Implementation**:\n    * Record subject id, object id and mapping precision (exact, broad, narrow, close, related)\n    * Use globally unique and persistent identifiers for subject id and object id (e.g. OMOP:123456)\n    * Use a computable file format (JSON, XML, CSV, TSV) rather than XLSX or HTML\n    * Make mappings available in a public space without access restrictions\n    * **Optional**: record the subject and object labels to make it easier for humans to read the file\n* **Enables**:\n    * Direct integration into ETL pipelines\n    * Dropping societal costs by enabling others to reuse mappings\n    * Moving data between semantic spaces\n\n## :star::star: 2-Star Mappings\n\n* **Goal**: Make mappings available in a place with version control suitable for providing community feedback, make your own \nuncertainty explicit, add license and select semantic mapping predicate.\n* **Implementation** \n    * Make mapping set available in a public version control system (e.g. GitHub) with an issue tracker\n    * Record the semantic predicate explicitly (e.g. owl:equivalentClass, skos:exactMatch)\n    * Record a confidence value for the mapping between 0 and 1, where appropriate\n    * Use a standard open license for the use of the mapping set (e.g. Creative Commons)\n* **Enables**:\n    * The worry-free reuse of mappings even if target or source terminologies are “closed”\n    * Transparently versioned access to mappings and the opportunity to provide more direct feedback\n    * Downstream users can filter for high-confidence mappings\n\n## :star::star::star: 3-Star Mappings\n\n* **Goal**: Export mappings in a community standard format with basic versioning and provenance information.\n* **Implementation**\n    * Export mappings in SSSOM ([https://w3id.org/sssom](https://w3id.org/sssom)) format (you do not have to curate using SSSOM!)\n    * Record the following additional metadata\n        * mapping_justification(s) (Lexical, Logical match, Human curated etc.)\n        * mapping_date\n        * subject_source, object_source, subject_source_version, object_source_version\n        * mapping_tool (if the mapping was automatically computed using a tool), creator_id\n* **Enables**:\n    * Dropping costs of reusing mappings further by providing a standard format to exchange mappings\n    * Enabling the decentralised production of mappings by independent expert communities\n    * Basic metadata, in particular justifications, enable downstream users to assess “fitness for purpose” for a different context\n\n## :star::star::star::star: 4-Star Mappings\n\n* **Goal**: Make it easier to discover mappings by registering them at public mapping registry\n* **Implementation**\n    * Register the mapping at a mapping commons (if none exists, create one)\n    * Record the following additional metadata:\n        * mapping_set_id, mapping_set_description, mapping_set_version\n        * mapping_provider (if the mapping is not original, i.e. it is not derived from another source)\n        * Provide an executable mapping_justification (see https://w3id.org/sssom#minimum)\n* **Enables**:\n    * Mappings can easily be made available by Open Terminology services which enable scalable data mapping services\n\n## :star::star::star::star::star: 5-Star Mappings\n\n* **Goal**: Ensure currency of mappings\n* **Implementation**:\n    * Mappings are up-to-date with the latest versions of the sources being mapped\n    * Have no issue on their issue tracker open for more than 3 months without an interaction\n    * Usually requires a lifecycle management system that integrates automated matching\n* **Enables**:\n    * Reduced effort dealing with mappings to deprecated codes or classes\n    * Worry-free application of mappings in automated ETL processes\n"
  },
  {
    "path": "src/docs/chaining-rules.md",
    "content": "## SSSOM Mapping Chains\n\nThe goal of this document is to capture all obvious mapping chaining rules that could be applied to SSSOM, \nand later delivered as part of `sssom toolkit`. \nThis is all structural, and should not be confused with proper reasoning or mapping reconciliation ala \n[boomer](https://github.com/INCATools/boomer).\n\nThe idea is to provide the functionality to apply these chaining rules over a given mapping set, and record\nthe appropriate metadata for that rule.\n\nRules:\n\n- [Transitivity Rule](#transitivity)\n- [Role chains over exact/equivalent matches](#rce)\n- [Inverse Rule](#inverse)\n- [Generalisation Rule](#generalisation)\n\n<a id=\"transitivity\"></a>\n\n## Transitivity Rule\n\nTransitivity of a relation `R` implies that if an entity `A` is `R`-related to an entity `B` which in turn is \n`R`-related to an entity `C`, `A` is also `R`-related to `C`. \n\n### Predicates applicable in transitivity rules\n\nWe consider the following predicates transitive:\n\n- skos:exactMatch\n- skos:narrowMatch\n- skos:broadMatch\n- owl:equivalentClass / owl:equivalentProperty\n- rdfs:subClassOf / rdfs:subPropertyOf\t\n- owl:sameAs\n\nNote that technically speaking `skos:narrowMatch` and `skos:broadMatch` are not considered transitive \n(`skos:broaderTransitive` would be), but we are not defining a new semantics here, \njust a reasonable default for a mapping tool, which will nearly always hold true.\n\nPredicates we do not consider transitive include: `skos:relatedMatch` (for practical reasons), `oboInOwl:hasDbXref`, \n`skos:closeMatch`, `rdfs:seeAlso` (weakest form of a mapping link), `rdf:type`.\n\n### Rules\n\n- T1: `(:A)-[predicate_id]->(:B)-[predicate_id]->(:C)` -> `(:A)-[predicate_id]->(:C)`\n\n### Examples\n\n- T1-EX: `(:A)-[skos:broadMatch]->(:B)-[skos:broadMatch]->(:C)` -> `(:A)-[skos:broadMatch]->(:C)`\n\n<a id=\"rce\"></a>\n\n## Role chains over exact/equivalent matches\n\nRole chains are rules that allow us to bridge across mappings across multiple different properties.\nRole chains over exact are simple to define, so we start with these\n\n### Predicates applicable in transitity rules\n\n- skos:narrowMatch\n- skos:broadMatch\n- skos:closeMatch\n- skos:relatedMatch\n\n### Rules for SKOS\n\n- RCE1: `(:A)-[skos:exactMatch|owl:equivalentClass]->(:B)-[predicate_id]->(:C)` -> `(:A)-[predicate_id]->(:C)`\n- RCE2: `(:A)-[predicate_id]->(:B)-[skos:exactMatch]->(:C)` -> `(:A)-[predicate_id]->(:C)`\n\n### Rules that should probably not be inferred (OWL)\n\nThe following rules hold true, but will be left to a reasoner to be inferred:\n\n- RCE-N1: `(:A)-[owl:equivalentClass]->(:B)-[rdfs:subClassOf]->(:C)` -> `(:A)-[rdfs:subClassOf]->(:C)`\n- RCE-N2: `(:A)-[rdfs:subClassOf]->(:B)-[owl:equivalentClass]->(:C)` -> `(:A)-[rdfs:subClassOf]->(:C)`\n- RCE-N3: `(:A)-[owl:equivalentProperty]->(:B)-[rdfs:subPropertyOf]->(:C)` -> `(:A)-[rdfs:subPropertyOf]->(:C)`\n- RCE-N4: `(:A)-[rdfs:subPropertyOf]->(:B)-[owl:equivalentProperty]->(:C)` -> `(:A)-[rdfs:subPropertyOf]->(:C)`\n\n<a id=\"inverse\"></a>\n\n## Inverse Rules\n\n`R` inverse of `S` implies that if an entity `A` is `R`-related to an entity `B` then `B` is also `S`-related to `A`. \nWe like to call the output of an inverse rule a `walk-back`. A command that applies an inverse rule could be called `flip`. \n\n### Predicates applicable in inverse rules\n\nThis excludes the exact predicates for which inverse rules are redundant.\n\n### Rules for SKOS\n\n- RI1: `(:A)-[skos:narrowMatch]->(:B)` -> `(:B)-[skos:broadMatch]->(:A)`\n- RI2: `(:A)-[skos:broadMatch]->(:B)` -> `(:B)-[skos:narrowMatch]->(:A)`\n\n### Rules for SEMAPV\n\n- RI3: `(:A)-[semapv:crossSpeciesExactMatch]->(:B)` -> `(:B)-[semapv:crossSpeciesExactMatch]->(:A)`\n- RI4: `(:A)-[semapv:crossSpeciesNarrowMatch]->(:B)` -> `(:B)-[semapv:crossSpeciesBroadMatch]->(:A)`\n- RI5: `(:A)-[semapv:crossSpeciesBroadMatch]->(:B)` -> `(:B)-[semapv:crossSpeciesNarrowMatch]->(:A)`\n\n<a id=\"generalisation\"></a>\n\n## Generalisation Rules\n\nGeneralisation rules are rules that can be applied to weaken a mapping deliberately. This is sometimes useful, for example when\ncombining strong OWL-Semantics mappings with weaker SKOS-based ones.\n\n## Rules\n\n- RG1: `(:A)-[owl:equivalentTo]->(:B)` -> `(:A)-[skos:exactMatch]->(:B)`\n- RG2: `(:A)-[owl:subClassOf]->(:B)` -> `(:A)-[skos:broadMatch]->(:B)`\n"
  },
  {
    "path": "src/docs/confidence-model.md",
    "content": "# Confidence\n\nSSSOM enables annotating confidence in several ways for individual mappings\nrecords and for mapping sets.\n\n## Confidence in Positive Semantic Mappings\n\nThe following example shows a high confidence (0.99) manually curated semantic\nmapping, between two disease resources.\n\n```tsv\n#curie_map:\n#  mesh: https://meshb.nlm.nih.gov/record/ui?ui=\n#  MONDO: http://purl.obolibrary.org/obo/MONDO_\n#  oboinowl: http://www.geneontology.org/formats/oboInOwl#\n#  orcid: https://orcid.org/\n#  semapv: https://w3id.org/semapv/vocab/\n#  skos: http://www.w3.org/2004/02/skos/core#\n#mapping_set_id: https://w3id.org/biopragmatics/biomappings/sssom/positive.sssom.tsv\nsubject_id\tsubject_label\tpredicate_id\tobject_id\tobject_label\tmapping_justification\tauthor_id\tconfidence\nMONDO:0000455\tcone dystrophy\tskos:exactMatch\tmesh:D000077765\tCone Dystrophy\tsemapv:ManualMappingCuration\torcid:0000-0003-4423-4370 .99\n```\n\nThe following example shows a medium-confidence semantic mapping produced\nthrough a lexical matching process. While this semantic mapping is actually\nincorrect, the lexical matching process assigned it a confidence of 0.65.\n\n```tsv\n#curie_map:\n#  DOID: http://purl.obolibrary.org/obo/DOID_\n#  orcid: https://orcid.org/\n#  semapv: https://w3id.org/semapv/vocab/\n#  skos: http://www.w3.org/2004/02/skos/core#\n#  umls: https://uts.nlm.nih.gov/uts/umls/concept/\n#mapping_set_id: https://w3id.org/biopragmatics/biomappings/sssom/negative.sssom.tsv\nsubject_id\tsubject_label\tpredicate_id\tobject_id\tobject_label\tmapping_justification   confidence\nDOID:0050052\tRocky Mountain spotted fever\tskos:exactMatch\tumls:C0035795\tRocky mountain spotted fever vaccine\tsemapv:LexicalMapping\t0.65\n```\n\nWhen not explicitly specified, confidence estimation algorithms should consider\nthe confidence of a semantic mapping to be 1.0 by default.\n\n## Confidence with Negated Semantic Mappings\n\nSSSOM has explicit support for curating negative semantic mappings (i.e.,\nsubject-predicate-object triples known to be false) by using the\n`predicate_modifier` column.\n\nThe following example shows a highly confident negative semantic mapping,\nbecause _Rocky Mountain spotted fever_ (a disease curated in DOID) is not the\nsame as _Rocky mountain spotted fever vaccine_ (a vaccine curated in UMLS).\n\n```tsv\n#curie_map:\n#  DOID: http://purl.obolibrary.org/obo/DOID_\n#  orcid: https://orcid.org/\n#  semapv: https://w3id.org/semapv/vocab/\n#  skos: http://www.w3.org/2004/02/skos/core#\n#  umls: https://uts.nlm.nih.gov/uts/umls/concept/\n#mapping_set_id: https://w3id.org/biopragmatics/biomappings/sssom/negative.sssom.tsv\nsubject_id\tsubject_label\tpredicate_id\tpredicate_modifier\tobject_id\tobject_label\tmapping_justification\tauthor_id   confidence\nDOID:0050052\tRocky Mountain spotted fever\tskos:exactMatch\tNot\tumls:C0035795\tRocky mountain spotted fever vaccine\tsemapv:ManualMappingCuration\torcid:0000-0003-4423-4370   1.0\n```\n\nIt's also possible to curate a negative semantic mapping with low confidence,\nbut this is done less commonly in practice. Both human curators and semantic\nmapping prediction workflows typically focus on the production of _positive_\nknowledge.\n\nSimilarly, there are a large number of trivial negative semantic mappings that\nare typically ignored by curators and algorithms that consume semantic mappings.\n\nWhen not explicitly specified, confidence estimation algorithms should consider\nthe confidence of a negative semantic mapping to be 1.0 by default.\n\n## Estimating Overall Confidence in a Mapping Set\n\nThere are two places where the confidence in a mapping set can be reported:\n\n1. The creator of the mapping set can report their confidence in the mapping set\n   with the `mapping_set_confidence` slot in the mapping set's metadata.\n2. The maintainer of a mapping set registry who indexes a mapping set can report\n   their own confidence in the mapping set.\n\nIn some situations, it may be sufficient to choose a mapping set confidence\nbased on knowledge about the scope/domain of the mapping set, who the curators\nwere, etc.\n\nAlternatively, an empirical confidence can be estimated by randomly sampling\nsemantic mappings from the mapping set, manually reviewing them, then reporting\nthe percentage that were correct as a decimal value between zero and one. This\nestimate becomes more accurate as the size of the sample increases, so it's\nsuggested to sample a minimum 50-100 semantic mappings.\n\nWhen not explicitly specified, confidence estimation algorithms should consider\nthe registry confidence in a mapping set to be 1.0 by default.\n\n## Reviewer Agreement\n\nIn addition to the `confidence` slot which denotes the creator's confidence in\nthe accuracy of a mapping record, the `reviewer_agreement` slot allows for the\nreviewer to state if they disagree or agree on a scale of $[-1, 1]$.\n\nIn the following example, the reviewer confidently agrees with the accuracy of\nthe mapping that was previously asserted by another curator and denotes this\nwith a high agreement (near 1.0):\n\n```tsv\n# curie_map:\n#   CHEBI: http://purl.obolibrary.org/obo/CHEBI_\n#   mesh: http://id.nlm.nih.gov/mesh/\n#   orcid: https://orcid.org/\n#   semapv: https://w3id.org/semapv/vocab/\n#   skos: http://www.w3.org/2004/02/skos/core#\n# mapping_set_id: https://github.com/mapping-commons/sssom/blob/master/examples/schema/reviewer_agreement.sssom.tsv\nsubject_id\tsubject_label\tpredicate_id\tobject_id\tobject_label\tmapping_justification\tauthor_id\treviewer_id\treviewer_agreement\nCHEBI:10001\tVisnadin\tskos:exactMatch\tmesh:C067604\tvisnadin\tsemapv:ManualMappingCuration\torcid:0000-0001-9439-5346\torcid:0000-0003-4423-4370\t0.99\n```\n\nIn the following example, a semantic mapping was predicted by the\n[Biomappings](https://www.wikidata.org/wiki/Q111239110) workflow. The reviewer\nconfidently disagrees with the accuracy of the mapping, and denotes this by\nadding a low agreement (near -1.0):\n\n```tsv\n# curie_map:\n#   CHEBI: http://purl.obolibrary.org/obo/CHEBI_\n#   mesh: http://id.nlm.nih.gov/mesh/\n#   orcid: https://orcid.org/\n#   semapv: https://w3id.org/semapv/vocab/\n#   skos: http://www.w3.org/2004/02/skos/core#\n#   wikidata: http://www.wikidata.org/entity/\n# mapping_set_id: https://github.com/mapping-commons/sssom/blob/master/examples/schema/reviewer_agreement.sssom.tsv\nsubject_id\tsubject_label\tpredicate_id\tobject_id\tobject_label\tmapping_justification\tmapping_tool_id\treviewer_id\treviewer_agreement\nCHEBI:10057\t9H-xanthene\tskos:exactMatch\tmesh:C002563\txanthan gum\tsemapv:ManualMappingCuration\twikidata:Q111239110\torcid:0000-0003-4423-4370\t-0.99\n```\n\nIn the following example, a semantic mapping was predicted by the\n[Biomappings](https://www.wikidata.org/wiki/Q111239110) workflow. Because MeSH\ndoes not include detailed information about the chemical's structure, it's not\nclear to the reviewer if it should be mapped or not. Therefore, the reviewer\ndenotes they are unsure of whether the semantic mapping is correct or not with\nan agreement of 0.0 (halfway between 1.0 for fully agree and -1.0 for fully\ndisagree).\n\n```tsv\n# curie_map:\n#   CHEBI: http://purl.obolibrary.org/obo/CHEBI_\n#   mesh: http://id.nlm.nih.gov/mesh/\n#   orcid: https://orcid.org/\n#   semapv: https://w3id.org/semapv/vocab/\n#   skos: http://www.w3.org/2004/02/skos/core#\n# mapping_set_id: https://github.com/mapping-commons/sssom/blob/master/examples/schema/reviewer_agreement.sssom.tsv\nsubject_id\tsubject_label\tpredicate_id\tobject_id\tobject_label\tmapping_justification\tmapping_tool_id\treviewer_id\treviewer_agreement\nCHEBI:127105\ttribromosalicylanilide\tskos:exactMatch\tmesh:C004361\ttribromsalan\tsemapv:LexicalMatching\twikidata:Q111239110\torcid:0000-0003-4423-4370\t0.0\n```\n\n## Aggregating Confidence for a Semantic Mapping Record\n\n[Hoyt et al. (2025)](https://doi.org/10.1093/bioinformatics/btaf542) proposed a\nmodel for aggregating confidences on semantic mappings that was implemented in\nthe\n[Semantic Mapping Reasoner and Assembler](https://github.com/biopragmatics/semra).\nWith the introduction of reviewer agreements, this section proposes one\npotential way of using it to weight confidence:\n\n$$f(c,r)=(1−\\left| r \\right|)\\times c+\\left| r \\right|\\times \\frac{r + 1}{2}$$\n\nwith creator confidence ($c$) and reviewer agreement ($r$). The\n$\\frac{r + 1}{2}$ term reweights the agreement score to work better on the\n$[0,1]$ range.\n\nThis function has the nice properties:\n\n1. When the reviewer's agreement is closer to 0.0, it doesn't have an effect on\n   the creator's confidence\n2. When the reviewer's agreement is closer to -1.0 or 1.0, it should override\n   the creator's confidence proportionally to how close it is to the extremes\n\nHere's how it looks over all possible values for the creator confidence and\nreviewer agreement:\n\n![](images/reviewer-agreement-aggregation.svg)\n\n<details>\n <summary>Code that produced this chart</summary>\n\n```python\nimport matplotlib.pyplot as plt\nimport numpy as np\n\ndef aggregate(c: float, r: float) -> float:\n    w = np.abs(r)\n    return (1 - w) * c + w * (r + 1) / 2\n\nreviewer, creator = np.meshgrid(np.linspace(-1, 1, 100), np.linspace(0, 1, 100))\nz = aggregate(creator, reviewer)\nfig, ax = plt.subplots()\nmesh = ax.pcolormesh(creator, reviewer, z, cmap=\"RdBu\")\nax.set_xlabel(\"Creator Confidence\")\nax.set_ylabel(\"Reviewer Agreement\")\nax.set_title(\"Aggregation of Creator Confidence\\nand Reviewer Agreement\")\nax.axis([0, 1, -1, 1])\nfig.colorbar(mesh, ax=ax)\nplt.show()\nplt.savefig(\"images/reviewer-agreement-aggregation.svg\")\n```\n\n</details>\n"
  },
  {
    "path": "src/docs/contributing.md",
    "content": "# Contributing to SSSOM\n\n- [Contribution guidelines](https://github.com/mapping-commons/sssom/blob/master/CONTRIBUTING.md)\n- [Code of Conduct](https://github.com/mapping-commons/sssom/blob/master/CODE_OF_CONDUCT.md)\n"
  },
  {
    "path": "src/docs/create-mapping-commons.md",
    "content": "## Getting started\n\n- First, create a virtual environment of your choice. If you need assistance with virtual environments, [here's a guide](https://berkeleybop.github.io/best_practice/python_environments) to help you.\n- Install the [cruft](https://github.com/cruft/cruft) package. Cruft enables keeping projects up-to-date with future updates made to this original template.\n\n    ```\n    pip install cruft\n    ```\n    \n- Create a project using the [mapping-commons-cookiecutter](https://github.com/mapping-commons/mapping-commons-cookiecutter) template.\n\n    ```\n    cruft create https://github.com/mapping-commons/mapping-commons-cookiecutter\n    ```\n\nThis kickstarts an interactive session where you declare the following:\n\n- `project_name`: Name of the project. [defaults to: my-commons-name]\n- `github_org`: Name of the github org the project belongs to. [defaults to: my-org]\n- `project_description`: Description of the project [defaults to: 'This is the project description.']\n- `full_name`: Name of the author [defaults to: 'My Name']\n- `email`: Author's email [defaults to: 'my-name@my-org.org']\n- `yo`: Choose from [1]: Yes, [2]: No [**TEST OPTION FOR NOW**]\n- `license`: Choose from [1]: Yes, [2]: No [**TEST OPTION FOR NOW**]\n\n## What does this do?\n\nThe following files and directories are autogenerated in the project:\n\n### TODO\n\n## Version control\n### GitHub\n\n1. Go to [https://github.com/new] and follow the instructions, being sure to\n   NOT add a README or .gitignore file (this cookiecutter template will take\n   care of this for you)\n\n2. Add the remote to your local git repository\n\n   ```bash\n   git remote add origin https://github.com/my-user-or-organization/my-commons-name.git\n   git branch -M main\n   git push -u origin main\n   ```\n\n### GitLab\n\n#### TODO\n\n## Future updates to the project's boilerplate code\n\nIn order to be up-to-date with the template, first check if there is a mismatch between the project's boilerplate code and the template by running:\n\n```\ncruft check\n```\n\nThis indicates if there is a difference between the current project's boilerplate code and the latest version of the project template. If the project is up-to-date with the template:\n\n```\nSUCCESS: Good work! Project's cruft is up to date and as clean as possible :).\n```\n\nOtherwise, it will indicate that the project's boilerplate code is not up-to-date by the following:\n\n```\nFAILURE: Project's cruft is out of date! Run `cruft update` to clean this mess up.\n```\n\n\nFor viewing the difference, run `cruft diff`. This shows the difference between the project's boilerplate code and the template's latest version.\n\nAfter running `cruft update`, the project's boilerplate code will be updated to the latest version of the template.\n"
  },
  {
    "path": "src/docs/editors.md",
    "content": "# Simple Standard for Sharing Ontological Mappings (SSSOM)\n\n## How to make a new release\n* Automated:\n  * On the main code page, click on Releases (right hand column)\n  * Click on the `Draft a new release` button\n  * Click the `Choose a tag` button, create a new tag: `X.X.X`\n  * Click on the `Generate a new release` button\n  * Make sure only the `Select as the latest release` checkbox is checked.\n  * Click `Publish release` button\n* Manual:\n  * `make build`\n  * `make pypi`\n\nThis triggers a GitHub Action workflow that releases the new version of SSSOM to PyPi.\n\n## Documentation deployment\nThis can be done in two ways:\n* Automated: Every time a pull request is merged into the `main` branch, a github action is triggered to deploy documentation automatically.\n* Manually: The make command to deploy documentation is `make deploy`."
  },
  {
    "path": "src/docs/events/ccb2022.md",
    "content": "## CCB Seminar Series: Open SSSOM - Unlocking the wealth of biomedical data using shared standardized entity mappings\n\nWhere: Virtual event at the Center for Computational Biomedicine, Harvard Medical School, see\nhttps://computationalbiomed.hms.harvard.edu/education/ccb-seminar-series/\n\nWhen: Monday 12 Dec 2022\n\nSpeaker: Nicolas Matentzoglu, PhD, Independent Contractor, Semantic Web and Knowledge Graphs expert\n\nAbstract: In this seminar, we will discuss the role of entity mappings in the biomedical domain, and the potential gain we might get from standardising and sharing them. We will introduce the Simple Standard of Ontological Mappings (SSSOM, https://w3id.org/sssom) and showcase some of its use cases. The central goal of this seminar is to redefine entity mappings as FAIR semantic artefacts in their own right, thus making them first-class citizens alongside, for example, controlled vocabularies and ontologies.\n\n<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/4vqeRECuAKE\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen></iframe>\n"
  },
  {
    "path": "src/docs/events/mc2021.md",
    "content": "# 1st Mapping Commons Workshop on Simple Standard for Sharing Ontology Mappings\n\nWhen: 03.09.2021\n\nFor a *list of participants* see:\n\n- Wikidata: https://www.wikidata.org/wiki/Q108394519\n- Scholia: https://scholia.toolforge.org/event/Q108394519\n\nIn 2020, we introduced the Simple Standard for Sharing Ontology Mappings (SSSOM) as a way for the mapping community to exchange and consolidate mappings using a simple TSV format. SSSOM seeks to solve, in particular, the following problems:\n\n- Standardising the mapping metadata that is necessary to drive data transformation and knowledge graph merging use cases\n- Enable effective merging and filtering of mapping sets\n- Standardising the representation of mapping sets across formats such as RDF/XML, JSON-LD, TSV, and others.\n\nThe *purpose* of this 3-hour workshop:\n\n- Describing current use cases to the community, and ensuring all community use cases are documented and understood\n- Establishing a user forum for getting support and providing feedback\n- Define a simple governance strategy for organic evolution of standard\n- Describing a number of key open issues:\n    - The representation of complex mappings\n    - The representation of curation rules\n    - The problem of predicate modification\n    - The alignment with external standards such as PROV-O and Alignment API\n- Defining the path to a SSSOM beta release (stable) and the rallying for the paper\n\n*Resources*:\n\n- [Overview presentation](https://docs.google.com/presentation/d/1T75TRkpKRGHk5FSeFS7mQe8vmo8rt7bE69kgPX6PZMs/edit?usp=sharing)\n\n## Outcomes\n\n- Members of the SSSOM core team are organised as as github team: https://github.com/orgs/mapping-commons/teams/sssom-core\n- If you want to become a member, please make an issue here: https://github.com/mapping-commons/SSSOM/issues\n- We added some of the questions asked to the new SSSOM FAQ: https://mapping-commons.github.io/sssom/faq/\n- Governance proposal (comments welcome): https://github.com/mapping-commons/SSSOM/issues/82\n    - Governance will evolve over time. Standard and governance will evolve together.\n    - We will versioning (like SemVer) and should denote when backwards incompatible changes happen\n- The [5-Star system](https://mapping-commons.github.io/sssom/spec/#minimum) for open FAIR mappings is now in its first official version.\n\n### Discussion summary\n\n- Ben Gyori: would be interesting to discuss beyond the format whether there's a central repository, or whether primary developers will make it as a primary export hosted along with their other artifact. Would there be a process to pull those?\n    - Nico: takes a long time for uptake of new publication systems, so this could take a long time -> maybe better to promote on an ontology level. Could also have the side benefit of providing a point of introspection\n    - John G: I totally would want BioPortal to be capable of managing the RDF produced from SSSOM resources, and for Bioportal to be a mapping resource and not simply an ontology resource. I suspect the RDF patterns that SSSOM is defining are the gold we'll need for that gold standard for exchanging mappings. Uploading the RDF files can trivially be done in a naive way of course, but integrating that RDF knowledge into Bioportal to make them maximally useful as a separate kind of resource is obviously 'real work' (and so schedules are unknowable).\n- John: how dependent is the library on the software itself? Is it an exchange principle?\n    - Nico: LinkML has the advantage that it gets JSON and TTL outputs for free if we use it. Would also be advantageous if more people used this standard for metamodeling to create similar outputs for different modeling\n- Charlie: using \"frontmatter\" format for SSSOM TSV files, like how github is using frontmatter in Jekyll (ref: https://blog.datacite.org/using-yaml-frontmatter-with-csv/) (http://csvy.org/) \n- John G: Analogous to frontmatter format, I keep being drawn to the SKOS Play format as an alternate (but I *think* TTL-compatible) format for the SSSOM content. How bad would that be? (I can create a ticket)\n- Charlie: Requirements for a default JSON-LD context (e.g., prefix -> URL prefix mapping)\n    - How should it be maintained? Should it continue to be manually curated, or is an automated export from something like the Bioregistry a good idea? If it's automatically exported from the Bioregistry, what kinds of interactions might users want to have via the Bioregistry issue tracker to propose improvements? Similarly, we can make tutorials for directly creating PRs.\n- Charlie: How prefixes should be stylized/what is the business logic/decision tree for using OBO Library PURLs, Identifiers.org URLs, Bioregistry URLs, first-party provider URLs, etc. based on what's available and mapped between various first-party providers, third-party providers (e.g., ChemSpider InChI resolver), and meta-providers (e.g., Identifiers.org, OntoBee)? This is both a concern for \"best practices\" in SSSOM defining a custom context and also when using or extending the default context.\n- Charlie: How to represent mappings where the curator is unsure if the relation is correct or not? This happens often when curating equivalences, e.g., in Biomappings https://github.com/biomappings/biomappings/blob/master/src/biomappings/resources/unsure.tsv  \n- Tiffany: Is it important to know why someone feels more or less confident about a mapping? If so, is there also a way to include that in the measure of “confidence”?\n    - Sue: In practice I’ve tended to add comments when I am uncertain and have questions. Possibly this could be formalized?\n- Davera clinical use case discussion: Overall issue: mapping sets of things to a term is a goal for clinical mappings\n    - mapping recommendations/rational exercise\n    - staging and diagnosis information (like stage 1 or stage 2 of a given cancer)\n    - Select a set of stages - this is challenging wrt mappings\n    - Different kinds of scales describing the same thing are hard/sometimes not \"kosher\" to mix\n    - Phenotypes rely on capturing human-readable data on the decision logic of how mappings are applied by standards implementation team\n    - Proposed to look at the HL7 Implementation profiles as a way to incorporate an approach to this complex mapping challenge\n- Melissa: rename SSSOM to Slytherin Standard.\n    - Charlie 100% supports this (Tiffany: +1; Alex +1)\n    - Kristin also likes this.\n    - John used it.\n- John G: Ontology repositories are mappings-motivated, to both provide to users good mappings, and to provide good ways for users or managers to ingest, manage, apply, and create mapping knowledge. Ontology repositories are presumably also capable of storing mappings in their semantic (RDF-equivalent) format. With this in mind, is the concept of a \"mapping server\" equivalent, complementary, or antagonistic to the existing ontology repositories? \n- John G: Need to consider identification and versioning of the mapping artifacts. It's one thing to say \"We have all the mapping artifacts and we are giving those out\", but (just like ontologies) citing a mapping artifact requires that you have a unique identifier for that artifact, and that the identifier incorporates the fact the artifact may have multiple versions. Ideally the SSSOM artifacts (like ontologies) would (a) be accessible in a defined format at the identifier IRI, (b) include their identifiers within the SSMOC artifact. I am thinking that an SSMOC is inherently a semantic artifact, and therefore it should follow semantic namespace declaration principles in this regard. \n- Julie: W3id supports regex based redirects (for purls)\n\n### Breakout sessions\n\n#### Curation rules: documenting the decision rules on how a mapping was determined \n\n- Effective definition of inclusion criteria/exclusion criteria:\n    - Inclusion example: Two ontologies saying I created exact mappings that they have a string match or a string match to a synonym + an xref\n    - Exclusion example: Only matched on an acronym\n\n- Match types\n    - Cover partial string matches\n\n- Other\n    - documentation\n        - criteria to distinguish exact from narrow/broad - how exact is exact\n        - Line between close/narrow/broad\n        - Direction of narrow and broad\n    - DOS: I'd favor manual mapping be done on definitions + context in ontology, leaving lexical mappings to machines.\n    - What metadata could we add to the header to make clear criteria used?  One thing it might be useful to record is whether ontology context (relationships & location in classification) of mapped terms was used (Some ontologies/taxonomies have poor quality graphs but high quality term definitions.)\n    - Source string match to target (lexical exact, stem, word [synonym and type]) - need for both source and target, how to synonyms fit in\n- Needs:\n    - Generalized patterns that relate file header information to row-level information\n    - Need more expressivity in the match type\n    - Inclusion and exclusion criteria \n    - Best practices guide\n    - Algorithm/tool/similarity measure for computationally derived mappings\n    - Specificity with respect to the parent concept or portion of the hierarchy that the concept is from\n\n\n\n#### Mapping provenance and alignment with external provenance standards\n\n- Problems:\n   - We need to distinguish original and derived mappings\n   - We need to somehow “encode” how a derived mapping was created (for example through a walk\n\n\n- USeful to capture as part of the PROV activity\n    - agents (wasAssociatedWith some)\n    - mapping tool\n    - creator\n    - algorithms\n    - semantic similarity etc\n- Why provenance: “i dont trust mappings from source x..”\n    - Who did it? What tools were used? - are the most important\n    - When completed, how often updated\n    - Which version of the ontology was the mapping generated from? (20-30 provenance related properties that could be relevant) [list](https://hal.archives-ouvertes.fr/lirmm-01605783)\n    - list of most-recommended terms as a template: https://github.com/sifrproject/MOD-Ontology/blob/master/mod-v1.4_properties_template.ttl \n- Activity manual mapping -> Activity reconciliation \n    - Inputs and outputs of activities?\n    - Mapping set activities vs mapping activities\n- Shahim: Generic tagging mechanism\n    - users add tags k:v \n    - Suggestion: we open the “other” field to arbitrary json, then if we see people use something a lot, we allow promoting stuff to the top level (look at fhir as an example)\n    - James counter suggestion: open the column space and allow Qnames in there? its like Shahims suggestion just on the top level;\n    - John says look at SKOS Play convert tool it implements arbitrary triples as <current row - left column> <top row - column n>  <current row - column n> so you add whatever properties you want in the top row top row is actually the first row *after* the Column Header row, which begins with \"Identifier\" cell\n    - Thomas: While it’s nice to have the ability to express complex prov (and we should think about it), the important prov files are not that complex. Minimum should be something like: Creator, creation date, algorithm,... see below “list of critical (minimum) prov information”\n        - John: World is changing we can assume a bit more complexity\n- All: A short list of the critical provenance information is  needed, but there should also be a mechanism to add other ecosystem-specific provenance.\n- Versioning:\n    - We need to carefully think through versioning of mapping sets. Versioning should be similar to ontology artefacts, with version IRIs and PURLs\n    - W3id supports regex based redirects\n    - We need to introduce versioning for the SSSOM standard itself. Someway to indicate whether breaking changes were introduced\n\n\n#### Representing predicate modification: negation, inverse, direct, indirect etc\n\nhttps://github.com/mapping-commons/sssom/issues/40\n\n- Negative mappings (e.g., not equivalent to, not related to) have a clear use case in supporting semi-automated curation of mappings to avoid zombie mappings.\n- We agreed adding additional syntax to SSSOM would make it less simple and likely less accessible.\n- Two candidate solutions for including negative mappings remain: curating a controlled vocabulary of negative relationships (e.g., sssom:notEquivalentTo) OR adding a predicated modifier column. We considered parallel discussions in the LinkML community and examined the use of predicate modifiers in the Gene Ontology Annotation database. Both solutions could work, but we were hesitant to commit to one during the meeting.\n\n\n#### Mapping (clinical etc) data model elements and values\n\nhttps://github.com/mapping-commons/sssom/issues/43\n\n#### Use cases for complex mappings\n\n- https://github.com/mapping-commons/sssom/issues/61\n- The main outcome for this discussion was that the participant urged to keep the `Simple` in SSSOM, and that any decision to capture more complex mapping cases should be driven by a veruy strong use case\n- For the first release of the SSSOM standard, we will not worry about complex mappings\n\n## Next steps\n\n- Declare stable first version for SSSOM spec (September 2021)\n- Write manuscript (September/October 2021)\n- Dockerise all mapping related tooling, for example for generation, reconciliation, transformation etc. (December 2021)\n- Work with OAEI to publish automated mappings more systematically in SSSOM, including better mapping justifications/curation rules (Early 2022)\n- Work with @cmungall & @balhoff to integrate mapping reconciliation as a first-class citizen into mapping pipelines (February 2022)\n- Extend OxO to fully support SSSOM data model (prototype SSSOM browser April 2022).\n\n\n"
  },
  {
    "path": "src/docs/events/mc2023.md",
    "content": "# 2nd Mapping Commons Workshop on Simple Standard for Sharing Ontology Mappings (SSSOM)\n\n**When**: Sunday, 23rd April, 2:30 pm Italy (CET), 1:30 pm BST, 8:30 am EDT, 5:30 am PDT (3 hours total)\n\n**Where**: co-located with [Biocuration 2023](https://biocuration2023.github.io/). For information about the venue see https://biocuration2023.github.io/workshops.\n\nDuring the workshop, we will work a lot with Slido for interactive sharing of ideas, rather than relying on open discussions.\nWe recommend having your laptop / phone with you to be able to participate.\n\n## Recordings\n\nhttps://www.youtube.com/watch?v=juMQQ01Q540&list=PLqu_J7ADQtKyX55F7RqZtaSS7TwGd3MoR&ab_channel=BiocurationConference2023\n\n## Recommended preparation\n\n- Scroll through [the documentation](https://mapping-commons.github.io/sssom/home/), in particular [the paper](https://doi.org/10.1093/database/baac035) and the [basic tutorial](https://mapping-commons.github.io/sssom/tutorial/) to get a basic sense of SSSOM\n- Skim through, or even watch, the [SSSOM CCB Seminar recording](https://www.youtube.com/watch?v=4vqeRECuAKE)\n- Scroll through the slide decks describing the problems we will be addressing (note, they are all works in progress):\n    - [Complex Mappings: Examples from OMOP2OBO (Tiffany Callahan)](https://docs.google.com/presentation/d/1Jn0W9gjRn19ISDB8N-sEwKwXsJySLPlNIsOL6ng_nEA/edit?usp=sharing)\n    - [Complex mappings - the journey towards a proposal (Nico Matentzoglu)](https://docs.google.com/presentation/d/1kFD33S_WMgEGmCnT7IjVCeEyKI7OpcUw1ZzRXGqt1hs/edit?usp=sharing)\n    - [Literal mappings with SSSOM (James McLaughlin)](https://docs.google.com/presentation/d/1mBZK6KS7JgmXlEtszQiOa_Cl7SXg_Z8wRp0tZHaL57Y/edit?usp=sharing)\n    - FAIR Impact and schema mappings (Yann Le Franc) - slides TBD\n    - [Mapping Data Structures: Challenges and Approaches](https://docs.google.com/presentation/d/191jQYOe8KAGoktVOA408NW_WWk_Gon0q9idyylbEQck/edit?usp=sharing) (Chris Mungall)\n    - [Concept Set Mappings](https://docs.google.com/presentation/d/1055Etr0kgHHkguwgizecb_SEhj2nNd7my3q0u8fCDvk/edit?usp=sharing) (Chris Roeder) - slides TBD\n\n## Preliminary agenda\n\n|  Time  | Topic | Led by |\n| ------ | ----- | ------ |\n| 2:30pm | [Welcome, introduction, SSSOM overview and introduction of the problem of \"non-simple mappings\"](https://docs.google.com/presentation/d/1bHcZsYU9GpZDyeDxO4uopnuw0-ETfldn1EFYQwBbNro/edit?usp=sharing) | Nico Matentzoglu |\n| 2:55pm | [FAIR Impact and schema mappings](https://drive.google.com/file/d/1cDSfvBehegy3edJU4LxZK3S-xI0LNbmn/view?usp=sharing) | Yann Le Franc |\n| 3:10pm | [Literal mappings with SSSOM](https://docs.google.com/presentation/d/1mBZK6KS7JgmXlEtszQiOa_Cl7SXg_Z8wRp0tZHaL57Y/edit?usp=sharing) | James McLaughlin |\n| 3:20pm | Literal Mappings - Discussion | |\n| 3:30pm | [Concept Set Mappings](https://docs.google.com/presentation/d/1055Etr0kgHHkguwgizecb_SEhj2nNd7my3q0u8fCDvk/edit?usp=sharing) | Chris Roeder |\n| 3:45pm | Concept Set Mappings - discussion | |\n| 3:55pm | Break | |\n| 4:05pm | [Complex Mappings: Examples from OMOP2OBO](https://docs.google.com/presentation/d/1Jn0W9gjRn19ISDB8N-sEwKwXsJySLPlNIsOL6ng_nEA/edit?usp=sharing) | Tiffany Callahan |\n| 4:20pm | [Complex mappings - the journey towards a proposal](https://docs.google.com/presentation/d/1kFD33S_WMgEGmCnT7IjVCeEyKI7OpcUw1ZzRXGqt1hs/edit?usp=sharing)  | Nico Matentzoglu |\n| 4:35pm | Complex Mappings - discussion | |\n| 4:50pm | [Mapping Data Structures: Challenges and Approaches](https://docs.google.com/presentation/d/191jQYOe8KAGoktVOA408NW_WWk_Gon0q9idyylbEQck/edit?usp=sharing) | Chris Mungall |\n| 5:05pm | Schema Mappings - discussion | |\n| 5:20pm | Summary and closing remarks | Nico Matentzoglu |\n\n## Organisers\n\n- Nicolas Matentzoglu\n- Yann Le Franc\n- Tiffany Callahan\n- Chris Mungall\n- Chris Roeder\n- James McLaughlin\n- Nomi Harris\n\n"
  },
  {
    "path": "src/docs/events/oboacademy2022.md",
    "content": "## OBO Academy 2022: Introduction to manual mapping curation\n\nWhere: Virtual, https://oboacademy.github.io/obook/courses/monarch-obo-training/\nWhen:  17th May 2022\n\nSpeaker: Nicolas Matentzoglu, PhD, Independent Contractor, Semantic Web and Knowledge Graphs expert\n\nAbstract: See [here](../tutorial.md).\n\n<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/ZZeZcg-Vwjw\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen></iframe>"
  },
  {
    "path": "src/docs/events/ohdsi2022.md",
    "content": "## OHDSI Symposium 2022: There are no \"good\" mappings.\n\nWhere:\n\n- https://www.ohdsi.org/ohdsi2022symposium/\n- https://www.ohdsi.org/ohdsi2022-workgroup-activities/\n\nWhen: 15th October 2022\n\nSpeaker: Nicolas Matentzoglu, Melissa Haendel, Tiffany Callahan\n\nSlides: https://docs.google.com/presentation/d/1sGPh1b0keghxF4o7vMOQAlZ6QyBf97ZpaTXjmMY3UP0/edit#slide=id.p \n\nAbstract: The current state of observation data transformation management has resulted in a proliferation of approaches to data normalization and alignment that have accordingly created an explosion of maps. When publicly available, data transformation maps are of varying quality and are often configured to meet single clinical domain or project-specific objectives. Sharing maps in a community requires metadata to help map comparison and evaluation, and release management over different versions. This is typically lacking.  In this workshop we will present rationale for translational research data transformation management, including implementation examples mapping Real World Data to OMOP, at-scale. We will discuss the way in which source vocabularies are managed in OMOP and how to improve that process in the future. Data transformations that accommodate divergent underlying ontologies supporting a variety of use cases will be solicited from the participants both in advance and during the workshop.  "
  },
  {
    "path": "src/docs/events/ohdsi2023.md",
    "content": "## Poster presentation at OHDSI 2023 Symposium, Rotterdam\n\n*Title*: \"Synergizing Simple Standard for Sharing Ontology Mappings (SSSOM) and the Observational Health Data Sciences and Informatics (OHDSI)\"\n\n*Where*: https://www.ohdsi-europe.org/index.php/symposium-2023\n\n*When*: 3rd July 2023\n\n*Presenters*:\n\n- Polina Talapova\n- Nicolas Matentzoglu\n\n*Links*:\n\n- [Link to poster](https://www.dropbox.com/s/qru8lel4ahrluwo/ohdsi2023_matentzoglu_talapova_poster.pdf?dl=0)\n- [Link to short report](https://www.dropbox.com/s/gvnjq16cfwvnna4/ohdsi2023_matentzoglu_talapova_extended_abstract.pdf?dl=0)\n"
  },
  {
    "path": "src/docs/events/om2022.md",
    "content": "## OM 2022: A Simple Standard for Ontological Mappings 2022 - Updates of data model and outlook\n\nWhere: Virtual, co-located with ISWC 2022, http://om2022.ontologymatching.org/\nWhen:  23rd October 2022\n\nSpeaker: Nicolas Matentzoglu, PhD, Independent Contractor, Semantic Web and Knowledge Graphs expert\n\nAbstract: \nThe Simple Standard for Ontological Mappings (SSSOM) was first published in December\n2021 (v. 0.9). After a number of revisions prompted by community feedback, we have\npublished version 0.10.1 in August 2022. One of the key new features is the use of a controlled\nvocabulary for mapping-related processes, such as preprocessing steps and matching\napproaches. In this paper, we give an update on the development of SSSOM since v. 0.9,\nintroduce the Semantic Mapping Vocabulary (SEMAPV) and outline some of our thoughts on\nthe establishment of mapping commons in the future.\n\n\n"
  },
  {
    "path": "src/docs/events/pistoia2022.md",
    "content": "## Pistoia Seminar 2022: A Simple Standard for Sharing Ontological Mappings (SSSOM)\n\nWhere: Virtual\n\nWhen: 28th April 2022\n\nSpeaker: Nicolas Matentzoglu, PhD, Independent Contractor, Semantic Web and Knowledge Graphs expert\n\nAbstract: Meeting introducing SSSOM to the Pistoia Alliance.\n"
  },
  {
    "path": "src/docs/events/wsbo2021.md",
    "content": "## WSBO-2021: Workshop on Synergizing Biomedical Ontologies\n\nWhere: https://github.com/OntoloBridge/WSBO/\n\n[Slides](https://docs.google.com/presentation/d/1TlROX-JNeWvgrX57-CBa2qxTrRp92VGGZnrhJv3rLPM/edit#slide=id.p)\n\n<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/lgVqFeSxYbg\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen></iframe>\n"
  },
  {
    "path": "src/docs/explanation/mappings.md",
    "content": "# What is a mapping?\n\nThe word \"mapping\" is pretty\noverloaded in practice: for some people, it simply means \"a correspondence of one term \nto another equivalent or near equivalent term.\" \nBut even here, there is little understanding to what a \"term\" is in this sentence, \nor what \"almost equivalent\" means - and, there are many different kinds of mappings used in practice that are not \"equivalent\" at all. In its very essence, an individual mapping maps one information entity, i.e. a _representation of a real world entity_, to another information entity - how, and what these strings could be, will be the subject of the following section.\n\nIn the following, we consider an **information entity** a *sequence of characters which has a well defined relationship to some thing in the real world*, for example:\n- an ontology id like HP:0004934 corresponds to the concept of \"Vascular calcification\" in the real world. Note that HP:0004934 is annotated with the `rdfs:label` \"Vascular calcification\". \nThe label itself is not necessarily a term - it could change, for example to \"Abnormal calcification of the vasculature\", and still retain the same meaning.\n- \"Vascular calcification\" may be a term in my controlled vocabulary which I understand to correspond to that respective disease (not all controlled vocabularies have IDs for their terms). \nThis happens for example in clinical data models that do not use formal identifiers to refer to the values of slots in their data model, like \"MARRIED\" in /datamodel/marital_status.\n- Examples of terms: \n  - IDs of classes in an ontology\n  - elements of a clinical value set\n  - codes of clinical terminologies such as [Z63.1](https://www.icd10data.com/ICD10CM/Codes/Z00-Z99/Z55-Z65/Z63-/Z63.1)\n- TLDR: terms correspond to things in the world and that correspondence is not subject to change. \nLabels can change without changing the meaning of a term.\n\n## An attempt at a practical categorisation\n\nIn our experience, there are roughly four kinds of mappings:\n\n- _string-string_: Relating one string, or label, to another string, or label. Understanding such mappings is fundamental to understanding all the other kinds of mappings.\n- _string-term_: Relating a specific string or \"label\" to their corresponding term in a terminology or ontology. We usually refer to these as synonyms, but there may be other words used in this case.\n- _term-term_: Relating a term, for example a class in an ontology, to another term. This is what most people in the ontology domain would understand when thy hear \"ontology mappings\".\n- _complex mappings_: Relating two sets of terms. These are the rarest and most complicated kinds of mappings, as they related for example two phenotypic profiles (sets of phenotypes) with each other. We will discuss some more examples in a future lesson.\n\nIn some ways, these four kinds of mappings can be very different. We do believe, however, that there are enough important commonalities such as common features, widely overlapping use cases and overlapping toolkits to consider them together. In the following, we will discuss these in more detail, including important features of mappings and useful tools.\n\n### Important features of mappings\n\nMappings have historically been neglected as second-class citizens in the medical terminology and ontology worlds -\nthe metadata is insufficient to allow for precise analyses and clinical decision support, they are frequently stale and out of date, etc. The question \"Where can I find the canonical mappings between X and Y\"? is often shrugged off and developers are pointed to aggregators such as [OxO](https://www.ebi.ac.uk/spot/oxo/) or [UMLS](https://www.nlm.nih.gov/research/umls/knowledge_sources/metathesaurus/mapping_projects/index.html) which combine manually curated mappings with automated ones causing [\"mapping hairballs\"](#How-to-solve-the-problem-of-mapping-hairballs).\n\nThere are many important metadata elements to consider, but the ones that are by far the most important to consider one way or another are:\n\n- _Precision_: Is the mapping exact, broad or merely closely related?\n- _Confidence_: Do I trust the mapping? Was is done manually by an expert in my domain, or by an algorithm?\n- _Source version_: Which version of the term (or its corresponding ontology) was mapped? Is there a newer mapping which has a more suitable match for my term?\n\nWhenever you handle mappings (either create, or reuse), make sure you are keenly aware of at least these three metrics, and capture them. You may even want to consider using a proper mapping model like the [Simple Shared Standard for Ontology Mappings (SSSOM)](https://github.com/mapping-commons/SSSOM/blob/master/SSSOM.md) which will make your mappings FAIR and reusable.\n\n### String-string mappings\nString-string mappings are mappings that relate two strings. The task of matching two strings is ubiquitous for example in database search fields (where a user search string needs to be mapped to some strings in a database). Most, if not all effective ontology matching techniques will employ some form of string-string matching. For example, to match simple variations of labels such as \"abnormal heart\" and \"heart abnormality\", various techniques such as [Stemming](https://en.wikipedia.org/wiki/Stemming) and [bag of words](https://en.wikipedia.org/wiki/Bag-of-words_model#:~:text=The%20bag%2Dof%2Dwords%20model,word%20order%20but%20keeping%20multiplicity.) can be employed effectively. Other techniques such as edit-distance or Levenshtein can be used to quantify the similarity of two strings, which can provide useful insights into mapping candidates.\n\n### String-term mappings / synonyms\nString-term mappings relate a specific string or \"label\" to their corresponding term in a terminology or ontology. Here, we refer to these as \"synonyms\", but there may be other cases for string-term mappings beyond synonymy.\n\nThere are a lot of use cases for synonyms so we will name just a few here that are relevant to typical workflows of Semantic Engineers in the life sciences. \n\n[Thesauri](https://en.wikipedia.org/wiki/Thesaurus) are reference tools for finding synonyms of terms. Modern ontologies often include very rich thesauri, with some ontologies like Mondo capturing more than 70,000 exact and 35,000 related synonyms. They can provide a huge boost to traditional NLP pipelines by providing synonyms that can be used for both Named Entity Recognition and Entity Resolution. Some insight on how, for example, Uberon was used to boost text mining can be found [here](https://github.com/obophenotype/uberon/wiki/Using-uberon-for-text-mining).\n\n### Term-term mappings / ontology mappings\nTerm-term mappings relate a term, for example a class in an ontology, to another term, usually from another ontology or database. The term-term case of mappings is what most people in the ontology domain would understand when they hear \"ontology mappings\". This is also what most people understand when they here \"Entity Resolution\" in the database world - the task of determining whether, in essence, two rows in a database correspond to the same thing (as an example of a tool doing ER see [deepmatcher](https://github.com/anhaidgroup/deepmatcher), or [py-entitymatcher](https://pypi.org/project/py-entitymatching/)). For a list standard entity matching toolkit outside the ontology sphere see [here](https://www.biggorilla.org/software_cat/entity-matching/index.html). \n\n### Further reading\n- A great overview can be found in [\"Tackling the challenges of matching biomedical ontologies\" (Faria et al 2018)](https://jbiomedsem.biomedcentral.com/articles/10.1186/s13326-017-0170-9)\n- A yearly competition of ontology matching systems is held by the [Ontology Alignment Evaluation Initiative (OAEI)](https://oaei.ontologymatching.org/). The challenge [results](http://oaei.ontologymatching.org/2020/results/) are a useful guide to identifying systems for matching you may want to try.\n\n\n## Some examples of domain-specific mapping of importance to the biomedical domain\n\n### Phenotype ontology mappings\nMapping phenotypes across species holds great promise for leveraging the knowledge generated by Model Organism Database communities (MODs) for understanding human disease. There is a lot of work happening at the moment (2021) to provide standard mappings between species specific phenotype ontologies to drive translational research ([example](https://github.com/mapping-commons/mh_mapping_initiative/tree/master/mappings)). Tools such as [Exomiser](https://github.com/exomiser/Exomiser) leverage such mappings to perform clinical diagnostic tasks such as variant prioritisation. Another app you can try out that leverages cross-species mappings is the Monarch Initiatives [Phenotype Profile Search](https://monarchinitiative.org/analyze/phenotypes).\n\n### Disease ontology mappings\nMedical terminology and ontology mapping is a huge deal in medical informatics ([example](https://www.nlm.nih.gov/research/umls/knowledge_sources/metathesaurus/mapping_projects/index.html)). [Mondo](https://github.com/monarch-initiative/mondo) is a particularly rich source of well provenanced disease ontology mappings.\n\n## How should you map your data to ontologies?\n\nThere are no one size fits all strategies for mapping your data to ontologies. There\nare many research areas that have something to give in this process. Here, we outline some ideas \non how to think about the problem.\n\n### Case 1: Mapping internal controlled vocabularies\n\n### Case 2: Mappings from free text\n\nExamples: \n- [Monarch Text Annotator](https://monarchinitiative.org/tools/text-annotate)\n\n### Case 3: Mappings between public controlled vocabularies and ontologies\n\n## How to solve the problem of mapping hairballs\n  \nString-term mappings\n\nOverview of automated approaches\n  - Simple matches (string, string pre-pro, fuzzy string)\n  - Graph-based matches (incl. semantic similarity)\n  - NLP/Machine Learning\n\nPractical:\n  - Try to get the same mappings as before using techniques\n  - Exact\n  - Simple preprocessing\n  - Levenshtein\n  - Jaccard similarity\n  - Embedding similarity (?)  "
  },
  {
    "path": "src/docs/faq.md",
    "content": "# Frequently Asked Questions (FAQ)\n\n<a id=\"why\"></a>\n## Why should our mappings be FAIR and carefully standardised?\n\nMappings are frequently created on an ad-hoc basis, using simple two-column spreadsheets where the first column corresponds to the subject of the mapping, and the second column to the object of the mapping. This is insufficient for a variety of reasons:\n\n- non-transparent precision: While the assumption is that the subject \"sort of mostly exactly\" maps to the object, in practice this is rarely the case. Matches can `exact`, where the subject corresponds 100% to the object, `broad`, where the object is broader than the subject, and others. Qualifiers like `exact`, `broad`, `narrow`, `related` and `close` qualify the *precision* of the mapping (not to be mistaken for fuzziness of confidence). Without knowing the precision, we cannot accurately transform our data, nor can we use the mappings to \"walk\", i.e. move from one mapping to another, see [SSSOM 5-Star recommendation for mappings](5star-mappings.md)\n- non-transparent incompleteness: We don't know when the mapping was created, on the basis of what version of the terminological source of the subject or object. As time passes, we also lose confidence whether there would now be more suitable mappings, or whether there are new terms that are now fully covered by the mappings.\n- non-transparent confidence: whether a tool or a human propose the mapping, there is always a bit of a risk the mapping call may be wrong. As consumers of the mappings we need to know how confident the mapping authors were (confidence score), and why they confident (curation rules, mapping justification).\n\nCurrently, mappings are created by a variety of systems, manually curated and automatic, and we need a way to efficiently collect and combine them. Mapping sets and mappings with quality provenance metadata allow us to trace faulty mappings to the source and correct them in a way that _all_ users of the mapping set will profit from it.\n\n## Is there a central repository of SSSOM files?\nThe idea of a mapping commons is to provide mappings in a decentralised fashion akin to OBO ontologies. A mapping commons collects \nmappings relevant to a particular community, either by reference (i.e. pulling in mapping sets already published elsewhere), or directly\nmaintained at the mapping commons ([example](https://github.com/mapping-commons/mh_mapping_initiative)). \nTheir integration as part of a repository (mapping server) would look like [EBI's Ontology X-ref Browser](https://www.ebi.ac.uk/spot/oxo/) \nor [BioPortal](https://www.bioontology.org/wiki/BioPortal_Mappings),\nbut the exact scope of these repositories is _use case dependent_ - EBI may chose to show cross references from and to ontologies loaded into OLS, \nwhile BioPortal chooses to show a different set of mappings. The plan is to update EBI's OxO to support the full SSSOM data model, drawing curated\nmappings from a variety of mapping commons, by Summer 2022 - but its unlikely that one central place will index all available mappings.\n\n## Who is responsible for the conversion into SSSOM - the primary developers of an artefact, or a mapping commons?\nLike with everything on the web, the closer to the source the SSSOM mappings are curated, the better. Ideally, mappings are maintained as \npart of ontology release pipelines or by primary mapping creators, rather than derived from a secondary source such as a database, further downstream.\nThe reason for this is that ideally, we would want mappings to be reviewable and editable in much the same way as open ontologies, \noffering issue trackers and an active community incorporating changes.\n\nThat said, it is unlikely that all existing mappings will be maintained by the source directly. For example, we expect to maintain the SSSOM mappings\nderived from the vast majority of OBO ontology xrefs as a downstream task ([example](https://github.com/mapping-commons/ols-mapping-commons)).\n\n## How dependent are we on the sssom-py toolkit?\nSSSOM follows the core design principle that mapping tables should be (a) self-contained, i.e. including its prefix maps similar to a turtle file, \nand (b) readable by normal data science toolkits. An SSSOM table can be read with pandas using the `comment='#'` parameter \n(with one caveat, which is that `#` must be used as a character _solely_ to denote comments), or a very simply combination of a yaml reader and pandas. \n\nThe SSSOM toolkit however offers some extra functionality, like export to JSON-LD, or RDF or import from other frequently used format.\n\n## Is the concept of a \"mapping server\" equivalent, complementary, or antagonistic to the existing ontology repositories? \nA (SSSOM) mapping server is a repository for mappings that enables the browsing of existing mappings, exposing all (or some relevant subset of) SSSOM metadata as search\nfacets. In that sense, it should be considered complementary, as it enables the search for accurate mappings from a specific term or set of terms,\nsomething that goes beyond what most ontologies would offer. However, the concept of ontology mappings can be _perceived_ as antagonistic to Open Ontology\nprinciples, as its goal is _not the logical integration of knowledge, but the association or linking of terms across controlled semantic spaces_. \nThe OBO vision involves the building of a coherent, non-redundant semantic space of logically interconnected ontologies, which in particular\nwants to avoid the introduction of overlapping concepts. The mapping world specifically embraces heterogeneous semantic spaces and overlapping concepts,\nand seeks to bridge the semantic gaps using well-defined mapping relations such as \"skos:broadMatch\" or \"owl:equivalentClass\".\n\n\n"
  },
  {
    "path": "src/docs/funding.md",
    "content": "## Funding\n\nThe Simple Standard for Sharing Ontological Mappings (SSSOM) is a community-driven project which has received support from many different sources.\nWe list the most important ones in the following.\n\n### Volunteering efforts\n\nA huge fraction of the work on SSSOM has been done by volunteers without dedicated grant support.\nWe hereby acknowledge their contributions as being absolutely essential. A selection of amazing contributions (by no means exhaustive):\n\n- The development of [SSSOM Java](https://incenp.org/dvlpt/sssom-java/)\n- Hundreds of careful contributions to discussions on the [SSSOM issue tracker](https://github.com/mapping-commons/sssom/issues)\n- The first draft of the [Mapping Registry Cookiecutter](https://github.com/mapping-commons/mapping-commons-cookiecutter)\n- We try to keep track of other [Community efforts here](https://github.com/mapping-commons/sssom/discussions/318)\n\n### Phenomics First (NIH / NHGRI #1RM1HG010860-01)\n\nA lot of the groundwork of SSSOM was done to support a disease mapping project as part of the [Mondo Disease Ontology](https://github.com/monarch-initiative/mondo),\nwhich included, but was not limited to:\n\n- Creation of a basic metadata model\n- Implementation of validation and parsing methods in [sssom-py](https://github.com/mapping-commons/sssom-py)\n- Generating [training materials](training.md)\n- Organising [workshops](workshops.md)\n- Outreach activities to clinical communities such as [OHDSI](https://www.ohdsi.org/)\n\nThe grant was awarded to members of the Monarch Initiative.\n\n### Monarch (NIH / OD #5R24OD011883)\n\nTo support development of cross-species mappings and knowledge graph integration for the [Monarch Knowledge Graph](https://monarchinitiative.org/),\na few new features had to be supported:\n\n- Groundwork for the [Semantic Mapping Vocabulary](https://github.com/mapping-commons/semantic-mapping-vocabulary) which contains, for example, cross-species mapping properties.\n- The advancement of the concepts and tools behind the \"Mapping Commons\", including supporting the development of the [Mapping Registry Cookiecutter](https://github.com/mapping-commons/mapping-commons-cookiecutter)\n- Various improvements to the SSSOM metadata model, including the introduction of curation rules.\n- The [OxO2 SSSOM mapping browser](https://github.com/EBISPOT/oxo2)\n\nThe grant was awarded to members of the Monarch Initiative.\n\n### Bosch Gift to LBNL\n\nA lot of the work on tooling was supported by a Bosch Gift to the Lawrence Berkely National Laboratory (Chris Mungall group). We thank Bosch for their generous support which helped us with the following:\n\n- Implementation of conversion and testing methods in [sssom-py](https://github.com/mapping-commons/sssom-py)\n- The development of training materials\n- The development of specialised matching tools such as [OAK lexmatch](https://incatools.github.io/ontology-access-kit/guide/mappings.html) which provided the first implementation of the SSSOM standard in a matching tool.\n\n### DARPA: Young Faculty Award W911NF2010255\n\nA huge amount of refactoring of [sssom-py](https://github.com/mapping-commons/sssom-py) and development best practices, as well as training materials, was provided through this grant (awarded to Benjamin M. Gyori). Other contributions include work on the [Semantic mapping reasoner and assembler](https://github.com/biopragmatics/semra)\n"
  },
  {
    "path": "src/docs/getting-started.md",
    "content": "## Getting Started with SSSOM\n\nPre-requisites:\n\n- You know [what a mapping is](explanation/mappings.md).\n\n### Creating SSSOM files\n\nSSSOM files are typically created as spreadsheets and shared as TSV files. Tools\nexist to translate SSSOM files in TSV format into other formats such as JSON and\nRDF. The ability to curate SSSOM files as spreadsheets makes them accessible,\nespecially in scientific communities, compared to more technical formats such as\nJSON or RDF. However, this simplicity comes with trade-offs — spreadsheet-based\ncuration can make it harder to ensure that files are valid (see\n[this discussion](https://github.com/mapping-commons/sssom/discussions/428)).\nUsing a proper validation tool (see [below](#validating-your-sssom-files)) is\ntherefore strongly recommended.\n\nLet's look at a real-world example: mappings between the\n[Human Phenotype Ontology (HP)](https://hpo.jax.org/) and the\n[Mammalian Phenotype Ontology (MP)](http://www.informatics.jax.org/vocab/mp_ontology),\nderived from the [uPheno](https://github.com/obophenotype/upheno) project.\n\n| subject_id | subject_label             | predicate_id    | object_id  | object_label              | mapping_justification  |\n| ---------- | ------------------------- | --------------- | ---------- | ------------------------- | ---------------------- |\n| HP:0000175 | Cleft palate              | skos:exactMatch | MP:0000111 | cleft palate              | semapv:LexicalMatching |\n| HP:0000252 | Microcephaly              | skos:exactMatch | MP:0000433 | microcephaly              | semapv:LexicalMatching |\n| HP:0000822 | Hypertension              | skos:exactMatch | MP:0000231 | hypertension              | semapv:LexicalMatching |\n| HP:0001596 | Alopecia                  | skos:exactMatch | MP:0000414 | alopecia                  | semapv:LexicalMatching |\n| HP:0001627 | Abnormal heart morphology | skos:exactMatch | MP:0000266 | abnormal heart morphology | semapv:LexicalMatching |\n\nA SSSOM file contains two main sections:\n\n1. A header\n2. The mappings\n\nThe header contains additional metadata about the mapping set, such as the\nlicense or description:\n\n```yaml\n# curie_map:\n#   HP: http://purl.obolibrary.org/obo/HP_\n#   MP: http://purl.obolibrary.org/obo/MP_\n#   owl: http://www.w3.org/2002/07/owl#\n#   rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns#\n#   rdfs: http://www.w3.org/2000/01/rdf-schema#\n#   semapv: https://w3id.org/semapv/vocab/\n#   skos: http://www.w3.org/2004/02/skos/core#\n#   sssom: https://w3id.org/sssom/\n# license: https://creativecommons.org/publicdomain/zero/1.0/\n# mapping_provider: http://purl.obolibrary.org/obo/upheno.owl\n# mapping_set_id: https://w3id.org/sssom/mappings/27f85fe9-8a72-4e76-909b-7ba4244d9ede\n```\n\nYou can look at an example TSV file\n[on GitHub](https://github.com/mapping-commons/sssom/blob/master/examples/embedded/mp-hp-exact-0.0.1.sssom.tsv).\n\n#### Basic anatomy of a mapping\n\n![SSSOM basic architecture](images/sssom-mapping.png)\n\nYou should think of a mapping in the SSSOM-sense as a triple between a subject\n(the \"mapping source\") and an object (the \"mapping target\") via a predicate\n(such as \"exact match\"). In SSSOM, every mapping can have a lot of metadata\nassociated with it, like who created it (creator_id), and when, and how\nconfident we are in its truthfulness.\n\nConceptually, we consider the sum total of all metadata collected for a mapping\nits \"justification\" - essentially the \"evidence\" provided towards the mapping.\n\n#### Identifiers in SSSOM\n\nSSSOM files use so-called CURIEs (Compact URIs) to identify the subject and\nobject of a mapping. As you can see in the example in the previous section, the\nobject of the first mapping is `MP:0000111`, a term from the Mammalian Phenotype\nOntology. As you can see in the mandatory `curie_map`, the `MP` prefix\nrepresents the `http://purl.obolibrary.org/obo/MP_` namespace. Using a\n`curie_map` serves two purposes (1) it unambiguously identifies the entity being\nmapped. Prefixes can clash easily: the prefix `ICD` all by itself can refer to\nICD-10 Clinical Modification, ICD-10 WHO Edition, ICD-11 Foundation, ICD-11 MMS\nLinearisation, ICD-9, etc. (2) they serve as the prefix expansion instruction\nfor RDF serialisations. To convert for example `MP:0000111` into an RDF entity,\nwe first expand it to `http://purl.obolibrary.org/obo/MP_0000111`.\n\n!!! warning \"Why can't I use URIs instead of CURIEs in my TSV file?\"\n\n    The SSSOM/TSV format requires all identifiers to be in CURIE form. This is enforced by SSSOM validators.\n    CURIEs are much more readable than full URIs/URLs, making your mapping files more compact and easier to work with.\n    All prefixes used in your CURIEs must be declared in the `curie_map`.\n\n#### Mapping predicates\n\nThe `predicate_id` specifies the mapping relation between subject and object.\nAny predicate identifier may be used, but if you are just getting started, it is\nbest to stick to the\n[common predicates](spec-model.md#allowed-and-common-mapping-predicates). The\nmost frequently used ones are:\n\n| Predicate           | When to use                                                                     |\n| ------------------- | ------------------------------------------------------------------------------- |\n| `skos:exactMatch`   | The subject and object can be used interchangeably in most contexts.            |\n| `skos:broadMatch`   | The object is a broader/more general concept than the subject.                  |\n| `skos:narrowMatch`  | The object is a narrower/more specific concept than the subject.                |\n| `skos:closeMatch`   | The two are similar enough to be interchangeable in some contexts, but not all. |\n| `skos:relatedMatch` | The two are associated in some way, but not interchangeable.                    |\n\n#### Basic SSSOM Metadata\n\nEvery SSSOM mapping set has two levels of metadata: metadata about the _mapping\nset_ as a whole, and metadata about each _individual mapping_.\n\n**Required metadata for the mapping set** (see [MappingSet](MappingSet.md) for\nthe full description of all fields):\n\n| Field            | Description                                                                                                         |\n| ---------------- | ------------------------------------------------------------------------------------------------------------------- |\n| `mapping_set_id` | A globally unique identifier (URI) for this mapping set, e.g. `https://w3id.org/sssom/tutorial/example1.sssom.tsv`. |\n| `license`        | A URL to the license, e.g. `https://creativecommons.org/licenses/by/4.0/`.                                          |\n| `curie_map`      | A dictionary that maps CURIE prefixes to their IRI expansions.                                                      |\n\nOther commonly used set-level metadata includes `mapping_set_description`,\n`mapping_set_version`, `subject_source`, `object_source`, and `creator_id`.\n\n**Required metadata for each mapping** (see [Mapping](Mapping.md) for the full\ndescription of all fields):\n\n| Field                   | Description                                                          |\n| ----------------------- | -------------------------------------------------------------------- |\n| `subject_id`            | The CURIE of the entity being mapped (the \"source\").                 |\n| `predicate_id`          | The mapping relation (e.g. `skos:exactMatch`).                       |\n| `object_id`             | The CURIE of the entity being mapped to (the \"target\").              |\n| `mapping_justification` | How the mapping was determined, e.g. `semapv:ManualMappingCuration`. |\n\nOther commonly used mapping-level metadata includes `subject_label`,\n`object_label`, `confidence`, `author_id`, `mapping_date`, and `comment`.\n\nFor a comprehensive list, see the\n[Quick reference for mapping metadata](index.md#quick-reference-for-mapping-metadata).\n\n#### Mapping justifications\n\nEvery mapping in SSSOM must come with a justification - an indication of _how_\nthe mapping was established. You can think of it as the \"evidence type\" for the\nmapping. Justifications are terms from the\n[Semantic Mapping Vocabulary (SEMAPV)](https://mapping-commons.github.io/semantic-mapping-vocabulary/),\nspecifically the terms under\n[`MatchingProcess`](https://www.ebi.ac.uk/ols4/ontologies/semapv/classes/https%253A%252F%252Fw3id.org%252Fsemapv%252Fvocab%252FMatching?lang=en).\n\nSome common justifications:\n\n| Justification                                | When to use                                                                     |\n| -------------------------------------------- | ------------------------------------------------------------------------------- |\n| `semapv:ManualMappingCuration`               | A human curator determined that the mapping is correct.                         |\n| `semapv:LexicalMatching`                     | The mapping was established by matching labels or synonyms.                     |\n| `semapv:LogicalReasoning`                    | The mapping was inferred through logical reasoning.                             |\n| `semapv:SemanticSimilarityThresholdMatching` | The mapping was established by computing semantic similarity above a threshold. |\n| `semapv:MappingReview`                       | The mapping was determined through a formal review process.                     |\n\nIf you are manually curating your mappings, `semapv:ManualMappingCuration` is\nthe right choice. For more detail on how to construct more nuanced\njustifications, see the\n[Guide to using Mapping Justifications](mapping-justifications.md).\n\n<a id=\"validating-your-sssom-files\"></a>\n\n#### Validating your SSSOM files\n\nTo check that your SSSOM files are valid, you can use the\n[SSSOM Toolkit](toolkit.md) (also known as `sssom-py`). After\n[installing it](https://mapping-commons.github.io/sssom-py/installation.html),\nyou can validate a file like this:\n\n```bash\n$ wget https://w3id.org/biopragmatics/biomappings/sssom/biomappings.sssom.tsv\n$ pip install sssom-py\n$ sssom validate biomappings.sssom.tsv\n```\n\nThis will check that all required fields are present, that the CURIEs are\nproperly declared in the `curie_map`, and that values conform to the expected\ntypes.\n\nAlternatively, if you prefer a Java-based tool,\n[sssom-java](https://incenp.org/dvlpt/sssom-java/)'s `sssom-cli` can also\nvalidate SSSOM files. See the\n[sssom-cli examples](https://incenp.org/dvlpt/sssom-java/sssom-cli/examples.html)\nfor details.\n\n#### Converting SSSOM files into other formats\n\nThe SSSOM Toolkit can convert your TSV mapping sets into other formats:\n\n```bash\nsssom convert my-mappings.sssom.tsv --output my-mappings.owl --output-format owl\nsssom convert my-mappings.sssom.tsv --output my-mappings.json --output-format json\n```\n\n[sssom-java's `sssom-cli`](https://incenp.org/dvlpt/sssom-java/sssom-cli/examples.html)\ncan also convert between formally defined SSSOM serialisation formats (TSV,\nJSON, and RDF/Turtle).\n\nFor detailed information about the different serialisation formats, see\n[SSSOM/TSV](spec-formats-tsv.md), [OWL/RDF](spec-formats-owl.md), and\n[JSON](spec-formats-json.md).\n\n#### Storing and sharing SSSOM files\n\nSSSOM files are plain text (TSV), so they can be stored and version-controlled\njust like any other text file, for example in a GitHub repository. If your\nmappings are converted to RDF, they can also be loaded into a triple store or\nontology repository.\n\nYou may also choose to develop your mapping file in a columnar format like Excel\nor Google Sheets, and then convert to TSV. For many people this will be the\neasiest way to work with mapping files. Those with GitHub Actions experience can\nautomate the conversion whenever source files change.\n\n### Using SSSOM files\n\nSo far we have focused on how to _create_ SSSOM files. But what can you actually\n_do_ with them?\n\n#### Programmatic access with sssom-py\n\nThe [SSSOM Toolkit](https://mapping-commons.github.io/sssom-py) provides a\nPython API for loading, manipulating, and querying mapping sets:\n\n```python\nfrom sssom.parsers import parse_sssom_table\n\n# Load an SSSOM TSV file\nmsdf = parse_sssom_table(\"my-mappings.sssom.tsv\")\n\n# Access the mapping set metadata\nprint(msdf.metadata)\n\n# Access the mappings as a pandas DataFrame\ndf = msdf.df\nprint(df.head())\n```\n\n#### Common operations with the SSSOM Toolkit\n\nThe SSSOM Toolkit CLI supports a range of useful operations. Here are some of\nthe most common ones:\n\n- **Merging** mapping sets from different sources into one:\n\n  ```bash\n  sssom merge mappings1.sssom.tsv mappings2.sssom.tsv --output merged.sssom.tsv\n  ```\n\n- **Filtering** mappings, for example by predicate:\n\n  ```bash\n  sssom filter my-mappings.sssom.tsv --predicate_id skos:exactMatch -o exact-only.sssom.tsv\n  ```\n\n- **Diffing** two mapping sets to see what changed:\n\n  ```bash\n  sssom diff mappings-v1.sssom.tsv mappings-v2.sssom.tsv --output diff.tsv\n  ```\n\nFor a more detailed walkthrough, see the [SSSOM Toolkit guide](toolkit.md) and\nthe [sssom-py documentation](https://mapping-commons.github.io/sssom-py).\n\n#### Using SSSOM in Java with sssom-java\n\n[sssom-java](https://github.com/gouttegd/sssom-java) is a Java implementation of\nSSSOM developed by Damien Goutte-Gattat. It provides reading and writing support\nfor SSSOM/TSV and JSON formats, and can be used as a library in your own Java\napplications or as a [ROBOT](http://robot.obolibrary.org/) plugin.\n\nTo add sssom-java to your Maven project:\n\n```xml\n<dependency>\n    <groupId>org.incenp</groupId>\n    <artifactId>sssom-core</artifactId>\n    <version>1.10.0</version>\n</dependency>\n```\n\nReading and iterating over mappings:\n\n```java\nimport org.incenp.obofoundry.sssom.TSVReader;\nimport org.incenp.obofoundry.sssom.model.MappingSet;\nimport org.incenp.obofoundry.sssom.model.Mapping;\n\nTSVReader reader = new TSVReader(\"my-mappings.sssom.tsv\");\nMappingSet ms = reader.read();\n\nfor (Mapping m : ms.getMappings()) {\n    System.out.printf(\"%s -[%s]-> %s%n\",\n        m.getSubjectId(), m.getPredicateId(), m.getObjectId());\n}\n```\n\nWriting a mapping set back to TSV:\n\n```java\nimport org.incenp.obofoundry.sssom.TSVWriter;\n\nTSVWriter writer = new TSVWriter(\"output.sssom.tsv\");\nwriter.write(ms);\n```\n\nsssom-java also ships with a\n[ROBOT plugin](https://github.com/gouttegd/sssom-java) that can extract\ncross-references from OWL ontologies into SSSOM format, inject mapping-derived\naxioms into ontologies, and more. For the full documentation, see the\n[sssom-java homepage](https://incenp.org/dvlpt/sssom-java/).\n\n#### Using SSSOM in the Ontology Development Kit (ODK)\n\nThe\n[Ontology Development Kit (ODK)](https://github.com/INCATools/ontology-development-kit)\ncomes with built-in support for SSSOM. If you are maintaining an ontology using\nthe ODK, you can manage your mappings alongside your ontology source files and\nhave them automatically validated as part of your build process. For an example,\nsee the how\n[Uberon manages its mappings](https://github.com/obophenotype/uberon/blob/master/src/ontology/uberon-odk.yaml).\n\n### Where to go from here\n\n- [Detailed SSSOM curation tutorial](tutorial.md) - a step-by-step guide on how\n  to curate SSSOM mapping sets from scratch.\n- [Mapping justifications](mapping-justifications.md) - learn how to construct\n  more nuanced mapping justifications.\n- [SSSOM Toolkit guide](toolkit.md) - learn how to use the SSSOM command line\n  tools.\n- [SSSOM data model](spec-model.md) - the full specification of the SSSOM data\n  model.\n- [Training materials](training.md) - video tutorials and external guides.\n"
  },
  {
    "path": "src/docs/glossary.md",
    "content": "# Glossary\n\nThe glossary is currently being developed [here](https://docs.google.com/document/d/1QqR8j7szjaq6wzE9YLBnZ2kOD9eN14d3SYd312X8JjQ/edit?usp=sharing)."
  },
  {
    "path": "src/docs/introduction.md",
    "content": "# Introduction\n\nThis section overs an overview of SSSOM. If you are looking for a fast way to [get started, see here](getting-started.md).\n\n## Abstract\n\nMappings, or cross-references, are used to link terms across different ontologies. However, there is currently little to no standardisation in how such mappings are represented. While properties such as hasDbXref property are widely used in ontologies such as GO and MONDO, the meaning of such mappings is unclear, and cannot be further described with additional metadata or provenance.\n\nThe Simple Standard for Sharing Ontology Mappings (SSSOM) is an initiative to provide a minimal and standard set of elements for the dissemination of mappings between ontology terms, to ensure a reliable interpretation of generated mappings and to enable sharing and data integration between people and applications. \n\nThis document introduces the SSSOM catalog of metadata elements, which can be used to attach meta- and provenance data to both mappings and sets of mappings; a controlled vocabulary for the description of match types (SSSOM CV); a definition of both RDF and TSV serialisations of ontology mappings; and a (non-exhaustive) selection of recommended mapping predicates.\n\n## Introduction\n\nCurrently, there are three methods typically used to express mappings in OWL: direct logical axioms using owl:equivalentClass; the oboInOwl hasDbXref property; and the SKOS vocabulary for mapping properties.  The first, owl:equivalentClass, is a strong logical equivalence assertion which is not appropriate for more nuanced mappings such as close matches.  The second, hasDbXref, does not assert formal logical equivalence but also has no clearly defined meaning.  Finally, the SKOS vocabulary provides a hierarchy of mapping properties which allow the unambiguous specification of exact, close, broad, and narrow matches, but does not provide the means for mappings to be annotated with additional metadata such as confidence scores and provenance.\n\nThe Simple Standard for Sharing Ontology Mappings (SSSOM) addresses these problems by defining a catalog of metadata terms to describe mappings.  Both individual mappings and **_sets of_** mappings can be described, enabling provenance and metadata to be captured on multiple levels.  SSSOM interoperates with existing methods for the specification of mappings, allowing any predicate to be used to describe the nature of each mapping including those from OWL and SKOS.\n\nThe provenance of mappings - such as whether the mapping was created as the result of a human-curated equivalence match, or a semantic similarity match - is specified using a controlled vocabulary (CV), SSSOM CV.  Combined with the metadata properties provided by SSSOM such as confidence and semantic_similarity_score, this provenance information can be used to capture mapping descriptions in a manner that is explicit and amenable to curation.\n\nTwo serialisations for SSSOM mappings are provided in this document, aimed at different communities: an RDF/OWL serialisation using IRIs that is aimed at the Knowledge Graph/Semantic Web community, and a TSV serialisation using [CURIE](https://www.w3.org/TR/curie/) syntax which is aimed at the wider bioinformatics community.  An unambiguous translation between these serialisations is provided.\n\n## Challenges for exchange and use of mappings\nDespite their importance for data integration, term mappings are typically neglected as data artefacts (57). A mapping in this context is a correspondence between two terms, referred to here as \"subject\" and \"object\" terms. A \"predicate\" defines the type of relationship between the subject and the object, such as skos:exactMatch, or owl:equivalentClass. A mapping, or \"match\", does not have to be exact: it can be broad, e.g. between a conceptually narrow term such as \"Red Delicious\" and a conceptually broader term such as \"Apple\". To our knowledge, no formal review has been published that analyzes the representation and formats used for collections of term mappings (mapping sets, or alignments), but in our experience, most mapping sets are represented as tables using an ad-hoc \"schema\", often merely a simple two-column format that lists matching terms in two naming schemes. An example of such a table can be seen in the following Table.\n\n\nSubject | Object\n--- | ---\nUBERON:0002101 | FMA:24875\nUBERON:0000019 | FMA:54448\n\n```\nTable 1: An example of a typical mapping table one might find on the web.\n```\n\nThis type of table lacks clear semantics and is therefore very difficult to use and reuse either by humans or by machines. We will discuss a few of the most critical problems in the sections that follow.\n\n_Non-transparent imprecision_. Mapping precision describes, usually qualitatively, whether a mapping between a subject and an object is exact, broad, narrow, close or related. An exact mapping means that the subject term can be replaced with the object term and vice versa, i.e. they refer to the exact same real-world entity. A broad mapping links a subject term to a more general term, for example, the term \"leg\" to the term \"hindlimb\" (if the ontology defines leg as the parts of the hindlimb that exclude the foot). A narrow mapping links a subject term to a more specific term. For example, \"long QT syndrome\" in the Mondo Disease Ontology is a narrow match to \"Romano-Ward long QT syndrome\" in Orphanet. A close mapping relates two terms that are neither exact, broad or narrow, but belong to the same category of things and are semantically similar, such as \"apple\" to \"pear\", or \"paw\" to \"hand\". Due to its subjective nature (\"what is close?\"), this is a problematic category of mapping, but it is widely used, for example for relating similar anatomical terms across species. Related mappings are mappings across categories of things, such as the mapping between a phenotype \"enlarged liver\" and the anatomical entity \"liver\". In practice, it is rare that mapping tables such as the one presented in Table 1 constitute a set of purely \"exact\" matches. \n\nDifferent use cases may require different levels of mapping precision. For example, for entity merging (defined as the process of merging two entities from different sources into one) or data translation (defined as the process of moving annotations from using one ontology to another), exact mappings may be required, while for data grouping broad matches are often sufficient (ensuring that the subject is classified under the object term). For many machine learning use cases, close and related matches will be extremely useful regardless of their lack of semantic precision (though semantic precision is likely to improve predictive power). In practice, many mappings are to varying degrees imprecise but do not specify the mapping precision. This makes it impossible to reliably apply them to use cases such as entity merging or data translation.\n\n_Non-transparent accuracy, confidence, and provenance_. To scale to real-world use cases, automated tools are critical for matching terms across databases, terminologies and ontologies. Such tools typically implement mapping rules that determine whether a given pair of terms constitutes a match. For example, label matching rules might include \"match if subject and object labels match\", \"match if subject label matches with an exact synonym of the object\" and \"match if subject and object exhibit a very high degree of semantic similarity\". Depending on the rules, tools will have more or less confidence that a match constitutes a mapping. Even human curators often have different levels of confidence about the accuracy of any given mapping, especially if the process of determining whether a mapping is accurate involves the review of (often complex) descriptions and term definitions. \n\nDifferent use cases will profit from different degrees of accuracy. For example, if we seek to integrate data from various medical terminologies to inform medical diagnosis, we may require not only a very high degree of confidence about the mapping but also ensure that the mapping is \"explainable\" to users. To ensure that diagnostic decisions that require bridging of data silos through mappings are explainable, we furthermore need provenance (documentation of where a piece of data comes from and how it was produced), such as an explicit statement of the mapping rules by which the match was originally determined (for example, the labels of both terms could have been the same). Thanks to efforts by initiatives such as the Ontology Alignment Evaluation Initiative (OAEI), many mapping tables on the web include at least a confidence score. However, in our experience, mapping rules are rarely stated explicitly as part of the mappings or mapping set metadata. Many mappings in the wild are to varying degrees inaccurate, but without a confidence score and explicit mapping rules, this inaccuracy will not be transparent.\n\n_Non-transparent incompleteness_. Mapping sets can be incomplete for (at least) three major reasons: (1) they are out of date, i.e. a term in one ontology was removed (deprecated) in a later version of the ontology or a term with a more precise mapping was introduced; (2) they are deliberately partial, i.e. covering only a subset of terms, which were mapped for a specific purpose (for example a manual effort to map all COVID-19-relevant  phenotypes from the Human Phenotype Ontology to the Mammalian Phenotype Ontology); or (3) they accidentally omit certain correct mappings, as the automated approaches that were used did not detect them (false negatives). We cannot determine whether a mapping set such as the one given in Table X1 is up-to-date, deliberately partial or accidentally incomplete without sufficient metadata about the purpose of the mappings, the tools used and the version of the source data used for the matching process.\n\n_UnFAIRness_. The FAIR principles are a set of community-developed guidelines to ensure that data or any digital object are Findable, Accessible, Interoperable and Reusable. Unlike many of the widely used controlled vocabularies, ontologies and data schemas, mappings are rarely published using standard formats and metadata vocabularies and can therefore be considered second class citizens in the world of FAIR semantics. \nWhile some tools exist to browse mappings (the F and A in FAIR, findable and accessible), such as OxO and BioPortal, they lack access to at least some of the metadata required to determine their applicability for a use case: Are mappings likely to be correct? Are they precise enough? Have they been updated recently? Can I trust the authority that generated the mappings? While some minimum level of interoperability (the I in FAIR) is achieved simply by publishing the mappings as RDF triples (which rarely happens in practice), most mappings are best captured in the form of simple tables (in our experience the preferred format for both mapping curators and data engineers). Furthermore, the predicates or relations used in the mappings are far from standardized. Different relations have different semantics, ranging from strong logical relations such as owl:sameAs or owl:equivalentClass to predicates with no formally specified semantics such as oboInOwl:hasDbXref. \n\nIn our experience, reusability (the R in FAIR) is a significant obstacle to FAIRness. It is infeasible to simply reuse existing mappings without the metadata required to make imprecision, inaccuracy and incompleteness explicit. Repositories such as OxO and BioPortal cannot make mappings more accessible, because the metadata required to do so simply does not exist. In order to gradually improve our mappings and make them FAIRer, we need to be able to share, review, fix and maintain our mappings in much the same way as our ontologies themselves - using standard formats and rich metadata.\nFAIRifying data is an effort that aims to supply practical solutions for the use of the FAIR guiding principles throughout the research data life cycle. It recommends technologies that support semantic interoperability in a sustainable way, and practices that support FAIRness. The FAIRSemantics effort is currently discussing how to incorporate semantic mappings, and we reached out to them to consider SSSOM for this purpose.\n\n## Background about mappings\n\nA mapping can be defined as a triple _s, p, o_, where s is the subject of the mapping, p is the mapping predicate (or relation) and o is the object. There are many different mapping predicates used in practice, but they are not always standardized. The Semantic Web community uses a number of standard mapping predicates, such as owl:sameAs or owl:equivalentClass (logical mapping predicates) and skos:exactMatch or skos:broadMatch (terminological mapping predicates). We refer to mapping subjects and objects as \"terms\", which we will loosely define here as a set of symbols that define some entity in the real world. Usually, a term can be referred to by an identifier that uniquely identifies some entity in a certain context. For example, UBERON:0002101 is the identifier for a term that refers to the anatomical entity \"limb\". \nPutting it all together, the mapping <UBERON:0002101, skos:exactMatch, FMA:24875> describes a correspondence in which the term with the id UBERON:0002101 constitutes a terminological exact match to the term with the identifier FMA:24875. Mappings between data model elements, databases and other representations can be described similarly. Note that we generally use the terms \"matching\" and \"mapping\" interchangeably. Occasionally we refer to \"matching\" as the process to determine a mapping candidate (lexical matching, logical matching etc), a \"match\" as the result of the matching process, and a \"mapping\" the process and result of the process that deduces a true correspondence from a (set of) matches. For SSSOM, this distinction is a bit academic, but useful to keep in mind when talking about the interplay of automated approaches (which result in \"matches\") and manual approaches (which typically result in the final mappings). Ontology alignment is the task of determining corresponding terms shared between two or more ontologies, i.e. mappings. Sometimes \"ontology alignment\" refers to the output of the alignment process.\n\nMapping sets can be \"partial\", i.e. covering only a subset of terms in the subject or object source (ontology, database, etc), \"derived\", i.e. one mapping set can be obtained from one or more others (for example, a XAO to MeSH mapping can be obtained by combining a XAO-Uberon mapping with a Uberon-MeSH mapping), or \"complete\". We refer to a \"complete\" mapping, i.e. the set of all correspondences between two resources (ontologies, databases), as an \"alignment\".\n\nThe identifier of a term has three parts: a namespace that describes in which database or ontology the identifier is defined, a local identifier that unambiguously identifies an entity within that namespace, and optionally a separator that can be used to separate the namespace from the local identifier to make them easier to process. UBERON:0002101, for example, comprises the namespace \"UBERON\", the separator \":\" and the local identifier \"0002101\". There are various syntaxes for denoting identifiers; the UBERON:0002101 notation is called compact URI (CURIE) syntax, which is used widely across the database and ontology worlds. The problem with this syntax is that UBERON may not be a globally unique prefix, so files making use of such CURIEs must come with a prefix map that ensures that UBERON (in the CURIE syntax referred to as \"prefix\") is globally unique by mapping it to the persistent International Resource Identifier (IRI) prefix http://purl.obolibrary.org/obo/UBERON_. This may not be a major problem for a fairly unique prefix such as \"UBERON\", but it is for prefixes such as \"ICD\", which can refer to many different name spaces, such as ICD9, ICD10, ICD11 and more, all of which correspond to entirely different terminologies.\n\n_Approaches to mapping_. There are many different techniques that can be employed to generate term mappings. Automated matching techniques include ontology matching, entity resolution (the task of determining whether two database records correspond to the same entity), semantic similarity or automated reasoning. Recent approaches based on machine learning and graph embeddings show promise for working with messier inputs. No single tool will perform equally well on all inputs: some of the semantics-aware tools like LogMap and Agreement Maker Light (AML) can exploit the ontology structure to determine high-quality matches but will have problems with the large-scale data linking tasks required by modern big-data applications. \n\nPurely automated approaches to mapping are often insufficient for real world use cases that require a high degree of accuracy, such as medical diagnostics. They often need to be refined by hand or using sophisticated mapping reconciliation approaches independent of the actual matching. Determining a mapping is often complex, due to the high degree of terminological variability: different communities may use very different names for the same real world entities . For example, for example, the condition referred to in the Human Phenotype Ontology (HPO) as \"Hyperchloriduria\" is called \"increased urine chloride ion level\" in the Mammalian Phenotype Ontology (MP), which is used by the model organism community.\n\n_Mapping rules - capturing the conditions under which a match is established_.\nMapping rules define the conditions under which we determine a match between two terms. For example, the condition for a mapping rule could be \"if the subject label and object label match exactly\". In practice, mapping rules can be very simple (e.g., \"exact match of term labels\"),  more complex (\"exact match between label of subject and exact synonym of object after they are pre-processed using stemming\"), or even more exacting (\"complex match determined by a human curator that carefully reviewed the descriptions and definitions of both terms and concluded they mean the same thing\"). One problem for both manually curated mappings and automated approaches is that these mapping rules are often hidden deeply in the code or are not documented at all. Exposing mapping rules along with confidence scores would be very valuable for reviewing mappings and explaining them to users. Our reference implementation for SSSOM is rdf-matcher, which makes these mapping rules explicit, but other approaches such as OMOP2OBO also capture mapping rules as part of the mapping metadata.\n"
  },
  {
    "path": "src/docs/javascripts/mathjax.js",
    "content": "window.MathJax = {\n  tex: {\n    inlineMath: [[\"\\\\(\", \"\\\\)\"]],\n    displayMath: [[\"\\\\[\", \"\\\\]\"]],\n    processEscapes: true,\n    processEnvironments: true\n  },\n  options: {\n    ignoreHtmlClass: \".*|\",\n    processHtmlClass: \"arithmatex\"\n  }\n};\n\ndocument$.subscribe(() => {\n  MathJax.startup.output.clearCache()\n  MathJax.typesetClear()\n  MathJax.texReset()\n  MathJax.typesetPromise()\n})\n"
  },
  {
    "path": "src/docs/mapping-commons.md",
    "content": "# How to set up a Mapping Commons\n\nA mapping commons is an open, collaborative space for managing and reconciling mappings. The goal is to collect mappings from a variety of sources into a _mapping set registry_, standardise them into a common representation, curate some basic metrics such as \"confidence\" (how much does the community managing the commons trust a specific mapping source?) and provenance (where exactly did this mapping come from before it was integrated).\n\nThere is no agreed upon standard for mapping registries yet. SSSOM itself provides a [lightweight metadata model for mapping registries](https://mapping-commons.github.io/sssom/) which is, as of August 2023, under active development.\n\n## Typical setup of a mapping commons\n\nWe recommend to base your mapping commons on a combination of GitHub (or GitLab) collaborative workflows (issues and discussions for the community, access management etc) and a git repository based on the [Mapping Commons Cookiecutter Template](https://github.com/mapping-commons/mapping-commons-cookiecutter) for version control of the mappings. \n\nUsing the template system above allows you to: \n\n1. make use of basic CI and quality control for your mappings, \n2. provides a standard way to document metadata about your mapping sets\n3. provides a basic ETL system based on `gnu make` (which you dont have to use, its just convenient)\n4. Provides a standardised registry format that can be reused/imported by others.\n\nExamples of Mapping Commons are:\n\n1. https://github.com/mapping-commons/mh_mapping_initiative\n1. https://gitlab.c-path.org/c-pathontology/mapping-commons\n"
  },
  {
    "path": "src/docs/mapping-justifications.md",
    "content": "# Guide to using Mapping Justifications\n\nThe goal of this document is to provide the user with a few pointers into the art of mapping justification construction. As of Summer 2023, the SSSOM justification system is still evolving, and will likely benefit from yoru input. Where informative metadata properties or values are missing from the [SSSOM datamodel](https://mapping-commons.github.io/sssom/) or [SEMAPV](https://mapping-commons.github.io/semantic-mapping-vocabulary/), request them on the [SSSOM](https://github.com/mapping-commons/sssom/issues) or [SEMAPV issue tracker](https://github.com/mapping-commons/semantic-mapping-vocabulary/issues) respectively.\n\n## Table of contents\n\n1. [lexical matching](#lexical-matching)\n1. [semantic similarity threshold-based matching](#semantic-matching)\n1. [manual mapping curation](#manual-mapping-curation)\n1. [mapping review](#mapping-review)\n1. Other justifications\n    1. background knowledge-based matching\n    1. composite matching\n    1. instance-based matching\n    1. lexical similarity threshold-based matching\n    1. logical reasoning\n    1. mapping chaining-based matching\n    1. mapping inversion-based matching\n    1. semantic similarity threshold-based matching\n    1. structural matching\n    1. unspecified matching\n\n\n<a id=\"lexical-matching\"></a>\n\n## Lexical matching\n\nThere are two kinds of lexical matching justifications we try to distinguish:\n\n- [semapv:LexicalMatching](https://w3id.org/semapv/vocab/LexicalMatching): The match is exact (potentially after pre-processing)\n- [semapv:LexicalSimilarityThresholdMatching](https://w3id.org/semapv/vocab/LexicalSimilarityThresholdMatching): The match is fuzzy (for example, Levenshtein distance). Note: embedding similarity, even if constructed purely of a word embedding, is considered a form of _semantic_ similarity.\n\n#### Level 1: Track the fact that the match was based on a lexical process\n\nWhenever a mapping was established by a lexical matching process, track at least that fact:\n\n- [mapping_justification](https://mapping-commons.github.io/sssom/mapping_justification/)`: `[semapv:LexicalMatching](https://w3id.org/semapv/vocab/CompositeMatching). This indicates that the mapping was determined through some form of exact lexical matching.\n\n#### Level 2: Track the specific datamodel fields involved in the matching process\n\nRegardless of which specific lexical matching justification you are working on, it is often useful to document the source field of the values used to acquire the match. For example:\n\n- [subject_match_field](https://mapping-commons.github.io/sssom/subject_match_field/)`: rdfs:label` indicates that the value of the `rdfs:label` property on the subject entity was used to establish the match.\n- [object_match_field](https://mapping-commons.github.io/sssom/object_match_field/)`: skos:prefLabel` indicates that the value of the `skos:prefLabel` property on the object entity was used to establish the match.\n- [match_string](https://mapping-commons.github.io/sssom/match_string/)`: somestring` the exact string that was used to establish the match. This is especially useful if preprocessing methods are applied, see below (Level 3).\n\n#### Level 3: Pre-processing\n\nThere are many pre-processing techniques for text in the NLP literature, such as lower-casing or lemmatisation. To judge the fidelity of a match, it is often useful to document the exact techniques used.\n\n- [subject_preprocessing](https://mapping-commons.github.io/sssom/match_string/)`: semapv:BlankNormalisation` indicates that before determining the match, blank characters (spaces etc) where standardised in some way. There are plenty of preprocessing techniques already recorded in [SEMAPV](https://mapping-commons.github.io/semantic-mapping-vocabulary/), including semapv:BlankNormalisation, semapv:CaseNormalization, semapv:DiacriticsSuppression, semapv:DigitSuppression, semapv:Lemmatization, semapv:LinkStripping, semapv:PunctuationElemination, semapv:RegexRemoval, semapv:RegexReplacement, semapv:Stemming, semapv:StopWordRemoval, semapv:TermExtraction, semapv:Tokenization, but feel free to add more.\n\nHowever, there is one aspect that makes this process quite difficult to implement: Most matchers will blindly apply a set of normalisation techniques prior to processing, but not document which exact technique **had an effect**. It is obviously less useful to say: we applied all these 20 techniques, if only one of them was actually effectual (i.e. caused the string to change).\n\nIf there is no (easy) way to keep track of which technique was effectual for any given match, we believe that it is still better to document all techniques, but doing so on `mapping set` level rather than for each individual mappings (to keep the mapping sets smaller).\n\n<a id=\"semantic-matching\"></a>\n\n## Semantic similarity threshold-based matching\n\nThe basic idea behind \"Semantic similarity threshold-based matching\" is that a process that is \"semantics aware\" (in the loose sense, either by being cognisant about the graph structure, the logical structure, or a contextual textual knowledge such as an embedded Wikipedia article) enabled computing a score between the subject and object entity that to some degree reflects the \"similarity\" between the two entities. There are many examples of this:\n\n1. The (graph-)structure around the subject and object entities are projected into a common embedding space, and the similarity between the subject and object entities are expressed as cosine similarity between the two embeddings.\n1. The jaccard similarity between a set of properties of the subject and object entities is calculated.\n1. The Resnik score is calculated between the subject and object entities.\n\n**Important note on applicability of SSSOM for semantic similarity profiles**: SSSOM is not used for documenting semantic similarity profiles, i.e. cross-tables where some set of terms are compared with another set of terms and the semantic similarity is recorded as a score. SSSOM is used to document mappings, and only if a mapping decision is influenced by a semantic similarity based approach, especially in conjunction with as specific threshold, SSSOM is applicable. For pure semantic similarity tables use [OAK Semantic Similarity](https://incatools.github.io/ontology-access-kit/datamodels/similarity/index.html).\n\n**Semantic vs lexical similarity?**: Semantic similarity is different from lexical similarity intuitively because the context (the graph structure, the background information) is taken into account and provides an (often crude) model of the actual entity, rather than of the word describing it. However, the distinctions can become a bit hazy. Imagine learning a graph embedding on a graph without edges, or a word embedding purely on a single label - there is definitely a grey zone where lexical similarity finishes and semantic similarity begins. In practice though, it should be mostly clear.\n\n#### Level 1: Documenting semantic similarity matches\n\nThe suggested metadata for semantic similarity threshold-based matching approach is:\n\n- [semantic_similarity_measure](https://mapping-commons.github.io/sssom/semantic_similarity_measure/)\n- [semantic_similarity_score](https://mapping-commons.github.io/sssom/semantic_similarity_score/)\n- ((authors note: Maybe we need a [value for similarity threshold](https://github.com/mapping-commons/sssom/issues/296)?))\n\n<a id=\"manual-mapping-curation\"></a>\n\n## Manual mapping curation\n\n[semapv:ManualMappingCuration](https://w3id.org/semapv/vocab/ManualMappingCuration) is a process conducted by a (usually human) agent to determine a mapping by virtue of domain expertise. The task usually involves the agent determining, for a given `subject_id`, a suitable `obect_id` in the `object_source`.\n\n#### Level 1: Documenting manual mapping curation\n\nThe suggested minimal metadata for manual mapping curation is:\n\n- [author_id](https://mapping-commons.github.io/sssom/author_id/): Documenting, using a unique identifier such as an ORCID, the identity of the author performing the expert curation.\n- [comment](https://mapping-commons.github.io/sssom/comment/): When no formal [curation_rule](https://mapping-commons.github.io/sssom/curation_rule/) is provided (see below), it is recommended to provide a short comment with the mapping justification, especially if there is some uncertainty or ambiguity about the mapping decision.\n\n#### Level 2: Documenting the confidence of expert curation\n\n[confidence](https://mapping-commons.github.io/sssom/confidence/) is an incredibly useful metric for downstream users, including ETL engineers and data analysts. In an ideal world, all mappings have some kind of confidence associated with them. `confidence` scores should be read as \"the strength of evidence provided in this record/table row (i.e mapping justification) leads us to believe the mapping (e.g. OMOP:44499396 --[skos:broadMatch]--> OMOP:4028717) is correct with 90% confidence.\n\nIn manual curation, confidence expresses the domain expertise degree of conviction that the asserted mapping holds true. While manual mapping curation is still considered a gold standard, in practice human agents have (a) varying levels of expertise on the subject domain, (b) varying levels of understanding of the intuitions behind \"semantic spaces\" and associated concepts and (c) varying levels of metadata associated with a concept to be able to determine a match (definitions, labels, papers, synonyms, etc). Documenting confidence can be very useful both to increase the transparency of data science pipelines that involve entity mappings, and as a means to increase curation speed: rather than trying to achieve 100% confidence for a mapping, which can be extremely time-consuming, it is often better to first \"wave through\" a mapping with lower confidence to reach coverage, and later revisit low confidence mappings iteratively.\n\n#### Level 3: Documenting curation rules\n\nFor manual matches, it is often unclear by what criteria a match was established. Documenting the `curation rule`s can help increase consistency for manual curation, and transparency for downstream users.\n\nFor example `OHDSI_CURATION_RULE:19` could correspond to the following rule:\n\nOHDSI_CURATION_RULE:19 = If the subject concept does not have an exact match in the object source vocabulary, we select the nearest broad (\"up-hill\") concept applicable. Conceptually, if both terms would exist in the same terminology, the subject concept can be defined as a subconcept of the object concept. The determination for both criteria (nearest broad, conceptally subconcept) is performed through medical expert judgement.\n\nCuration rules are often very use case-specific and difficult to standardise. As of August 2023, SSSOM does not provide any standardised curation rules, but encourages the community to define them locally.\n\n<a id=\"mapping-review\"></a>\n\n## Mapping review\n\n[semapv:MappingReview](https://w3id.org/semapv/vocab/MappingReview) is a process conducted by a (usually human) agent to determine the validity of a specific given mapping. It differs from [semapv:ManualMappingCuration](https://w3id.org/semapv/vocab/ManualMappingCuration) in that it does not involve looking for alternative mappings or indeed, necessarily determining if a mapping is the best possible mapping. It should be considered cheaper, less trustworthy evidence compared to [semapv:ManualMappingCuration](https://w3id.org/semapv/vocab/ManualMappingCuration).\n\nThere are two kinds of mapping reviews in SSSOM:\n\n- Review as an independent justification: [semapv:MappingReview](https://w3id.org/semapv/vocab/MappingReview) is an independent process that determines the validity of a mapping.\n- Review _of_ an existing justification: Instead of evaluating an entire mapping, you can record the fact that someone has looked at a specific justification and deemed it acceptable. In this case, simply record the reviewers identify using the [reviewer_id](https://mapping-commons.github.io/sssom/reviewer_id/) or [reviewer_label](https://mapping-commons.github.io/sssom/reviewer_label/)\n and the optional [review_date](https://mapping-commons.github.io/sssom/review_date/) and [reviewer_agreement](https://mapping-commons.github.io/sssom/reviewer_agreement/) fields.\n\n"
  },
  {
    "path": "src/docs/mapping-predicates.md",
    "content": "# How to pick the right mapping predicates\n\nA mapping predicate such as skos:exactMatch specifies the semantics of the mapping relation - in other words, it defines how a computer (and human!) should interpret the mapping when it is being used. For example, a computer program may be allowed to merge nodes in a knowledge graph _only when they are `skos:exactMatch`_, but not when they are, say, `skos:closeMatch`.\n\nPicking the right predicate to specify the meaning of your mapping is often a difficult process. The following guide should help you to understand the most widely used mapping predicates and when they are appropriate.\n\n## Table of content\n\n- [The three primary concerns for selecting a mapping predicate](#primary)\n- [The 3 step process for selecting an appropriate mapping predicate](#tenstep)\n- [Frequently asked questions about mapping predicates](#faq)\n\n## Glossary\n\n- `subject`: the entity that is being mapped\n- `object`: the entity that the `subject` is mapped to\n- `predicate`: the semantic mapping relationship used\n\n<a id=\"primary\"></a>\n\n## The three primary concerns for selecting a mapping predicate\n\nThere are at least three things you need to decide before selecting an appropriate mapping predicate:\n\n1. [Precision](#precision)\n2. [Acceptable degree of noise](#noise)\n3. [Intended use case](#use-case)\n\n<a id=\"precision\"></a>\n\n### What is the **precision** of the mapping? \n\nAs a curator, you should try to investigate the **intended meaning** of both the subject and the object. This task usually involves trying to find out as much as possible about the mapped identifiers: What is their human readable definition? Are there any logical axioms that could help with understanding the intended meaning? Sometimes, this even involves asking the respective stewards of the database or ontology for clarification. **Important:** The key here is \"intended meaning\". For example, when you see `FOODON:Apple` (FOODON is an ontology), you do not try to figure out _what an apple is_, but what thing in the world (in your conceptual model of the world) the FOODON developers _intended the `FOODON:Apple` identifier to refer to_. This might be an apple that you can eat, or a [cultivar](https://en.wikipedia.org/wiki/List_of_apple_cultivars)!\n\nThe **precision** is simply: is the mapping `exact`, `close`, `broad`, `narrow` or `related`? Here is a basic guide about how to think of each:\n\n- `exact`: The two terms are intended to refer to the same thing. For example, both the subject and the object identifiers refer to the concept of [Gala cultivar](https://en.wikipedia.org/wiki/Gala_(apple)).\n- `close`: The two terms are intended to refer to roughly the same thing, but not quite. This is a hazy category and should be avoided in practice, because when taken too literally, most mappings could be interpreted as close mappings. This is not the point of creating mappings, if their intention is to be useful (see \"use case\" considerations later in this document). An example of a `close` mapping is one between the \"heart\" concept in a database of anatomical entities for biological research on chimpanzees and the \"human heart\" in an electronic health record for humans.\n- `broad`: The object is conceptually broader than the subject. For example, \"human heart\" in an electronic health record refers to \"heart\" in a general anatomy ontology that covers all species, such as Uberon. Another example is \"Gala (cultivar)\" in one ontology or database to \"Apple (cultivar)\" in another: the Apple (cultivar) has a broader meaning then \"Gala (cultivar)\". For a good mapping, it is advisable that \"broad\" and \"narrow\" are applied a bit more strictly than is technically permitted by the SKOS specification: both the subject and the object should belong to the same **category**. For example, you should use broad (or narrow) only if both the subject and the object are \"cultivars\" (in the above example).\n- `narrow`: The object is conceptually narrower than the subject. For example \"Apple (cultivar)\" is a narrow match to \"Gala (cultivar)\". Think of it as the opposite of \"broad\". `broad` and `narrow` are so-called inverse categories: If \"Gala (cultivar)\" is a `broad` match to \"Apple (cultivar)\", then \"Apple (cultivar)\" is a `narrow` match to \"Gala (cultivar)\"! One **note of caution**: `narrow` matches generally have less useful applications then `broad` ones. For example, if we want to _group_ subject entities in a database under an ontology to make them queryable in a knowledge graph, only `broad` matches to the ontology can be retrieved. For example, if we map \"Gala (cultivar)\" in a database to \"Apple (cultivar)\" in an ontology, and we wish to write a semantic query to obtain all records that are about \"Apple (cultivar)\" according to the ontology, we obtain \"Gala (cultivar)\". This is not true the other way around: if the ontology term is _more_ specific then the database term, it can't be used to group the database data.\n- `related`: The subject refers to an analogous concept of a different category. For example \"Apple\" and \"Apple tree\" are considered `related` matches, but not `exact` matches, as \"Apple\" is of the \"fruit\" category, and \"Apple tree\" of the \"tree\" category. Other examples include: \"disease\" and \"phenotype\", \"chemical\" and \"chemical exposure\", \"car\" and \"car manufacturing process\". In general, `related` mappings should be reserved for \"direct analogues\". For example, we should not try to map to `related` and `broad` categories at the same time, like, for example, \"Gala (cultivar)\" to \"Apple tree\". This causes a huge amount of proliferation of very \"low value\" mappings (see use case section later).\n\n<a id=\"noise\"></a>\n\n### What is the **acceptable degree of noise** of the mapping?\n\n\"Noise\" is the permissible margin of error for some target use case. Depending on what you want to do with your mappings, different quality levels are acceptable. This section is _not exhaustive_. \n\nWhile reading through this section, you should keep one thing in mind: it is _never_ a good idea to think about mappings as \"correct\" or \"wrong\". Even the the exact same identifier (for example in Wikidata, or even the biomedical data domain) can mean something very different depending on which database it is using it or in which part of which datamodel (or value set) they are used. Mapping should therefore be perceived as an inexact art where the goal is not \"correctness\" but \"fitness for purpose\": can the mappings deliver the use case I am interested in? In the following, we will take a closer look at the varying levels of noise you may need to weigh against each other.\n\n- \"zero-noise\". Some mappings directly inform decision processes of downstream consumers, such as clinical decision support or manufacturing. For example, in an electronic health record (EHR) system we may want to know what the latest recommended drugs (or contra-indications) for a conditions are, and the disease-drugs relationships may be curated using one terminology such as [OMOP](https://ohdsi.org/omop), and the EHR may be represented using [ICD10-CM](https://icd.codes/icd10cm) (a clinical terminology used widely by hospitals). In these cases, noise should be zero or close to zero, as patient lives depend on the correctness of these mappings.\n- \"low-noise\". Most mappings are used to augment/inform processes that are a bit upstream of the final consumer. For example, mappings are used to group data for analysis or make it easier to find related data during search (enhancing search indexing semantically). The final consumer does not immediately \"see\" the mappings, but  just  the consequences of applying the mappings. In these cases, a bit of noise may be acceptable, i.e. some mappings that are \"not quite right\". Practically, this is very often the case where data sources are aligned automatically to enable searches across, so a few bad mappings are better than having none. \n- \"high-noise\": Some use cases employ data processing approaches that are themselves highly resilient to noise, like Machine Learning. Here, even a larger number of mappings (in a knowledge graph for example) which are \"not quite right\", or noisy, may be acceptable (if the signal to noise ratio is still ok, i.e. there are \"more good than bad\" mappings).\n\nThere is no easy formula by which you can decide what level of noise is acceptable. Your use case will determine this. What you, as the steward of your organisation's mapping data, should consider is that there is (roughly) an order of magnitude in cost involved between the three levels:\n\n- \"high-noise\": Very cheap to generate. Automated matching tools can be used to generate the mappings, with no human review required. Your system may implement a way for your consumers to flag up bad results which can be traced back to a bad mapping, and simply exclude them moving forward.\n- \"low-noise\": Moderately expensive. Most mappings are generated using automated matchers, but then confirmed by a human curator. The confirmation process can often be \"hand-wavy\" to weed out obviously bad mappings, but do not involve the same rigour as \"zero-noise\" mappings would require to maintain scalability to large volumes of mappings. Such a \"hand-wavy\" confirmative review can take 10 seconds to 100 seconds (if a quick lookup is required).\n- \"zero-noise\": Very expensive. Every mapping must be carefully reviewed by a human curator, sometimes by a group of curators. In our experience, reviewing or establishing a mapping like this (manually) can take anything between 10 and 30 minutes - occasionally more.\n\nYou can use these estimated costs for mapping review to determine how much it would cost to apply the same level of rigour to your own mappings.\n\n<a id=\"use-case\"></a>\n\n### What is the intended use case?\n\nThis section is informative, not exhaustive, and will give you a sense of how use cases affect your choice of mapping predicate.\n\nWe have covered some implications of use cases in the sections above:\n\n1. Some use cases require lower _levels of noise_, others can live with higher levels of noise.\n2. Mappings are rarely 100% exact when mapping across semantic spaces (different database, ontologies, terminologies). What matters is not \"correctness\" - what matters is that the mappings are \"_fit for purpose_\" (i.e. useful for your use case).\n3. Some mappings may be of _more value_ for your use case than others (for example, `exact` mappings may be more valuable than `broad` mappings). You can find the right level of cost benefit by selecting optimising value and cost of generating/maintaining such mappings. `close` mappings may often have a very low value, but if your acceptable level of noise is high, just generate them, since they don't cost you anything!\n\nOther key considerations in the sections are:\n\n- [Semantic frameworks for analysis and querying](#uc-semantic)\n- [Instance vs concept-level mapping](#instance)\n- [Typical use cases](#uc-typical)\n\n<a id=\"uc-semantic\"></a>\n\n#### Semantic frameworks for analysis and querying\n\nThere are four semantic frameworks/formalisms that default SSSOM supports: (1) [SPARQL/RDF(S)](https://www.w3.org/TR/rdf-sparql-query/) (querying an integrated knowledge with basic SPARQL); (2) [Simple Knowledge organisation systems (SKOS)](https://www.w3.org/TR/skos-reference/); (3) [Web Ontology Language (OWL)](https://www.w3.org/TR/owl2-syntax/); (4) no formalism (property graphs, non-semantic use cases). We will briefly discuss the implications of each for your use cases.\n\n- SPARQL/RDF(S) is a very general semantic framework that allows query across [property paths](https://www.w3.org/TR/sparql11-property-paths/). Many SPARQL engines provide at least RDFS entailment regime, which allows for some (basic) semantic reasoning (subClassOf, property domains). This is the most likely semantic framework of choice if your use case involves semantic queries such as those involving sub-class groupings.\n- SKOS is a semantic framework that layers on top of RDF and specifies semantics for a handful of properties that are useful for building taxonomies that do not seek to follow the rigorous semantics of the class-level modelling constructs such as subClassOf. We have no experience with SKOS reasoners, and do not know if there are any out there. This means, in effect, that this \"case\" (semantic framework) has the same exact considerations as the SPARQL/RDF(S) one above.\n- OWL is a very powerful semantic framework that is based on formal logic. Ontologies represented in OWL offer support for complex expressions of knowledge, way beyond what RDFS and SKOS can do. OWL is the semantic framework of choice if the goal is to build **and reason** over an integrated (merged) ontology. An example use case where OWL is the appropriate framework is integration of species-specific anatomy ontologies under species-neutral ones, see for example [Uberon](https://github.com/obophenotype/uberon). A basic rule of thumb is: unless you know positively that you have to reason over the _merged_ graph, i.e. set of all ontologies you have mapped across, OWL is probably overkill and should be avoided.\n- Using no semantic framework does not mean semantic mappings are useless! Many extremely useful applications exist for mappings which do not involve a semantic framework, such as those related to [Labelled Property Graphs](https://www.oxfordsemantic.tech/fundamentals/what-is-a-labeled-property-graph) (for example [neo4j](https://neo4j.com/)). Even if you just want to translate your data into a graph, it is useful to know the semantics of your mappings as they can inform your graph queries.\n\nOther semantic frameworks exist such as rule-based systems (e.g. Datalog, SWRL), but they are not used as widely as the above in our domain.\n\n<a id=\"uc-semantic\"></a>\n\n#### Instance vs Property vs Concept-level mapping\n\nTo pick the correct mapping predicate, it is important to understand whether you are mapping concepts or instances:\n\n- Concept-level: the entity being mapped constitutes a class or a concept. A concept can be thought of a collection or set of individuals. For example, \"Apple\" could refer to the class of all apples.\n- Instance-level: the entity being mapped constitutes an individual or an instance. An instance is a single real-world entity, such as Barack Obama. Instances are members of classes/concepts. For example, Barack Obama belongs to the class of \"Person\", or \"Former Presidents\". Another example is an individual apple on a shelf in a supermarket (\"Gala Apple 199999\"), which is an instance of the \"Apple\" class.\n\nNote that notions like `broad` or `narrow` make no sense when mapping instances. We typically try to avoid the SKOS vocabulary for mapping instances, and make use of `owl:sameAs` instead. Note that `owl:sameAs` does have implications for reasoning, but it is also the preferred property when within the \"RDF/SPARQL\" semantic framework.\n\nIf the mapping involves an instance _and_ a class, you have hit a corner case of the SSSOM use case. This case can still be represented, but instance-concept relationships are not widely thought of as \"mappings\".\n\nIn much the same way as concepts and instances, you can also map properties or \"relationships\":\n\n- Property-level: the entities being mapped are both properties, like, for example, rdfs:label, skos:prefLabel, RO:0000050 (part of). \n\nNote that it does not make sense to try to map instances of concepts, or concepts, directly to properties. There are no relationships that would support such a mapping.\n\n<a id=\"uc-typical\"></a>\n\n#### Typical use cases\n\nTypical use cases for mappings include:\n\n1. _Semantic data integration_. This often involves linking data to ontologies or semantic layers in knowledge graphs. Data from one source (such as an EHR) is translated to another (such as OMOP, see above). To analyse the data semantically, the most valuable links are `exact` and `broad` as these allow you to directly query the ontology to retrieve instance data. `close` and `narrow` matches are less useful for such a use case, but maybe be consulted as the \"next best thing\" to an exact mapping. Often, a low level of noise is acceptable.\n2. _Data translation_. Similar to data integration, but we want to map as precisely as possible. Only `exact` matches really matter if we want to make sure that data annotated with one ontology means the exact same thing as data annotated with another. Noise in the mappings is often not acceptable. An example for this is if one source has annotated all its genes using the HUGO Gene Nomenclature Committee (HGNC) while another is using NCBI Gene Database identifiers. `broad`, `narrow` and even `close` matches are mostly meaningless - we need a 1:1 translation table with next to zero noise.\n3. _Ontology and knowledge graph merging_. Here, the key issue is that `exact` matches matches have as little noise as possible. Some merging approaches use probabilistic algorithms to weed out out potentially bad mappings (low levels of noise may be acceptable, see for example [boomer](https://github.com/INCATools/boomer)), but any naive merging approach, which is still prevalent in the knowledge graph world, will usually do the following: (1) Merge all `exact` matches into one \"node\" in the knowledge graph and (2) redirect all data against all these `exact` matches to that newly created node.\n\n<a id=\"tenstep\"></a>\n\n## The 3-step process for selecting an appropriate mapping predicate\n\nThe following 3-step process condenses the sections above into a simple to follow algorithm.\n\nGiven two terms A and B:\n\n1. Target: semantic framework: Does your use case require OWL reasoning over the merged subject and object sources?\n    - If yes, use OWL vocabulary for properties\n    - If no, use RDF/SPARQL/SKOS vocabulary for properties\n1. Are A and B instances, properties or concepts?\n    - If A and B are instances, use only vocabulary suitable for instances\n    - If A and B are concepts, use only vocabulary suitable for concepts\n    - If A and B are properties, use only vocabulary suitable for properties\n    - If either one of A or B is an instance and the other is a concept, use only vocabulary suitable for describing instance-class relationships\n1. Is A roughly the same as B?\n    - If yes, does the difference between \"truly exact\" and your understanding of `A` and `B` constitute \"acceptable noise level\"?\n        - If yes: the mapping is `exact`.\n        - If no: the mapping is `close`.\n    - If no, determine if the precision as described above.\n\nYou can now select the mapping predicate based on the table below:\n\n| Mapping Predicate      | Precision   | Suitable for semantic framework | Suitable entity types? | Acceptable noise |\n|------------------------|-------------|---------------------------------|------------------------|------------------|\n| skos:exactMatch        | exact       | SKOS/RDF(S)/SPARQL/NO           | Concept                | low              |\n| skos:relatedMatch      | related     | SKOS/RDF(S)/SPARQL/NO           | Concept                | low              |\n| skos:broadMatch        | broad       | SKOS/RDF(S)/SPARQL/NO           | Concept                | low              |\n| skos:narrowMatch       | narrow      | SKOS/RDF(S)/SPARQL/NO           | Concept                | low              |\n| skos:closeMatch        | close       | SKOS/RDF(S)/SPARQL/NO           | Concept                | low              |\n| owl:sameAs             | exact       | SKOS/RDF(S)/SPARQL/OWL/NO       | Instance               | low              |\n| owl:equivalentClass    | exact       | OWL                             | Concept                | no               |\n| rdfs:subClassOf        | broad       | RDF(S)/SPARQL/OWL               | Concept                | no               |\n| owl:equivalentProperty | exact       | OWL                             | Property               | no               |\n| rdfs:subPropertyOf     | broad       | OWL                             | Property               | no               |\n| oboInOwl:hasDbXref     | exact       | SKOS/RDF(S)/SPARQL              | Any                    | high             |\n| rdfs:seeAlso           | close       | SKOS/RDF(S)/SPARQL              | Any                    | high             |\n| rdf:type               | exact/broad | RDF(S)/SPARQL/OWL               | Instance-Concept       | no               |\n\nNote that \"acceptable noise\" refers to \"what is acceptable for the target semantic framework\". When using OWL, even a bit of noise can have huge consequences for reasoning, so it is not advisable to use the OWL vocabulary in cases where there is a lot of noise.\n\n<a id=\"faq\"></a>\n\n## Frequently asked questions\n\n1. None of the mapping predicates listed here seem to fit for my use case. Can I define my own?\n\nThe SSSOM specification is currently open to specifying new mapping predicates. However, it is always advisable to open an [issue](https://github.com/mapping-commons/sssom/issues) to discuss such cases with the wider community - there may be some benefit in standardising predicates from the start!\n\n"
  },
  {
    "path": "src/docs/matching-tool-implementation-guide.md",
    "content": "# Matching Tools: Implementation Guide for SSSOM\n\n*Summary**: The goal of this document is to advice matching tool developers how to implement SSSOM-style matching justifications as part of their output. For example, if a mapping was determined (or is supported by) a lexical matching process, we can document that, alongside metadata that further describes the details about that process.\n\nAs of 17.07.2023, this guide is a _work in progress_. If you are a tool developer interested to implement these recommendations, feel free to reach out on https://github.com/mapping-commons/sssom/issues for support and feel empowered to help us improve this guide!\n\n## Basics\n\n1. A (semantic) mapping in the sense of this guide is a tuple `<s, p, o, |j|>` that describes the correspondence of a subject `s` to an object `o` via a mapping predicate `p`. `|j|` is a non-empty set of mapping justifications that provide evidence towards the validity of the correspondence.\n1. As stated above, but re-stated for clarity: **every mapping can be associated with 1 or more justifications**.\n1. Carefully consider if a piece of metadata should be applied on [mapping](https://mapping-commons.github.io/sssom/Mapping/) or [mapping set](https://mapping-commons.github.io/sssom/MappingSet/) level. As a rule of thumb, if a piece of metadata applies to absolutely all mappings in the target set, then consider adding it as metadata to the mapping set, to safe space.\n1. Justifications in the sense of this guide comprise a *category* (documented in the [mapping_justification](https://mapping-commons.github.io/sssom/mapping_justification/) field), which is represented as a specific matching activity such as \"lexical matching\", \"logical matching\", \"manual mapping curation\", etc, a confidence value that represents the amount of confidence the justification contributes to the perceived truthfulness of a mapping, and additional metadata that provide additional provenance.\n1. The basic vocabulary for the justification category is the [Semantic Mapping Vocabulary](https://github.com/mapping-commons/semantic-mapping-vocabulary). Feel free to use the [issue tracker](https://github.com/mapping-commons/semantic-mapping-vocabulary/issues) to request new categories to be added. There is a fast turnaround.\n1. The goal of providing mapping justifications is to enable cross-purpose reuse of mappings, sharing of mappings and [mapping reconciliation](glossary.md). Mapping justifications make individual mapping decisions transparent.\n1. Adding justifications is always valuable, even if **not all detailed metadata is provided**.\n1. Many justifications are combinations of other justifications. For example, we may decide that a match is justified if (a) there is a lexical match and (b) the surrounding graph-structure is isomorphic or (c) the entities involved share the same properties. In this case, we should add individual justifications for each individual justification. The [confidence](https://mapping-commons.github.io/sssom/confidence/) value expresses how **confident the specific justification makes you feel about the truthfulness of the mapping**. If a joint probability is calculated from multiple justifications, add a separate justification for that, e.g. [semapv:CompositeMatching](https://w3id.org/semapv/vocab/CompositeMatching).\n1. In the SSSOM TSV formats, every row corresponds to a justification, not a mapping. So the same mapping with three justifications will result in three rows in the SSSOM TSV file.\n\n## Background\n\nBefore reading on, please skim through the [technical documentation of SSSOM](index.md) to get a sense of what kind of properties exist, and read our primer on [mapping justifications](mapping-justifications.md) first, which explains how to design a number of frequently used mapping justifications.\n\nAs the collection of justifications can impact the performance of he matching process (at least for huge matching tasks), it is advisable that the process can be switched off by the CLI.\n\nFor most matching processes, we first construct a candidate mapping set from a combination of sources, for example:\n\n1. Mappings provided by user as input to the matching process\n1. Lexical exact matching\n1. Lexical fuzzy matching (traditional and word embeddings)\n\nAs a second step, we use often complex combinations of techniques to refine and expand the candidate mapping set:\n\n1. Structural matching (graph-based approaches etc)\n1. Semantic matching\n   1. Logical matching (for example by deconstructing complex terms into composites and then using logical reasoning).\n   1. Similarity based matching, including graph-embedding similarity (machine learning), old-school semantic similarity measures like Resnik or even Jaccard (over some part of the ontology/schema structure)\n\nAs a rule of thumb, the more complex the rules by which a match is determined, the harder it is to provide a useful justification. To put it slightly differently: the more complex a justification, the less useful it is if the goal is to make matching decisions **transparent for human users**. A good example of this are decisions based on embedding (e.g. graph, node) similarity: while it is often useful to understand that a match has been determined by a threshold (e.g. >=0.9) of cosine similarity of a node embedding, it is less important to communicate exactly how the embedding space was constructed.\n\nThis insight guides our implementation in two ways:\n\n1. We start by focusing on the \"easy\" cases with clear mapping justifications (like the lexical ones used to construct the _candidate mapping set_), and incrementally work our way up towards harder ones.\n1. We have a default justification for \"complex\" cases which we have not covered yet. This is necessary not only because it may be hard to construct complex justifications from within a matching tool, but also because SSSOM simply does not have a way to express the justification yet (in this case, request clarification on the [SSSOM issue tracker](https://github.com/mapping-commons/sssom/issues)).\n\n## Basic thoughts about architecture\n\nThe [MELT framework](https://github.com/dwslab/melt) offers a well designed architecture for matchers. While the interested readers is referred to [the MELT documentation](https://dwslab.github.io/melt/) for details, we want to use it here as an example on how a tool implementer, from a higher level perspective, could think about collecting SSSOM metadata as part of the matching process.\n\nConceptually, a matching process (from the perspective of the MELT developers) has four inputs:\n\n1. Source ontology: `O_s`\n2. Target ontology: `O_t`\n3. (potentially empty) input alignment: `Map_in`\n4. Configuration (for the matching tool): `Cong`\n\nand return one output:\n\n1. Output alignment: `Map_out`\n\nNote that any given implementation can take other inputs and produce other outputs, but for the sake of this guide\nwe assume this basic architecture.\n\nConceptually, four elements are important to matching process:\n\n1. The alignment\n1. The individual correspondence part of the alignment\n1. Evidence gathered for towards the truthfullness of the alignment\n1. A matcher that implements the \"matching process\" described above in terms of input/output\n\nIn the MELT reference implementation, for example, there is an [Alignment](https://github.com/dwslab/melt/blob/master/yet-another-alignment-api/src/main/java/de/uni_mannheim/informatik/dws/melt/yet_another_alignment_api/Alignment.java) class. \nDuring the matching process, the alignment is passed through a series of [matchers](https://github.com/dwslab/melt/blob/master/matching-jena/src/main/java/de/uni_mannheim/informatik/dws/melt/matching_jena/MatcherYAAA.java#L16) to be augmented. For example, a [bounded path matcher](https://github.com/dwslab/melt/blob/master/matching-jena-matchers/src/main/java/de/uni_mannheim/informatik/dws/melt/matching_jena_matchers/structurelevel/BoundedPathMatching.java#L41).\nIn essence, the matching process is a series of matchings strung together, passing where the alignment produced by the last process is passed through to the next, then augmented, then passed on (potentially for other processes such as filtering, which we consider matching processes as well).\n\nDuring an individual matching process like [bounded path matcher](https://github.com/dwslab/melt/blob/master/matching-jena-matchers/src/main/java/de/uni_mannheim/informatik/dws/melt/matching_jena_matchers/structurelevel/BoundedPathMatching.java#L41), correspondences are added and removed from the alignment.\n\nThe key for a meaningful SSSOM integration is this: when a new correspondence (mapping) is added to the alignment (or \"mapping set\" in SSSOM speech) you _add a piece of evidence alongside the correspondence_. \nThis is usually done by extending the correspondence data model with a new field: justification, evidence, or similar.\nA piece of evidence includes three major things:\n\n1. A justification. Usually, any `matcher` type will correspond to exactly one [justification in the SEMAPV vocabulary](https://www.ebi.ac.uk/ols4/ontologies/semapv/classes/https%253A%252F%252Fw3id.org%252Fsemapv%252Fvocab%252FMatching?lang=en).\n2. A confidence level. This reflects how much confidence the process has induced in the mapping all by itself.\n3. Any other metadata important for that specific justifications, such as `subject_match_field` for a lexical matching process.\n\nYour matching process should collect this metadata, and, by the end of the process, the whole alignment,\nincluding correspondences and justifications for each correspondence should be exported.\n\n_Important note_: In the final TSV file, every _justification_ will have its own row! So a correspondence (mapping) will appear on multiple rows!\n\n## Step-by-step guide for implementation\n\nThis step by step guide is roughly according to our own thinking of what should be done first, second, and so on.\n\n1. Add an option to your matching tool to output legal SSSOM TSV (recommended format now), for example `--export-sssom` or similar.\n1. OPTIONAL: Add an option to your matching tool to accept legal SSSOM TSV as user input as an alternative to Alignment API (recommended format now).\n1. Always provide basic provenance in the SSSOM output:\n   - [mapping_tool](https://mapping-commons.github.io/sssom/mapping_tool/): The canonical reference to your tool, ideally a persistent identifier.\n   - [mapping_tool_version](https://mapping-commons.github.io/sssom/mapping_tool_version/): The version of the tool used to compute the mapping set.\n   - [mapping_set_id](https://mapping-commons.github.io/sssom/mapping_set_id/): A (often randomly generated) mapping set identifier.\n   - [mapping_date](https://mapping-commons.github.io/sssom/mapping_date/): The date the mapping was generated.\n   - OPTIONAL: if available, add [subject_source](https://mapping-commons.github.io/sssom/subject_source/), [object_source](https://mapping-commons.github.io/sssom/object_source/) and [subject_source_version](https://mapping-commons.github.io/sssom/subject_source_version/), [object_source_version](https://mapping-commons.github.io/sssom/object_source_version/).\n1. Document some basic entity metadata, this can help reading the mapping set:\n   - [subject_label](https://mapping-commons.github.io/sssom/subject_label/), [object_label](https://mapping-commons.github.io/sssom/object_label/): If available, add the label of the subject, and object id.\n1. Add basic justification support\n    1. Track lexical matching-based mapping decisions. A good chunk of candidate mappings will be computed by some form of lexical matching. See [here](mapping-justifications.md#lexical-matching) for details.\n    1. If something more complex than a simple lexical matching has happened, try to find an appropriate one in [SEMAPV](https://mapping-commons.github.io/semantic-mapping-vocabulary/). If none exists, or its too much work to create one, use as a fall-through:\n       - [semapv:CompositeMatching](https://w3id.org/semapv/vocab/CompositeMatching) in the case that the match was established through a combination of approaches, but you don't want to provide justifications for each individual one.\n       - [semapv:UnspecifiedMatching](https://w3id.org/semapv/vocab/UnspecifiedMatching) in the case you dont know why the match happened.\n    1. All justifications should come with a [confidence](https://mapping-commons.github.io/sssom/confidence/) value that expresses how **confident the specific justification makes you feel about the truthfulness of the mapping**.\n1. Track if a mapping was provided (as input) by a user. Ideally, if the input to the matching process is SSSOM, simply adopt all of the mapping justifications provided by the user. If the provided mapping has no metadata, add a suitable [mapping_provider](https://mapping-commons.github.io/sssom/mapping_provider/) value (e.g. `MYTOOL:USER`, to indicate  that the mapping was provided by the user).\n1. Add advanced justification support. Add all metadata explained in [mapping justifications](mapping-justifications.md). Where suitable fields or values are missing from the [SSSOM datamodel](https://mapping-commons.github.io/sssom/) or [SEMAPV](https://mapping-commons.github.io/semantic-mapping-vocabulary/), request them on the [SSSOM](https://github.com/mapping-commons/sssom/issues) or [SEMAPV issue tracker](https://github.com/mapping-commons/semantic-mapping-vocabulary/issues) respectively. There is likely a lot of interesting details to be added, so dont be shy to request/suggest!\n1. If you reject a user provided mapping, it makes sense to include that in a negative mapping set in SSSOM. You could provide [predicate_modifier](https://mapping-commons.github.io/sssom/predicate_modifier/)`= NOT` to ensure the file is not interpreted wrongly.\n1. HIGHLY OPTIONAL: In some few cases, it may be interesting to inform the user that not all mappings are 1:1. In this case, it could be advisable to use the `mapping_cardinality` field.\n1. OPTIONAL: If relevant you can add the [subject_type](https://mapping-commons.github.io/sssom/subject_type/) and [object_type](https://mapping-commons.github.io/sssom/object_type/) fields to your output, if known. This can be interesting in some cases with mixed content (being able to separate `owl:Class` related mappings from those about `owl:ObjectProperty`).\n1. You can always use the [comment](https://mapping-commons.github.io/sssom/comment/) or [other](https://mapping-commons.github.io/sssom/other/)* fields to deposit additional useful metadata that can later be turned into structured content.\n\n## Examples\n\n- [MGI Mouse-Human mappings](https://github.com/mapping-commons/mh_mapping_initiative/blob/master/mappings/mp_hp_mgi_all.sssom.tsv)\n- [SSSOM examples](https://github.com/mapping-commons/sssom/tree/master/examples/embedded)\n"
  },
  {
    "path": "src/docs/presentations.md",
    "content": "# Presentations\n\n## Building Bridges with FAIR Mappings: An RDA Perspective (GA4GH 13th Plenary)\n\n- October 6<sup>th</sup>, 2025, hybrid ([information](https://www.ga4gh.org/event/13th-plenary/))\n- [Lightning talk](https://docs.google.com/document/d/1e3X9dzq84B3sX0eaLEjmLcYYDv_INmGUNZ6kbAh5MM8/edit?tab=t.0#heading=h.somgoowwkvaj) at GA4GH Connect session **The future is FAIR beyond genomics: Building bridges to the Research Data Alliance (RDA) and other FAIR research data initiatives**, representing SSSOM and FAIR Mappings WG.\n- [Slides](https://docs.google.com/presentation/d/18vf5gcHtGKzBpkzQRpHUZZyxjQ9GiYG45CYzhzQSNgE/edit)\n\n## RDA FAIR Mappings WG: Highlights from Case Studies and Initial Taxonomy (RDA’s 24th plenary)\n\n- April 7<sup>th</sup>, 2025, virtual\n- Talk at RDA 24th plenary meeting about the progress of the [RDA FAIR Mappings Working Group](https://www.rd-alliance.org/groups/fair-mappings-wg/activity/), which uses SSSOM as the baseline model.\n- [Slides](https://docs.google.com/presentation/d/1A3Fgo9ExUGgrc0VX85tqG-_6_Vu6b-qtcfvLTmW9mIU/edit)\n\n## A Simple Standard for Ontological Mappings 2024: A quick guide for getting started with publishing better entity mappings (RDA’s 23rd plenary)\n\n- November 13<sup>th</sup>, 2024, hybrid\n- Talk at [RDA plenary](https://www.rd-alliance.org/rdas-23rd-plenary-programme/), in particular [VSSIG WG](https://www.rd-alliance.org/session_entry/group-session-applications-03-07-2024-john-graybeal/) giving a brief update and encouraging SSSOM uptake.\n- [Slides](https://docs.google.com/presentation/d/1TKdXO-THSUf5PHZp2sYrzaTQhtunoB78A6_Yt8VEyoc/edit?usp=sharing)\n\n## A Simple Standard for Ontological Mappings 2024: The case for prioritising 5-Star mappings (Every Cure, internal seminar) \n\n- August 1<sup>st</sup>, 2024, virtual\n- Talk to [Every Cure](https://everycure.org/) technical team (Knowledge Sharing Series) to make the case for prioritising the collection of mapping provenance.\n- [Slides](https://docs.google.com/presentation/d/1_KkSeZcKyzsQVlZe8qkl7iEvii3HX0QKR58uvbirTDM/edit)\n\n## (Re-)bridging the anatomy ontologies with SSSOM\n\n- July 19<sup>th</sup>, 2024\n- [15<sup>th</sup> International Conference on Biomedical Ontologies (ICBO)](https://icbo-conference.github.io/icbo2024/)\n- [Slides](https://github.com/gouttegd/sssomt-uberon/releases/download/v2-icbo-2024/screen.pdf), [paper](https://github.com/gouttegd/sssomt-uberon/releases/download/v2-icbo-2024/paper.pdf), [sources](https://github.com/gouttegd/sssomt-uberon)\n\n## Workshop on Prefixes, CURIEs, and IRIs 2023\n\n- November 27<sup>th</sup>, 2023, virtual\n- Lightning talk on the deeper integration of the Bioregistry and `curies` toolkit with the SSSOM Python package\n- [Workshop info](https://biopragmatics.github.io/workshops/WPCI2023)\n\n## OM2023: A Simple Standard for Sharing Ontological Mappings 2023: Updates on data model, collaborations and tooling\n\n- 7th November 2023\n- [http://om2023.ontologymatching.org/](http://om2023.ontologymatching.org/)\n- [Slides](https://docs.google.com/presentation/d/1d2t-VcseZ_oAgVTbrDHJOmwQTqyXB9ZHDrZ08OU87a0/edit)\n\n## SSSOM Updates 2023 (FAIR Impact and FAIRCORE4EOSC Life Working Session)\n\n- 6th October 2023\n- [Slides](https://docs.google.com/presentation/d/1RY0IKn5TWVqXhcJ5vyabXEPhCPXNLsx9IWiWzQCzXZg/edit)\n\n## OHDSI 2023 Symposium: Synergizing Simple Standard for Sharing Ontology Mappings (SSSOM) and the Observational Health Data Sciences and Informatics (OHDSI)\n\n- 3rd July 2023, https://www.ohdsi-europe.org/index.php/symposium-2023\n- [Seminar info](events/ohdsi2023.md)\n\n## Elixir Data Interoperability Meeting: Introduction to SSSOM \n\n- 6th March 2023\n- This talk is a variant of the CCB Seminar Series talk below\n- [Slides](https://docs.google.com/presentation/d/1w-rNLTprIbW8IUBu6YokDsPe98AKg4VwfR1gSsJrae8/edit#slide=id.g167f28e52df_0_22)\n\n## Ontology Summit 2023: Open, FAIR and standardised mappings for ontologies, controlled vocabularies and database entities\n\n- 22 February 2023, virtual\n- This talk is a variant of the CCB Seminar Series talk below\n- [Seminar info](https://ontologforum.org/index.php/ConferenceCall_2023_02_22)\n- [Video recording (scroll to minute 46)](https://ontologforum.s3.amazonaws.com/OntologySummit2023/Part1/Ubergraph--JimBalhoff_20230222.mp4)\n- [Slides](https://docs.google.com/presentation/d/1_TuimFiJ_7VP0ZFkQrHYky_ktFZc981Vse0-_hZjKtc/edit#slide=id.g167f28e52df_0_22)\n\n## CCB Seminar Series: Open SSSOM - Unlocking the wealth of biomedical data using shared standardized entity mappings\n\n- December 2022 talk, virtual\n- [Seminar info](events/ccb2022.md)\n- [Video recording](https://www.youtube.com/watch?v=4vqeRECuAKE)\n- [Slides](https://docs.google.com/presentation/d/1Gt6kLSTx_e1Al6eCvGp_hviezy5ySo4UA_ii8LGqqIw/edit?usp=drive_web&ouid=105278838581444356576)\n\n## OHDSI Symposium 2022: There are no \"good\" mappings.\n\n- October 2022, hybrid symposium (https://www.ohdsi.org/ohdsi2022-workgroup-activities/)\n- [Seminar info](events/ohdsi2022.md)\n- [Slides](https://docs.google.com/presentation/d/1sGPh1b0keghxF4o7vMOQAlZ6QyBf97ZpaTXjmMY3UP0/edit#slide=id.SLIDES_API69505745_0)\n\n## OM 2022: A Simple Standard for Ontological Mappings 2022 - Updates of data model and outlook \n\n- 23rd October 2022, Workshop for Ontology Matching, ISWC 2022, virtual\n- [Seminar info](events/om2022.md)\n- [Slides](https://docs.google.com/presentation/d/1L0LzXVPcfS9eW1KkN-BIYnxuh_CQ_8fl3QPvqw9BmUs/edit#slide=id.g16d02f01a3b_0_0)\n\n## OBO Academy 2022: Introduction to manual mapping curation\n\n- 17th May 2022, Seminar, Monarch Seminar Series\n- [Video recording](https://www.youtube.com/watch?v=ZZeZcg-Vwjw)\n- [Seminar info](events/oboacademy2022.md)\n- [Slides](https://mapping-commons.github.io/sssom/tutorial/)\n\n## Workshop on Prefixes, CURIEs, and IRIs 2021\n\n- Fall 2021, Use Case Talk on the need for prefix maps for SSSOM\n- [Video](https://youtu.be/iOXZfLAF_X0?t=1100)\n- [Workshop info](https://biopragmatics.github.io/workshops/WPCI2021)\n\n## Pistoia Seminar 2022: A Simple Standard for Sharing Ontological Mappings (SSSOM)\n\n- 28th April 2022, Team Meeting\n- [Seminar info](events/pistoia2022.md)\n- [Slides](https://docs.google.com/presentation/d/1gW-BN4yR1c8qxzL9uLeJm99zRancY3k0tcZlJRPu4Eg/edit#slide=id.g126201cd604_0_0)\n\n## WSBO-2021: Workshop on Synergizing Biomedical Ontologies\n\n- 14th July 2021, Workshop\n- [Workshop info](events/wsbo2021.md)\n- [Slides](https://docs.google.com/presentation/d/1TlROX-JNeWvgrX57-CBa2qxTrRp92VGGZnrhJv3rLPM/edit#slide=id.p) \n\n## MC-2021: 1st Mapping Commons Workshop on Simple Standard for Sharing Ontology Mappings\n\n- [Workshop info](events/mc2021.md)\n- [Video recording](https://www.youtube.com/watch?v=lgVqFeSxYbg)\n- [Slides: Introduction](https://docs.google.com/presentation/d/1T75TRkpKRGHk5FSeFS7mQe8vmo8rt7bE69kgPX6PZMs/edit?usp=sharing)\n- [Slides: OMOP2OBO](https://docs.google.com/presentation/d/1ItWLWnIlJeBgw5r4ZQ6mOVAFVQp-1uQ7vA9EI-1o5HY/edit?usp=sharing).\n"
  },
  {
    "path": "src/docs/record-identifiers.md",
    "content": "# Identifying mapping records\n\nSince version 1.1, the SSSOM specification allows to explicitly assign an\nidentifier to every single mapping record within a given mapping set, through\nthe [record_id](../record-id.md) slot.\n\nThe specification is deliberately non-prescriptive about what record identifiers\nshould look like or how they should be generated. The only constraints on the\n`record_id` slot are that:\n\n- the value must be a URI;\n- the URI must be representable in CURIE form in some serialisations (e.g. in\n  SSSOM/TSV);\n- either all records within a set have an identifier, or none have one;\n- each identifier should be unique within the set that contains it.\n\nBeyond those constraints, it is left to the creators of a SSSOM mapping set to\ndecide whether and how to mint identifiers for their records. This page is\nintended to provide some non-normative guidance.\n\n## Uniqueness scope\n\nWhile the specification only mandates that record identifiers must be unique\n**within a set**, it is probably a good idea to use identifiers that are\n**globally** unique.\n\nAn easy way to do that is to construct the identifiers on top of the\n`mapping_set_id` of the mapping set.\n\nFor example, if you have the following set:\n\n```\n#curie_map:\n#  FOODON: http://purl.obolibrary.org/obo/FOODON_\n#  KF_FOOD: https://kewl-foodie.inc/food/\n#license: https://creativecommons.org/licenses/by/4.0/\n#mapping_set_id: https://w3id.org/sssom/tutorial/example1\nsubject_id\tsubject_label\tpredicate_id\tobject_id\tobject_label\tmapping_justification\nKF_FOOD:F001\tapple\tskos:exactMatch\tFOODON:00002473\tapple (whole)\tsemapv:ManualMappingCuration\nKF_FOOD:F002\tgala\tskos:exactMatch\tFOODON:00003348\tGala apple (whole)\tsemapv:ManualMappingCuration\nKF_FOOD:F003\tpink\tskos:exactMatch\tFOODON:00004187\tPink apple (whole, raw)\tsemapv:ManualMappingCuration\nKF_FOOD:F004\tbraeburn\tskos:broadMatch\tFOODON:00002473\tapple (whole)\tsemapv:ManualMappingCuration\n```\n\nthen you could construct the following identifiers, all derived by appending a\nlocal part to the `mapping_set_id` URI:\n\n- `https://w3id.org/sssom/tutorial/example1#001`\n- `https://w3id.org/sssom/tutorial/example1#002`\n- `https://w3id.org/sssom/tutorial/example1#003`\n- `https://w3id.org/sssom/tutorial/example1#004`\n\nAssuming the `mapping_set_id` URI is globally unique (which it should be), then\nall record identifiers derived from it will necessarily be globally unique as\nwell.\n\nThe resulting set would then look as follows (keep in mind that record\nidentifiers must be in CURIE form in the SSSOM/TSV format):\n\n```\n#curie_map:\n#  FOODON: http://purl.obolibrary.org/obo/FOODON_\n#  KF_FOOD: https://kewl-foodie.inc/food/\n#  example1: https://w3id.org/sssom/tutorial/example1#\n#license: https://creativecommons.org/licenses/by/4.0/\n#mapping_set_id: https://w3id.org/sssom/tutorial/example1\nrecord_id   subject_id\tsubject_label\tpredicate_id\tobject_id\tobject_label\tmapping_justification\nexample1:001    KF_FOOD:F001\tapple\tskos:exactMatch\tFOODON:00002473\tapple (whole)\tsemapv:ManualMappingCuration\nexample1:002    KF_FOOD:F002\tgala\tskos:exactMatch\tFOODON:00003348\tGala apple (whole)\tsemapv:ManualMappingCuration\nexample1:003    KF_FOOD:F003\tpink\tskos:exactMatch\tFOODON:00004187\tPink apple (whole, raw)\tsemapv:ManualMappingCuration\nexample1:004    KF_FOOD:F004\tbraeburn\tskos:broadMatch\tFOODON:00002473\tapple (whole)\tsemapv:ManualMappingCuration\n```\n\n> Again, this is **guidance** only. There is _no obligation_ for record\n> identifiers to be derived from the `mapping_set_id`. It is simply a convenient\n> way to achieve global uniqueness, should it be desired.\n\n## Identifier generation methods\n\nHere are some of the ways by which the local part of identifiers can be\ngenerated.\n\n### Opaque identifiers\n\n#### Serially allocated numbers\n\nThis is the method used in the example above. The local part of the identifier\nis a (typically fixed-width) number that is simply incremented whenever a new\nidentifier is needed.\n\nThis is arguably the simplest method, and one that is especially practical when\ncreating/editing a mapping set using a generic, non-SSSOM-aware spreadsheet\nsoftware. It requires keeping track of the last used number, but that should not\nbe a big hurdle when editing a set in a spreadsheet software.\n\n#### Randomly allocated numbers\n\nThe local part of the identifier can be made of numbers that are randomly picked\nrather than serially allocated. This dispenses of the need to keep track of the\nlast used number.\n\nFor this method to work, the random numbers must be picked (1) within a large\nenough space and (2) using an established and solidly implemented pseudo-random\nnumber generator (PRNG) software. In particular, they should _not_ be\nhand-picked by a human editor (or a LLM). Humans (and the LLMs that try to mimic\nthem) are notoriously bad at producing random numbers.\n\nOf note, this method can easily produce **globally unique** identifiers on its\nown if the space in which the random numbers are picked is large enough.\nTypically, using 128-bit numbers (and assuming a proper PRNG), the probability\nof two random identifiers colliding is sufficiently low that for all purposes\nthe identifiers can be considered globally unique.\n\n### Non-opaque identifiers\n\n#### Manually crafted non-opaque strings\n\nA human editor could mint an identifier that meaningfully represents some “key”\ncharacteristics of the mapping record. For example, the first record in the\nexample mapping set above:\n\n```\nsubject_id\tsubject_label\tpredicate_id\tobject_id\tobject_label\tmapping_justification\nKF_FOOD:F001\tapple\tskos:exactMatch\tFOODON:00002473\tapple (whole)\tsemapv:ManualMappingCuration\n```\n\n(not repeating the mapping set metadata _brevitatis causa_) could get assigned\nan identifier like `example1:F001_exact_FOODON2473` – constructed by some\ninformal derivation of the subject ID (`F001`), the predicate ID (`exact`), and\nthe object ID (`FOODON2473`).\n\nThis might be perceived as useful to a human curator, as the record identifier\nimmediately gives a sense of what the record is about. It must be noted,\nhowever, that embedding any kind of meaning into an identifier is generally a\nbad idea\n([McMurry _et al_., 2017](https://doi.org/10.1371/journal.pbio.2001414)).\n\n#### Content-derived identifiers\n\nAn identifier can be automatically derived from the record by running the record\nthrough some kind of condensation (“hash”) function that returns a value\ncalculated in such a way that the probability that two different records could\nyield the same value can be considered negligible.\n\nThe SSSOM specification defines [such a function](spec-support-hashing.md).\n\nWhile the resulting value may appear meaningless, and not different from a\nrandomly picked number, it represents a non-opaque identifier nonetheless\nbecause the value is still directly dependent on the content of the record.\n\nOf note, the\n[Mapping Sameness Identifier](https://ts4nfdi.github.io/mapping-sameness-identifier/),\na proposed SSSOM-independent standard to compute an unique identifier for a\nmapping, is _not_ suitable as a SSSOM record identifier, because it may not be\nunique for any given record (on the contrary, it is explicitly designed to be\nidentical for all records that have the same subject, the same predicate (incl. possible negation modifier), and\nthe same object, regardless of all other metadata).\n\n##### Content-derived identifiers considered harmful\n\nAs noted at the very beginning of this page, the SSSOM specification is\nnon-prescriptive about how identifiers should be minted. It neither mandates nor\nforbids any particular method, and all of the methods listed above (as well as\nother methods not listed here) _can_ be used in a SSSOM mapping set.\n\nHowever, the author of those lines strongly feels that content-derived\nidentifiers are a particularly bad idea, for the reasons given in this section.\n\n**(A)** Content-derived identifiers make it impossible to write a mapping set\nentirely by hand. The hash of a mapping record cannot be realistically computed\nin someone’s head, whoever is editing the mapping will have to use a dedicated\ntool to produce it. This breaks an important promise of SSSOM, which is that one\ncan always manually craft a SSSOM set with no specialised tooling at all – just\na plain old spreadsheet software.\n\n**(B)** Content-derived identifiers are at risk of becoming “out-of-sync” with\nthe records they supposedly identify. If an editor modifies the record in any\nway but forgets to re-run the ID-generating procedure, then they’ll end up with\nidentifiers that are no longer really derived from the content of the record.\n\n**(C)** Content-derived identifiers deprive the set’s creators of the freedom to\ndecide the difference between “updating an existing record” and “creating a new\nrecord”, because in fact there is no such thing as “updating a record” when\nusing content-derived identifiers – any change to a record would cause the\nidentifier to change, in effect always creating a _new_ independent record.\n\n**(D)** As a direct consequence of **C**, content-derived identifiers are not\n_stable_, because again any change to the record (even a semantically\nmeaningless change like fixing a typo) would cause the identifier to change.\nThis is turn means, for example, that consumers of records with content-derived\nidentifiers cannot _reliably_ refer to them, because the identifiers may change\nat any time for even the slightest change made to the records.\n\n**(E)** The instability of content-derived identifiers is even worse in the\nspecific case of SSSOM, because the content of a SSSOM record could change\nbecause of something that is out of the control of the record’s creator.\n\nConsider the following record:\n\n```\nsubject_id  subject_label   predicate_id    object_id   object_label\nFBbt:00000015   thorax  semapv:crossSpeciesExactMatch   UBERON:6000015  insect thorax\n```\n\nand now let’s imagine that Uberon curators decide to rename UBERON:6000015 from\n“insect thorax” to “thorax sensu Insecta” (because they decided they prefer this\nway of mentioning the species within the label). The next time the mapping is\nupdated to ensure it is using the latest labels, the record thus becomes:\n\n```\nsubject_id  subject_label   predicate_id    object_id   object_label\nFBbt:00000015   thorax  semapv:crossSpeciesExactMatch   UBERON:6000015  thorax sensu Insecta\n```\n\nIn this scenario, the _meaning_ of the record has not changed at all.\nUBERON:6000015 still represents the same concept as before, so this record still\nrepresents the very same mapping between the very same entities. And yet,\nbecause the _label_ of UBERON:6000015 has changed (something that the creator of\nthe set has no control upon), if records were identified using content-derived\nidentifiers we would have to consider the second record as a _different entity_,\nidentified with a different identifier, than the first.\n\nOverall, content-derived identifiers can only be viable if some very specific\nconditions are met:\n\n- the data store (be it a database, a file, or whatever) where records are\n  stored must be **append-only**; that is, it must not be possible to delete or\n  modify existing records, you can only _add_ new records;\n- whenever a new record is created by deriving from an existing record, there\n  must be a way to get to the original record from the new record.\n\n_If_ you use SSSOM that way, then _maybe_ content-derived identifiers can be\nfine for your use case. Otherwise, you should stick to meaningless, opaque\nidentifiers that are not tied to the content of the record.\n"
  },
  {
    "path": "src/docs/related-documentation.md",
    "content": "## Related documentation\n\n- [SSSOM Toolkit](https://mapping-commons.github.io/sssom-py/index.html#): A toolkit and library for processing SSSOM files in Python\n- [SSSOM Java](https://incenp.org/dvlpt/sssom-java/): A toolkit and library for processing SSSOM files in Java\n- [SSSOM Curator](https://github.com/cthoyt/sssom-curator/): A framework for curating SSSOM mapping sets\n- [Semantic Mapping Vocabulary (SEMAPV)](https://mapping-commons.github.io/semantic-mapping-vocabulary/): The mapping vocabulary used for mapping justifications and specialised mapping predicates\n- [LinkML](https://linkml.io/linkml/): The modelling framework used by SSSOM\n- [OBO Academy](https://oboacademy.github.io/obook/): Ontology and mapping related training materials\n- [Monarch Initiative](https://monarch-initiative.github.io/monarch-documentation/): Knowledge Graph related products supported by the Monarch Initiatives, including many tools using and producing SSSOM\n"
  },
  {
    "path": "src/docs/spec-formats-json.md",
    "content": "# The JSON serialisation format\n\nThe JSON serialisation format is currently unspecified.\n\nIt is intended as a more-or-less direct serialisation of the `MappingSet` class into the JSON format as specified by [RFC 8259](https://datatracker.ietf.org/doc/html/rfc8259), but many details of the serialisation are left unspecified for now.\n"
  },
  {
    "path": "src/docs/spec-formats-owl.md",
    "content": "# The OWL/RDF serialisation format\n\nThis section defines a way to serialise SSSOM mappings as _reified OWL axioms_. This has the advantage that any mapping set can be simply merged with an ontology in the usual way, for example using [ROBOT merge](https://robot.obolibrary.org/merge).\n\nThe OWL/RDF serialisation rules deal with three types of reified OWL axioms, and a few sub-types:\n\n1. Predicate is an annotation property\n2. Predicate is an object property and\n   1. Object/Subject are classes\n   2. Object/Subject are individuals\n3. Predicate is language relational construct of RDFS or OWL (`rdfs:subClassOf`, `owl:equivalentClass`)\n\n## Predicate is an annotation property:\n\nIf the predicate corresponds to an annotation property, the mapping `<S,P,O, meta>` gets converted to an OWLAnnotationAssertion axiom: `OWLAnnotationAssertion(P,S,O)`. All mapping level metadata (`meta`) gets converted into OWLAnnotation objects which are materialised as axiom annotations on the mapping annotation assertion, see [OWL 2 Structural Specification](https://www.w3.org/TR/owl2-syntax/#Annotations):\n\n```\nAnnotationAssertion(meta P, S, O)\n```\n\nWhere `meta` is a sequence of OWL Annotations objects like:\n\n```\nAnnotation(Q1,V1) Annotation(Q2,V2) ... Annotation(Qn,Vn)\n```\n\nwhere `Qi` is a SSSOM metadata slot and `Vi` is an annotation value.\n\nNote that if a SSSOM metadata element value is a list `L` (i.e. can have multiple elements, such as creator and others), individual annotations are created for each of them:\n\n```\nAnnotation(Q,V) for all V in L.\n```\n\nExample:\n\n```\nAnnotationAssertion(Annotation(sssom:creator_id <https://orcid.org/0000-0002-7356-1779>) Annotation(sssom:mapping_justification semapv:LexicalMatching) skos:exactMatch <http://purl.obolibrary.org/obo/HP_0009894> <http://purl.obolibrary.org/obo/MP_0000019>)\n```\n\nMapping set level annotations are manifested as Ontology annotation in the usual way, according to the [OWL 2 Structural Specification](https://www.w3.org/TR/owl2-syntax/#Annotations).\n\n## Predicate is an object property\n\n### Case 1: Object and Subject are classes.\n\nThe mapping `<S,P,O>` gets translated into an existential restriction:\n\n```\nSubclassOf(S, P some O)\n```\n\nAll metadata slots are added as OWLAnnotation objects and added to SubclassOf axiom as axiom annotations:\n\n```\nSubclassOf(meta, S, P some O)\n```\n\nExample:\n\n```\nSubClassOf(Annotation(sssom:creator_id <https://orcid.org/0000-0002-7356-1779>) Annotation(sssom:mapping_justification semapv:LexicalMatching) <http://example.org/AA> ObjectSomeValuesFrom(<http://example.org/x> <http://example.org/BB>))\n```\n\n### Case 2: Object and Subject are individuals\n\nThe mapping `<S,P,O>` gets translated into an object property assertion:\n\n```\nObjectPropertyAssertion(P, S, O)\n```\n\nAll metadata slots are added as OWLAnnotation objects and added to ObjectPropertyAssertion axiom as axiom annotations:\n\n```\nObjectPropertyAssertion(meta, P, S, O)\n```\n\nExample:\n\n```\nObjectPropertyAssertion(Annotation(sssom:creator_id <https://orcid.org/0000-0002-7356-1779>) Annotation(sssom:mapping_justification semapv:LexicalMatching) <http://www.example.org/x> <http://www.example.org/a> <http://www.example.org/b>)\n```\n\n\n### Predicate is language relational construct of RDFS or OWL\n\nThe mapping `<S,P,O, meta>` gets translated into an annotated axiom using the following table:\n\n| Mapping predicate   | Generated axiom             |\n| ------------------- | --------------------------- |\n| owl:equivalentClass | EquivalentClass(meta, S, O) |\n| rdfs:subClassOf     | SubClassOf(meta, S, O)      |\n\nExample:\n\n```\nSubClassOf(Annotation(sssom:creator_id <https://orcid.org/0000-0002-7356-1779>) Annotation(sssom:mapping_justification semapv:LexicalMatching) <http://www.example.org/a> <http://www.example.org/b>)\n```\n"
  },
  {
    "path": "src/docs/spec-formats-rdf.md",
    "content": "# The SSSOM/RDF serialisation format\n\nThis section defines how to represent a SSSOM mapping set as a\n[RDF model](https://www.w3.org/TR/rdf11-concepts/).\n\n## RDF formats\n\nThe RDF model that represents a SSSOM mapping set is independent of the concrete\nformat that may be used to serialise the model.\n\nIt is RECOMMENDED that implementations support reading and writing a SSSOM set\nfrom and to the [RDF Turtle](https://www.w3.org/TR/turtle/) format at least.\nThey MAY support any other RDF concrete format (e.g. RDF/XML, TriG, N-Triples,\netc.).\n\nThis specification does not mandate how a concrete RDF syntax is to be used. For\nexample, if the RDF syntax allows named resources and predicates to be\nserialised as either IRIs or CURIEs, it is left to the discretion of the\nimplementations (or their users) to decide which form to use.\n\n<a id=\"sssom-slots\"></a>\n\n## Representation of slots\n\nA metadata slot on any given SSSOM object (such as a `Mapping` or a\n`MappingSet`) MUST be represented as a RDF triple where:\n\n- the subject is the resource representing the SSSOM object;\n- the predicate is either:\n    - the property indicated by the `URI` field in the LinkML description of\n      the slot, if such a field is present;\n    - or a property constructed by concatenating the `https://w3id.org/sssom/`\n      namespace and the name of the slot;\n- the object is the value of the slot.\n\n### Representation of slot values\n\nThe following rules determine how the value of a slot is represented as the\nobject of a RDF triple.\n\n#### For slots typed as `sssom:EntityReference`\n\n(e.g. `subject_id`, `mapping_justification`, `subject_source`…)\n\nThe value MUST be represented as a named RDF resource (IRI).\n\n#### For slots typed as `sssom:NonRelativeURI`\n\n(e.g. `license`, `mapping_provider`, `issue_tracker`…)\n\nThe value MUST be represented as a named RDF resource (IRI).\n\n#### For slots typed as `linkml:date`\n\n(e.g. `mapping_date`, `publication_date`)\n\nThe value MUST be represented as a `xsd:date` literal.\n\n#### For slots typed as `linkml:double`\n\n(e.g. `mapping_set_confidence`, `confidence`, `similarity_score`)\n\nThe value MUST be represented as a `xsd:double` literal.\n\n#### For slots typed as an enumeration\n\n(e.g. `sssom_version`, `mapping_cardinality`, `subject_type`…)\n\nIf the permissible values for the enumeration are defined in the LinkML model as\nhaving an associated `meaning` property, then the value MUST be represented as a\nnamed RDF resource with the indicated property. Otherwise, the value MUST be\nrepresented as a `xsd:string` literal.\n\n> Examples:\n>\n> A `subject_type` slot with the value `owl class` is represented by:\n>\n> ```ttl\n> ?object sssom:subject_type <http://www.w3.org/2002/07/owl#Class> .\n> ```\n>\n> while a `mapping_cardinality` slot with the value `1:1` is represented by:\n>\n> ```ttl\n> ?object sssom:mapping_cardinality \"1:1\"^^xsd:string .\n> ```\n>\n> because the `owl class` value of the `EntityTypeEnum` enumeration has a\n> `meaning` property of `http://www.w3.org/2002/07/owl#Class`, while the `1:1`\n> value of the `MappingCardinalityEnum` enumeration has no `meaning` property.\n\n#### For slots typed as a SSSOM object\n\n(e.g. `mappings`, `extension_definitions`)\n\nThe value MUST be represented as a RDF resource. Whether the resource is named\n(IRI) or not (blank node) will depend on the type of the object, see the\n[section on representing SSSOM objects](#sssom-objects) below for details.\n\n### Representation of multi-valued slots\n\n(e.g. `creator_id`, `see_also`, `object_match_field`…)\n\nAs an exception to the general principle that slots are represented by a single\nRDF triple, multi-valued slots MUST be represented by as many triples as there\nare values, each value being the object of one triple.\n\n> Non-normative notes:\n>\n> 1. This means, in particular, that RDF complex structures intended to\n>    represent collections of values, such as `rdfs:Container` or `rdfs:List`,\n>    MUST NOT be used to represent multi-valued SSSOM slots.\n> 2. This also implies that values in multi-valued slots are _not_ ordered.\n\nThe other rules above apply to determine how each single value is to be\nrepresented.\n\n> Example:\n>\n> A `creator_id` slot with the values `https://example.org/people/0001` and\n> `https://example.org/people/0002` is represented by the following two triples:\n>\n> ```ttl\n> ?object dcterms:creator <https://example.org/people/0001> .\n> ?object dcterms:creator <https://example.org/people/0002> .\n> ```\n\n<a id=\"extension-slots\"></a>\n\n### Representation of extension slots\n\nAn [extension slot](spec-model.md#non-standard-slots) MUST be represented in a\nsimilar way to a standard slot, with the following specific rules.\n\nThe predicate is the property associated to the extension slot, as indicated by\nthe `property` slot in the set’s [definition](ExtensionDefinition.md) of the\nextension.\n\nThe value of the extension MUST be represented:\n\n- as a named RDF resource, if the `type_hint` of the extension definition is\n  `linkml:uriOrCurie`;\n- otherwise, as a literal of the type indicated by the `type_hint`.\n\n<a id=\"sssom-objects\"></a>\n\n## Representation of SSSOM objects\n\n### Representation of a `Mapping` object\n\nThe RDF type of a `Mapping` object is `owl:Axiom`.\n\nIf the `Mapping` object has a `record_id` slot, then the value of that slot MUST\nbe used as the named RDF resource that represents the object (and consequently,\nthat slot MUST NOT be represented using the [general rules](#sssom-slots) for\nthe representation of slots as defined above). Otherwise, the `Mapping` object\nis represented as a blank node.\n\n### Representation of a `MappingSet` object\n\nThe RDF type of a `MappingSet` object is `sssom:MappingSet`.\n\nA `MappingSet` object MUST be represented by a named RDF resource corresponding\nto the value of the `mapping_set_id` slot (which consequently MUST NOT be\nrepresented using the [general rules](#sssom-slots) for the representation slots\nas defined above).\n\nThe `curie_map` slot MUST NOT be represented using the\n[general rules](#sssom-slots). Instead, if it is needed it MUST be represented\nusing whatever mechanism is provided by the concrete RDF serialisation format\n(e.g. `@prefix` declarations in [RDF Turtle](https://www.w3.org/TR/turtle/) or\n[RDF TriG](https://www.w3.org/TR/trig/), or `xmlns` namespace declarations in\n[RDF/XML](https://www.w3.org/TR/rdf-syntax-grammar/)).\n\n> Non-normative notes\n>\n> 1. The CURIE map may not be needed at all if all named resources and\n>    predicates are always serialised as full-length IRIs.\n> 2. If at least some named resources or predicates are serialised as CURIEs,\n>    the RDF requirement that all used prefix names must be declared (using the\n>    appropriate mechanism for the chosen concrete syntax) takes precedence over\n>    the possibility of omitting the declarations of prefix names that are\n>    considered [built-in](spec-intro.md#iri-prefixes) in the context of SSSOM.\n\n### Representation of an `ExtensionDefinition` object\n\nThe RDF type of an `ExtensionDefinition` object is `sssom:ExtensionDefinition`.\n\nAn `ExtensionDefinition` object has no identifier of any kind and is always\nrepresented by a blank node.\n\n## Special considerations for serialising to RDF\n\nWhen serialising a mapping set to SSSOM/RDF, implementations should consider how\nthe resulting RDF file is intended to be used. In particular, they should ponder\nwhether it is expected that the RDF serialisation can at any time be converted\nback to any other SSSOM format (e.g. SSSOM/TSV), or if it is only intended to be\nused by “generic”, non-SSSOM-aware RDF applications.\n\nDepending on that intended usage (if it is known), implementations may adopt\nslightly different behaviours as described in the following subsections.\n\n### Serialisations of identifiers\n\nIf the serialisation is intended to be convertible back to another SSSOM format\n(especially the SSSOM/TSV format), implementations MUST declare all the prefixes\nfound in the CURIE map and SHOULD serialise all identifiers as CURIEs using said\ndeclared prefixes.\n\n> Non-normative explanation\n>\n> This is because, if all identifiers are serialised as full-length IRIs, then\n> even if the RDF file includes prefix declarations, they may be stripped away\n> by a RDF reader, since they are not needed. And without those prefix\n> declarations, it would not be possible to serialise the set back as a\n> SSSOM/TSV file (remember that the SSSOM/TSV format _requires_ that identifiers\n> be serialised as CURIEs).\n\nConversely, if the ability to convert the RDF file back to another SSSOM format\nis not required, implementations can freely decide whether to serialise\nidentifiers as IRIs or CURIEs (assuming the concrete RDF syntax allows that of\ncourse).\n\n### Extension definitions\n\nExtension definitions MAY be omitted if the RDF file is only intended to be used\nby RDF applications.\n\nConversely, they SHOULD be included if the set is intended to be convertible\nback to another SSSOM format.\n\n> Non-normative explanation\n>\n> The whole point of an extension definition in SSSOM is to provide (1) a\n> property that confers some meaning to the extension, and (2) the type of the\n> expected values. In RDF, as described [above](#extension-slots), those two\n> bits of information are already contained in the triple that represents the\n> extension slot, so there is no need for an additional definition.\n>\n> But the extension definition also provides the `slot_name` which is used to\n> represent the extension slot in other formats (especially SSSOM/TSV), so if\n> conversion back to other SSSOM formats is required, ensuring that the\n> extension definitions are present in the RDF serialisation is helpful.\n\n### Propagation and condensation\n\nPropagatable slots can be represented in RDF indifferently in their propagated\nor condensed form, following the\n[normal rules](spec-model.md##propagation-of-mapping-set-slots) for propagation\nand condensation.\n\nBut if the RDF file is intended to be used by generic, non-SSSOM-aware RDF\napplications, then implementations SHOULD serialise propagatable slots in their\npropagated form.\n\n> Non-normative explanation\n>\n> Propagation is a SSSOM-specific concept. If a RDF application is provided with\n> a RDF file representing a set with condensed slots, the application will not\n> know to propagate the condensed slots at the set level down to the level of\n> the individual mappings, which will result in the application having an\n> incomplete view of the mappings.\n\n### Representation of mappings as “direct triples”\n\nFor every single mapping record in a set, implementations MAY _additionally_\ninject a single triple of the form:\n\n```ttl\n?subject_id ?predicate_id ?object_id .\n```\n\nIf so, that behaviour MUST be optional.\n\nWhen that behaviour is enabled, implementations SHOULD NOT inject such triples\nin the following cases:\n\n- when the record represents a literal mapping (that is, `subject_type` or\n  `object_type` – or both – is set to `rdfs literal`);\n- when the record represents a negated mapping (that is, `predicate_modifier` is\n  set to `Not`);\n- when the record represents an absence of match (that is, `subject_id` or\n  `object_id` – or both – is set to `sssom:NoTermFound`).\n\nIn any case, a SSSOM/RDF reader MUST NOT expect the presence of such triples,\nand if they are present MUST NOT use them to construct mapping records.\n\n> Non-normative explanations\n>\n> Such “direct triples” are merely a convenience for downstream RDF\n> applications, allowing them to find a direct link (as a single triple) between\n> the subject and the object of a mapping, without having to construct such a\n> link by following the `owl:annotatedSource`, `owl:annotatedProperty`, and\n> `owl:annotatedTarget` triples.\n>\n> It is recommended not to inject such direct triples for literal mapping\n> records, even if they do have a `subject_id` and an `object_id`, because by\n> definition the subject and/or the object of such records is not an\n> identifiable semantic entity and has no business being represented in a RDF\n> graph.\n>\n> It is recommended not to inject such direct triples for negated mapping\n> records because they would seem to convey a meaning that is the exact opposite\n> of what the records mean.\n>\n> It is recommended not to inject such direct triples for no-match mapping\n> records since they do not represent a real mapping.\n\n## Compatibility with pre-standard RDF representations\n\nThe present specification of the SSSOM/RDF format differs slightly from what\nseveral implementations of SSSOM have been producing before the format was\nformally specified.\n\nIn the name of backward compatibility, implementations MAY support the\nalternative rules described in the following subsections when deserialising from\nRDF.\n\nImplementations MUST NOT follow these rules when serialising to RDF.\n\n### Representation of slots typed as `sssom:NonRelativeURI`\n\nImplementations MAY accept a value represented as a `xsd:anyURI` literal.\n\nFor example, implementations MAY accept\n\n```ttl\n?mapping sssom:mapping_provider \"https://www.ohdsi.org/\"^^xsd:anyURI .\n```\n\nas an alternative to\n\n```ttl\n?mapping sssom:mapping_provider <https://www.ohdsi.org/> .\n```\n\n### Representation of slots typed as an enumeration\n\nImplementations MAY accept a value represented as a string literal, even if the\nvalue is defined in the LinkML model as having an associated `meaning` property.\n\nFor example, implementations MAY accept\n\n```ttl\n?mapping sssom:predicate_modifier \"Not\"^^xsd:string .\n```\n\nas an alternative to\n\n```ttl\n?mapping sssom:predicate_modifier sssom:NegatedPredicate .\n```\n\n### Representation of a `MappingSet` object\n\nImplementations MAY accept a `MappingSet` object represented as a blank node,\nwith the `mapping_set_id` slot being represented as any other slot.\n\nFor example, instead of\n\n```ttl\n<https://example.org/myset> a sssom:MappingSet .\n```\n\nimplementations MAY accept\n\n```ttl\n[] a sssom:MappingSet ;\n   sssom:mapping_set_id <https://example.org/myset> .\n```\n\nor even (by also applying the alternative rule regarding the representation of\nslots typed as `sssom:NonRelativeURI`)\n\n```ttl\n[] a sssom:MappingSet ;\n   sssom:mapping_set_id \"https://example.org/myset\"^^xsd:anyURI .\n```\n\n## Examples\n\n> This section is non-normative.\n\nConsidering the following set in the SSSOM/TSV format:\n\n```\n#curie_map:\n#  EXT: https://example.org/properties/\n#  FOODON: http://purl.obolibrary.org/obo/FOODON_\n#  KF_FOOD: https://kewl-foodie.inc/food/\n#  ORCID: https://orcid.org/\n#mapping_set_id: https://example.org/sample-set\n#mapping_set_description: Manually curated alignment of KEWL FOODIE INC internal food and nutrition database with Food Ontology (FOODON). Intended to be used for ontological analysis and grouping of KEWL FOODIE INC related data.\n#license: https://creativecommons.org/licenses/by/4.0/\n#mapping_date: 2025-07-14\n#extension_definitions:\n#  - slot_name: ext_fooable\n#    property: EXT:isFooable\n#    type_hint: xsd:boolean\nsubject_id\tsubject_label\tpredicate_id\tobject_id\tobject_label\tmapping_justification\tauthor_id\tconfidence\text_fooable\nKF_FOOD:F001\tapple\tskos:exactMatch\tFOODON:00002473\tapple (whole)\tsemapv:ManualMappingCuration\tORCID:0000-0002-7356-1779\t0.95\ttrue\nKF_FOOD:F002\tgala\tskos:exactMatch\tFOODON:00003348\tGala apple (whole)\tsemapv:ManualMappingCuration\tORCID:0000-0002-7356-1779\t1\tfalse\n```\n\nA valid serialisation of that set in RDF/Turtle would be:\n\n```ttl\n@prefix EXT: <https://example.org/properties/> .\n@prefix FOODON: <http://purl.obolibrary.org/obo/FOODON_> .\n@prefix KF_FOOD: <https://kewl-foodie.inc/food/> .\n@prefix ORCID: <https://orcid.org/> .\n@prefix dcterms: <http://purl.org/dc/terms/> .\n@prefix owl: <http://www.w3.org/2002/07/owl#> .\n@prefix pav: <http://purl.org/pav/> .\n@prefix semapv: <https://w3id.org/semapv/vocab/> .\n@prefix skos: <http://www.w3.org/2004/02/skos/core#> .\n@prefix sssom: <https://w3id.org/sssom/> .\n@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .\n\n<https://example.org/sample-set> a sssom:MappingSet;\n  dcterms:description \"Manually curated alignment of KEWL FOODIE INC internal food and nutrition database with Food Ontology (FOODON). Intended to be used for ontological analysis and grouping of KEWL FOODIE INC related data.\";\n  dcterms:license <https://creativecommons.org/licenses/by/4.0/>;\n  sssom:extension_definitions [\n      sssom:property EXT:isFooable;\n      sssom:slot_name \"ext_fooable\";\n      sssom:type_hint xsd:boolean\n    ];\n  sssom:mappings [ a owl:Axiom;\n      pav:authoredBy ORCID:0000-0002-7356-1779;\n      dcterms:created \"2025-07-14\"^^xsd:date;\n      owl:annotatedProperty skos:exactMatch;\n      owl:annotatedSource KF_FOOD:F001;\n      owl:annotatedTarget FOODON:00002473;\n      EXT:isFooable true;\n      sssom:confidence 9.5E-1;\n      sssom:mapping_justification semapv:ManualMappingCuration;\n      sssom:object_label \"apple (whole)\";\n      sssom:subject_label \"apple\"\n    ], [ a owl:Axiom;\n      pav:authoredBy ORCID:0000-0002-7356-1779;\n      dcterms:created \"2025-07-14\"^^xsd:date;\n      owl:annotatedProperty skos:exactMatch;\n      owl:annotatedSource KF_FOOD:F002;\n      owl:annotatedTarget FOODON:00003348;\n      EXT:isFooable false;\n      sssom:confidence 1.0E0;\n      sssom:mapping_justification semapv:ManualMappingCuration;\n      sssom:object_label \"Gala apple (whole)\";\n      sssom:subject_label \"gala\"\n    ] .\n```\n\nNote that the two `Mapping` objects are represented as blank nodes, since the\noriginal set does not contain any `record_id` slot.\n\nNote also that (1) identifiers are serialised as CURIEs whenever possible, and\n(2) the definition for the `EXT:isFooable` extension is included. This means\nthat the set can be fully converted back to SSSOM/TSV without any loss of\ninformation.\n"
  },
  {
    "path": "src/docs/spec-formats-tsv.md",
    "content": "# The SSSOM/TSV serialisation format\n\nThe SSSOM/TSV format is intended as the main format for exchanging SSSOM mapping set objects.\n\nThe RECOMMENDED filename extension for a SSSOM/TSV file is `.sssom.tsv`, but SSSOM/TSV parsers MUST accept SSSOM/TSV files regardless of their extension.\n\n\n## Structure\n\nA SSSOM/TSV file contains one, and only one, mapping set object. It is made of two different parts:\n\n* the _metadata block_, which contains essentially all the slots of the [`MappingSet` class](MappingSet.md) except the `mappings` slot;\n* the _mappings block_ (also called the _TSV section_), which contains the individual mappings.\n\nA SSSOM/TSV file MUST NOT contain anything other than those two blocks.\n\n\n### Metadata block\n\nThe metadata block is written as the [YAML 1.2](https://yaml.org/spec/1.2.2/) serialisation of the `MappingSet` object, except that the `mappings` slot is _not_ included (since it contains the mappings, that are serialised in the mappings block instead).\n\nThe metadata block MUST appear at the beginning of the file. Every line of the block MUST be preceded by a `#` character; the `#` character MAY be followed by one or several space characters (U+0020) before the YAML content – if so, every line MUST have the same number of space characters.\n\nThe metadata block ends with the first line that does not begin with a `#` character, which marks the beginning of the mappings block.\n\nThe metadata block SHOULD only contain the slots that do have a value. SSSOM/TSV writers SHOULD skip slots with no value when serialising the mapping set object.\n\n#### Multi-valued slots with a single value\n\nAs an exception to the standard YAML rules regarding the serialisation of sequences, a multi-valued slot that happens to contain a single value MAY be serialised as a scalar value rather than as sequence containing only one item.\n\nFor example, a `creator_id` slot with the single value `ORCID:1111-2222-3333-4444` MAY be serialised as\n\n```yaml\ncreator_id: \"ORCID:1111-2222-3333-4444\"\n```\n\nThis is, strictly speaking, invalid according the YAML specification; the correct serialisation would be either\n\n```yaml\ncreator_id: [ \"ORCID:1111-2222-3333-4444\" ]\n```\n\nor\n\n```yaml\ncreator_id:\n  - \"ORCID:1111-2222-3333-4444\"\n```\n\nbut the scalar form is frequently found in existing SSSOM/TSV files, so SSSOM/TSV parsers SHOULD accept it. SSSOM/TSV writers SHOULD favour one of the correct YAML serialisations, however.\n\n#### Forbidden YAML features\n\nThe following features of the YAML 1.2 specification MUST NOT be used within the metadata block:\n\n* YAML directives ([YAML 1.2 §6.8.1](https://yaml.org/spec/1.2.2/#681-yaml-directives));\n* TAG directives ([YAML 1.2 §6.8.2](https://yaml.org/spec/1.2.2/#682-tag-directives));\n* Node tags ([YAML 1.2 §6.9.1](https://yaml.org/spec/1.2.2/#691-node-tags));\n* Node anchors ([YAML 1.2 §6.9.2](https://yaml.org/spec/1.2.2/#692-node-anchors));\n* Alias nodes ([YAML 1.2 §7.1](https://yaml.org/spec/1.2.2/#71-alias-nodes)).\n\nSSSOM/TSV writers MUST NOT generate any of those when writing the metadata block. The expected behaviour of SSSOM/TSV parsers upon encountering them is unspecified.\n\n\n### Mappings block\n\nThe mappings block contains the mappings, serialised as a matrix where each line represents an individual mapping and each column (separated by tab characters, U+0009) represents one of the slots of the [`Mapping` class](Mapping.md).\n\nThe mappings block MUST follow immediately the metadata block within a SSSOM/TSV file. It starts with a header line containing the column names, which are the names of the slots in the `Mapping` class.\n\nThere SHOULD be no empty columns. If none of the mappings in a set has a value for a given slot, that slot SHOULD be skipped when writing the header line and the individual mappings.\n\n#### Quoting\n\nWithin the mappings block, the following quoting rules, adapted from [RFC 4180](https://datatracker.ietf.org/doc/html/rfc4180), apply:\n\n1. Any value MAY be enclosed in double quotes (`\"`).\n2. Values containing line breaks, double quotes, or tabs (U+0009) MUST be enclosed in double quotes.\n3. When a value is enclosed in double quotes, a double quote appearing within the value MUST be escaped by preceding it with another double quote.\n\nSSSOM/TSV parsers MUST strip any enclosing double quotes and escaping double quotes before passing the parsed objects to the application code.\n\n#### Multi-valued slots\n\nMulti-valued slots MUST be serialised as a list of values separated by `|` characters.\n\nIf a value within a multi-valued slot contains a `|` (“pipe”) character, that MUST be escaped by prepending a `\\` (“backslash”) character in front of it. Likewise, if a value contains a `\\` character, it MUST be escaped by prepending another `\\` character in front of it.\n\nConversely, SSSOM/TSV parsers MUST interpret a `\\|` sequence as a `|` character that is part of the current value, not as a value separator. Likewise, a `\\\\` sequence MUST be interpreted as a single `\\` character. Any other occurrence of a `\\` character (i.e. an occurrence that is not followed by a `|` character or another `\\` character) MUST be interpreted as a normal `\\` character. Both `\\|` and `\\\\` sequences MUST be interpreted in the order in which they appear in the value (for example, a `\\\\|` MUST be read as an escaped `\\` character followed by a non-escaped `|` character).\n\nThe quoting rules described in the previous section apply to the entire `|`-separated list of values.\n\n## External metadata mode\n\nThe metadata block MAY be stored in a separate file from the TSV section, instead of preceding it in the same file as described above. This is called the _external metadata mode_ (by contrast, when the two blocks are in the same file, this is called the _embedded metadata mode_).\n\nIn external mode, the metadata block follows the same rules as described in the [Metadata block](#metadata-block) section above, except that lines MUST NOT start with a `#` character.\n\nIt is RECOMMENDED that the file containing the metadata block has the same basename as the file containing the TSV section, with a `.sssom.yml` extension.\n\nWhen an external metadata file is used, the file containing the TSV section MUST NOT contain anything else than the TSV section. That is, the first line of that file MUST be the header line containing the column names.\n\nImplementations SHOULD support reading SSSOM/TSV files in external metadata mode; they MAY support writing SSSOM/TSV files in that mode.\n\n\n## Encoding\n\nSSSOM/TSV files MUST be encoded in UTF-8 ([RFC 3629](https://datatracker.ietf.org/doc/html/rfc3629#section-13)). They MUST NOT start with a byte order mark (U+FEFF). This applies to external metadata files as well, when the [external metadata mode](#external-metadata-mode) is used.\n\n\n## Identifiers\n\nAll identifiers in a SSSOM/TSV file, that is, all the values of slots typed as [EntityReference](EntityReference.md), MUST be serialised in [CURIE syntax](https://www.w3.org/TR/curie/). SSSOM/TSV parsers SHOULD reject files containing identifiers serialised as IRIs.\n\nAs stated in the description of the model ([Identifiers section](spec-model.md#identifiers)), all prefix names used in CURIEs MUST be declared in the `curie_map` slot of the mapping set object, unless the prefix is a “built-in” prefix (in which case it MAY be omitted). SSSOM/TSV parsers MUST reject a file with undeclared, non-built-in prefix names.\n\nA SSSOM/TSV writer SHOULD refuse to serialise a mapping set that contains IRIs that cannot be contracted into CURIEs because there is no suitable prefix declaration in its CURIE map. The use of a custom, ad-hoc logic to infer a possible prefix name where none has been provided (e.g., “if the IRI ends with a `ZZZ_NNNNNNN` pattern, turn it into a `ZZZ:NNNNNNN` CURIE”) is strongly discouraged.\n\n\n## Non-standard slots\n\nIf an implementation does not support [non-standard slots](spec-model.md#non-standard-slots), then:\n\n* a SSSOM/TSV reader MUST discard any unknown top-level YAML key in the metadata block, and any unknown TSV column in the TSV section;\n* a SSSOM/TSV writer MUST NOT write any unknown top-level YAML key in the metadata block, or any unknown TSV column in the TSV section.\n\n### Support for defined extensions\n\nThis section applies to implementations that supports defined extensions.\n\nA SSSOM/TSV reader MUST check the validity of the extension definitions listed in the `extension_definitions` slot in the YAML metadata block:\n\n* definitions with no `slot_name`, or with a `slot_name` that is not a XML non-colonized name, MUST be ignored;\n* definitions with any unexpected content (e.g. other keys than just `slot_name`, `property`, and `type_hint`) MUST be ignored;\n* the `property` and `type_hint` values for a given definition, if present, MUST be CURIEs and MUST be resolvable using the mapping set’s `curie_map`, otherwise the definition MUST be ignored.\n\nA SSSOM/TSV reader MUST, upon encountering a non-standard YAML key in the metadata block or an unknown TSV column, check that the name of the key or of the column matches the `slot_name` of one of the extension definitions listed in the mapping set’s `extension_definitions` slot. If there is no match, the non-standard slot MUST be discarded.\n\nUpon encountering a non-standard slot whose corresponding definition has a `type_hint` of `https://w3id.org/linkml/Uriorcurie`, the reader SHOULD check that the value is a CURIE and is resolvable using the mapping set’s `curie_map`.\n\n\n## Compatibility with previous versions of the specification\n\nImplementations MUST support the current version of the specification. However, SSSOM/TSV parsers MAY additionally accept to parse files that were compliant to a previous version. This section provides advice for implementations willing to support older versions.\n\n### Compatibility with pre-1.0 versions\n\n#### `match_type` slot\n\nInitial versions of this specification defined a `match_type` slot on the `Mapping` class. The slot was intended to describe the kind of match that led to the mapping, and accepted values from a specific enumeration. In SSSOM 0.9.1, this slot was replaced by the `mapping_justification` slot, and the enumeration was replaced by terms from the [SEMAPV vocabulary](https://mapping-commons.github.io/semantic-mapping-vocabulary/).\n\nUpon encountering a `match_type` slot, implementations supporting pre-1.0 versions MUST silently transform it into a `mapping_justification` slot and convert the enumeration values using the following table:\n\n| `match_type` value | `mapping_justification` value |\n| ------------------ | ----------------------------- |\n| Lexical            | semapv:LexicalMatching        |\n| Logical            | semapv:LogicalMatching        |\n| HumanCurated       | semapv:ManualMappingCuration  |\n| Complex            | semapv:CompositeMatching      |\n| Unspecified        | semapv:UnspecifiedMatching    |\n| SemanticSimilarity | semapv:SemanticSimilarityThresholdMatching |\n\nAny other value in the `match_type` slot MUST be treated as an error.\n\nIf the set contains both `match_type` and `mapping_justification` slots, it is advised to simply ignore the former.\n\n\n#### `match_term_type` slot\n\nInitial versions of this specification defined a `match_term_type` slot on the `Mapping` class. The slot was intended to describe what was being matched. In SSSOM 0.9.1, this slot was replaced by two distinct slots called `subject_type` and `object_type` (this notably allowed for the case where the subject and the object are of a different type, something the `match_term_type` slot did not support).\n\nUpon encountering a `match_term_type` slot, implementations supporting pre-1.0 versions MUST silently transform it into a pair of `subject_type` and `object_type` slots, both slots having the same value derived from the original value using the following table:\n\n| `match_term_type` value | `subject_type` and `object_type` value |\n| ----------------------- | -------------------------------------- |\n| ConceptMatch            | skos concept                           |\n| ClassMatch              | owl class                              |\n| ObjectPropertyMatch     | owl object property                    |\n| IndividualMatch         | owl named individual                   |\n| DataPropertyMatch       | owl data property                      |\n| TermMatch               | rdfs literal                           |\n\nAny other value in the `match_term_type` slot MUST be treated as an error.\n\nIf the set already contains `subject_type` and `object_type` slots, any `match_term_type` slot can be silently ignored.\n\n#### semantic_similarity_score and semantic_similarity_measure\n\nInitial versions of this specification defined a `semantic_similarity_score` slot to store the semantic similarity, and a `semantic_similarity_measure` slot to describe how the the semantic similarity is assessed. In SSSOM 1.0, those slots were replaced by more generic `similarity_score` and `similarity_measure` slots.\n\nUpon encountering a `semantic_similarity_score` (respectively `semantic_similarity_measure`) slot, implementations supporting pre-1.0 versions MUST silently transform it into a `similarity_score` (respectively `similarity_measure`) slot. No changes on the value of the slot are required.\n\n## Canonical SSSOM/TSV format\n\nThis section defines a “canonical” variant of the SSSOM/TSV format, which has stricter serialisation rules. The purpose of the canonical SSSOM/TSV format is to minimise differences across SSSOM/TSV files that would be induced by small diverging behaviours between different SSSOM/TSV implementations.\n\nThe rules in this section apply to SSSOM/TSV writers only. SSSOM/TSV writers SHOULD write files in the canonical format, but SSSOM/TSV readers MUST NOT reject a file solely because it does not follow the canonical rules.\n\n### General rules\n\nA canonical SSSOM/TSV writer:\n\n* MUST use line breaks made of only the U+000A character (no U+000D, and no U+000D + U+000A sequences);\n* MUST condense the slots whenever possible, as described in the [Condensation](#condensation) section.\n\n\n### Rules for the metadata block\n\nWhen writing the metadata block, a canonical SSSOM/TSV writer:\n\n* MUST embed the metadata block in the same file as the TSV section (no external metadata);\n* MUST NOT insert additional space characters between the initial `#` character and the YAML content;\n* MUST serialise multi-valued slots as YAML “block sequences” ([YAML Specification §8.2.1](https://yaml.org/spec/1.2.2/#821-block-sequences)) – even when the list of values contains only one item;\n* MUST serialise scalar values in YAML “plain style” ([YAML Specification §7.3.3](https://yaml.org/spec/1.2.2/#733-plain-style)) whenever possible, otherwise in “double-quoted style” ([YAML Specification §7.3.1](https://yaml.org/spec/1.2.2/#731-double-quoted-style));\n* MUST serialise the slots in the order they appear in the [“Slots” table](MappingSet.md#slots), in the documentation for the `MappingSet` class;\n* MUST NOT include in the CURIE map the prefix names that are considered “built-in”;\n* MUST NOT include in the CURIE map any prefix name that is not used anywhere in the set;\n* MUST sort the prefix names in the CURIE map in lexicographical order.\n\nIn addition, if [extension slots](spec-model.md#non-standard-slots) are supported, the writer:\n\n* MUST write any extension slot in the mapping set _after_ the standard slots;\n* MUST sort the extension slots lexicographically on the `property` of their corresponding extension definitions;\n* MUST sort extension definitions on their `property` value;\n* MUST not include an extension definition if the corresponding extension is not used anywhere in the set.\n\n\n### Rules for the mappings block\n\nWhen writing the mappings block, a canonical SSSOM/TSV writer:\n\n* MUST quote values only when needed, as per the rules in the [Quoting](#quoting) section;\n* MUST serialise floating point values with up to three digits as needed after the decimal point, rounding the last digit to the nearest neighbour (rounding up if both neighbours are equidistant);\n* MUST write the columns in the order the slots appear in the [“Slots” table](Mapping.md#slots), in the documentation for the `Mapping` class;\n* MUST sort the mappings in lexicographical order on all their slots, in the order the slots appear in the [“Slots” table](Mapping.md#slots).\n\nIn addition, if [extension slots](spec-model.md#non-standard-slots) are supported, the writer:\n\n* MUST write any non-standard column _after_ the standard columns;\n* MUST sort the non-standard column lexicographically on the `property` of their corresponding extension definitions.\n\n\n## Examples\n\nThis section is _non-normative_.\n\nA SSSOM/TSV file in embedded metadata mode:\n\n```\n#curie_map:\n#  FOODON: http://purl.obolibrary.org/obo/FOODON_\n#  KF_FOOD: https://kewl-foodie.inc/food/\n#  orcid: https://orcid.org/\n#mapping_set_id: https://w3id.org/sssom/tutorial/example1.sssom.tsv\n#mapping_set_description: Manually curated alignment of KEWL FOODIE INC internal food and nutrition database with Food Ontology (FOODON). Intended to be used for ontological analysis and grouping of KEWL FOODIE INC related data.\n#license: https://creativecommons.org/licenses/by/4.0/\n#mapping_date: 2022-05-02\nsubject_id\tsubject_label\tpredicate_id\tobject_id\tobject_label\tmapping_justification\tauthor_id\tconfidence\tcomment\nKF_FOOD:F001\tapple\tskos:exactMatch\tFOODON:00002473\tapple (whole)\tsemapv:ManualMappingCuration\torcid:0000-0002-7356-1779\t0.95\t\"We could map to FOODON:03310788 instead to cover sliced apples, but only \"\"whole\"\" apple types exist.\"\nKF_FOOD:F002\tgala\tskos:exactMatch\tFOODON:00003348\tGala apple (whole)\tsemapv:ManualMappingCuration\torcid:0000-0002-7356-1779\t1\t\nKF_FOOD:F003\tpink\tskos:exactMatch\tFOODON:00004186\tPink apple (whole)\tsemapv:ManualMappingCuration\torcid:0000-0002-7356-1779\t0.9\t\"We could map to FOODON:00004187 instead which more specifically refers to \"\"raw\"\" Pink apples. Decided against to be consistent with other mapping choices.\"\nKF_FOOD:F004\tbraeburn\tskos:broadMatch\tFOODON:00002473\tapple (whole)\tsemapv:ManualMappingCuration\torcid:0000-0002-7356-1779\t1\t\n```\n\nThe same set in external metadata mode: first the file containing the metadata block:\n\n```yaml\ncurie_map:\n  FOODON: http://purl.obolibrary.org/obo/FOODON_\n  KF_FOOD: https://kewl-foodie.inc/food/\n  orcid: https://orcid.org/\nmapping_set_id: https://w3id.org/sssom/tutorial/example1.sssom.tsv\nmapping_set_description: Manually curated alignment of KEWL FOODIE INC internal food and nutrition database with Food Ontology (FOODON). Intended to be used for ontological analysis and grouping of KEWL FOODIE INC related data.\nlicense: https://creativecommons.org/licenses/by/4.0/\nmapping_date: 2022-05-02\n```\n\nthen the file containing the mappings block:\n\n```\nsubject_id\tsubject_label\tpredicate_id\tobject_id\tobject_label\tmapping_justification\tauthor_id\tconfidence\tcomment\nKF_FOOD:F001\tapple\tskos:exactMatch\tFOODON:00002473\tapple (whole)\tsemapv:ManualMappingCuration\torcid:0000-0002-7356-1779\t0.95\t\"We could map to FOODON:03310788 instead to cover sliced apples, but only \"\"whole\"\" apple types exist.\"\nKF_FOOD:F002\tgala\tskos:exactMatch\tFOODON:00003348\tGala apple (whole)\tsemapv:ManualMappingCuration\torcid:0000-0002-7356-1779\t1\t\nKF_FOOD:F003\tpink\tskos:exactMatch\tFOODON:00004186\tPink apple (whole)\tsemapv:ManualMappingCuration\torcid:0000-0002-7356-1779\t0.9\t\"We could map to FOODON:00004187 instead which more specifically refers to \"\"raw\"\" Pink apples. Decided against to be consistent with other mapping choices.\"\nKF_FOOD:F004\tbraeburn\tskos:broadMatch\tFOODON:00002473\tapple (whole)\tsemapv:ManualMappingCuration\torcid:0000-0002-7356-1779\t1\t\n```\n\n### Invalid examples\n\nIllegal case 1: the metadata block cannot contains comments that are not part of the metadata.\n\n```\n# This is a comment that does not belong here.\n#curie_map:\n#  HP: \"http://purl.obolibrary.org/obo/HP_\"\n#  MP: \"http://purl.obolibrary.org/obo/MP_\"\n#  orcid: \"https://orcid.org/\"\n# This is another comment that also does not belong here.\n#creator_id:\n#  - \"orcid:0000-0002-7356-1779\"\n```\n\nIllegal case 2: there should be no empty lines.\n\n```\n#curie_map:\n#  HP: \"http://purl.obolibrary.org/obo/HP_\"\n#  MP: \"http://purl.obolibrary.org/obo/MP_\"\n#  orcid: \"https://orcid.org/\"\n\n#creator_id:\n#  - \"orcid:0000-0002-7356-1779\"\n```\n"
  },
  {
    "path": "src/docs/spec-formats.md",
    "content": "# SSSOM serialisation formats\n\nThe SSSOM standard defines the following serialisation formats for storing and exchanging mapping sets:\n\n* the [SSSOM/TSV](spec-formats-tsv.md) format;\n* the [SSSOM/JSON](spec-formats-json.md) format;\n* the [SSSOM/RDF](spec-formats-rdf.md) format;\n* and the [OWL/RDF](spec-formats-owl.md) format.\n\nImplementations MUST support the SSSOM/TSV format. They MAY support the other formats.\n"
  },
  {
    "path": "src/docs/spec-intro.md",
    "content": "# Specification of the SSSOM standard\n\nThis document is the official specification for the SSSOM standard.\n\nIt is divided in three sections covering the three different components of the standard:\n\n* the specification for the [data model](spec-model.md), to manipulate SSSOM mappings and mapping sets in your programs;\n* the specification for the [serialisation formats](spec-formats.md), to read, write, and exchange SSSOM mapping sets;\n* the specification for [supporting functions](spec-support.md) to help manipulating SSSOM mappings and mapping sets.\n\nAll three sections are _normative_.\n\n## Conventions used in this document\n\n### Key words\n\nThroughout the specification, the key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and “OPTIONAL” are to be interpreted as described in [BCP 14](https://datatracker.ietf.org/doc/html/bcp14) when, and only when, they appear in all capitals, as shown here.\n\n### IRI prefixes\n\nThroughout the specification, the following IRI prefix names are used:\n\n| Prefix name | IRI prefix |\n| ----------- | ---------- |\n| owl         | http://www.w3.org/2002/07/owl# |\n| rdf         | http://www.w3.org/1999/02/22-rdf-syntax-ns# |\n| rdfs        | http://www.w3.org/2000/01/rdf-schema# |\n| semapv      | https://w3id.org/semapv/vocab/ |\n| skos        | http://www.w3.org/2004/02/skos/core# |\n| sssom       | https://w3id.org/sssom/ |\n| xsd         | http://www.w3.org/2001/XMLSchema# |\n| linkml      | https://w3id.org/linkml/ |\n"
  },
  {
    "path": "src/docs/spec-model.md",
    "content": "# The SSSOM data model\n\nThe SSSOM data model (hereafter “the model”) defines the data structure to represent and manipulate SSSOM concepts. The model is formally described as a [LinkML](https://linkml.io/) schema, from which the [documentation](linkml-index.md) is derived.\n\nThis section provides an overview of the model and supplementary information that may not be found in the schema (and its derived documentation) itself. Of note, the schema, not this section, is always the authoritative source of truth for all questions pertaining to the model.\n\n## Overview\n\nThe model consists in a handful of classes, the most important of them being the [`Mapping` class](Mapping.md) and the [`MappingSet` class](MappingSet.md). Any SSSOM implementation MUST support those two classes and all their slots; support for the other classes is OPTIONAL.\n\nThe `Mapping` class represents an individual mapping. Fundamental slots in that class are:\n\n* `subject_id` and `object_id`, referring to the entities being mapped to each other;\n* `predicate_id`, referring to the relationship between the mapped entities;\n* `mapping_justification`, which should provide the justification for the mapping.\n\nThose slots are mandatory (including the `mapping_justification` slot: the SSSOM standard posits that there can be no mapping without some form of justification) and an implementation MUST NOT allow the creation of a mapping object that does not have a value for any one of them.\n\nOther slots are intended to provide further details about a mapping. Those “further details” are sometimes referred to as “mapping metadata”, though the SSSOM standard makes no formal distinction between “data” and “metadata” – there are only “data about a mapping”.\n\nThe `MappingSet` class represents, well, a set of individual mappings, which are contained in the `mappings` slot (a list of `Mapping` instances). Other slots in that class are intended either to provide further details about the set itself (sometimes referred to as “mapping set metadata”, with the same caveat as above regarding the data/metadata distinction), or to provide common details for all the mappings in the set (see the [Propagation of mapping set slots](#propagation-of-mapping-set-slots) section further below for details).\n\nOf note, within a set, a mapping may not necessarily be uniquely identified by the combination of its four mandatory slots (`subject_id`, `predicate_id`, `object_id`, and `mapping_justification`). A set may very well contain several mappings with the same subject, predicate, object, and justification, but that differ on some of the other, complementary slots.\n\n\n## Identifiers\n\nThroughout the model, identifiers to external resources are represented using the custom type [`EntityReference`](EntityReference.md) (based on the LinkML type [`uriorcurie`](https://w3id.org/linkml/Uriorcurie)), which accepts both full-length IRIs and [CURIEs](https://www.w3.org/TR/curie/) as possible identifier formats. (Note however that serialisation formats may mandate the use of one identifier format over the other; for example, the [SSSOM/TSV](spec-formats-tsv.md) format requires the systematic use of CURIEs, whereas the [OWL/RDF](spec-formats-owl.md) format conversely requires the systematic use of IRIs).\n\nWhenever the CURIE syntax is used in a mapping set (whether this is by choice of the SSSOM producer, or because it is mandated by the serialisation format), all CURIEs MUST be unambiguously resolvable into corresponding full-length IRIs without requiring any external resources. This means that any prefix name used MUST be properly declared in the set’s `curie_map` slot, which is a dictionary associating a prefix name to an IRI prefix.\n\nBy exception, prefix names listed in the table found in the [IRI prefixes](spec-intro.md#iri-prefixes) section are considered “built-in”. As such, they MAY be omitted from the `curie_map`. If they are not omitted, they MUST point to the same IRI prefixes as in the aforementioned table.\n\n\n## Propagatable slots\n\nAs mentioned briefly above, there are two different types of slots in the `MappingSet` class:\n\n* slots that provide information about the set itself;\n* slots that provide information about all the mappings in the set.\n\nThe latter are called “propagatable slots”. In the LinkML model, they are marked with a `propagated` annotation whose value is set to `true`.\n\nFor convenience, here is the current list of propagatable slots:\n\n* `curation_rule`,\n* `curation_rule_text`,\n* `cardinality_scope`,\n* `mapping_date`,\n* `mapping_provider`,\n* `mapping_tool`,\n* `mapping_tool_version`,\n* `object_match_field`,\n* `object_preprocessing`,\n* `object_source`,\n* `object_source_version`,\n* `object_type`,\n* `subject_match_field`,\n* `subject_preprocessing`,\n* `subject_source`,\n* `subject_source_version`,\n* `subject_type`,\n* `predicate_type`,\n* `similarity_measure`.\n\nWhen a mapping set object has a value in one of its propagatable slots, this MUST be interpreted as if all mappings within the set had that same value in their corresponding slot. For example, if a set has the value _foo_ in its `mapping_tool` slot, all the mappings in that set MUST be treated as if they had the value _foo_ in their `mapping_tool` slot.\n\nThis mechanism is intended as a convenience, so that a slot which has the same value for all mappings in a set can be specified only once at the level of the set rather than for each individual mapping.\n\nSlots that are not in the above list (“non-propagatable slots”) describe the mapping set itself, not the mappings it contains, even if the slot also exists on the `Mapping` class. For example, the `creator_id` slot, when used in the `MappingSet` class, is intended to refer to the creators of the set, _not_ the creators of the individual mappings (which may be different, and which are listed in the `creator_id` slot of every mapping).\n\n### Propagation\n\n“Propagation” is the operation of assigning to individual mapping records in a set the values from the propagatable slots of the set.\n\nFor any given propagatable slot, propagation is only allowed if none of the individual mapping records already have their own value in that slot. If any record (even only one record) has a value in that slot, then the slot MUST be considered as non-propagatable. Otherwise, to propagate the slot an implementation MUST (1) copy over the value of the propagatable slot on the mapping set to the corresponding slot of every individual mapping records, and (2) remove the propagated value from the mapping set.\n\n### Condensation\n\n“Condensation” is the opposite of “propagation”. It is the operation of assigning common values to the propagatable slots of the set, based on the values of these slots on individual mapping records.\n\nFor any given propagatable slot, condensation is only allowed if (1) all mapping records in the set have the same value for that slot, and (2) the mapping set itself does not already have a value in the slot, unless that value happens to be the same as the value in all records. If those two conditions are met, then to condense the slot an implementation MUST (1) set the value of the slot on the mapping set to the common value of the slot in all mapping records, and (2) remove the condensed value from all the mapping records.\n\n### When to perform propagation and condensation\n\nImplementations SHOULD support propagation and condensation. The two features MUST NOT be dissociated; that is, an implementation that supports propagation MUST also support condensation, and the other way round.\n\nUnless specified otherwise in the specification for the [SSSOM serialisation formats](spec-formats.md), if an implementation supports propagation and condensation, then:\n\n* propagation SHOULD be performed by a SSSOM parser before passing the parsed objects to the application code;\n\n* condensation SHOULD be performed by a SSSOM writer prior to writing the set into a file, however that behaviour MUST be deactivatable.\n\n\n## Allowed and common mapping predicates\n\nImplementations MUST accept any arbitrary predicate in the `predicate_id` slot.\n\nThe following mapping predicates are considered common, and implementations MAY encourage users to use them:\n\n| Predicate | Description |\n| --------- | ----------- |\n| owl:sameAs | The subject and the object are instances (OWL individuals), and the two instances are the same. |\n| owl:equivalentClass | The subject and the object are OWL classes, and the two classes are the same. |\n| owl:equivalentProperty | The subject and the object are OWL object, data, or annotation properties, and the two properties are the same. |\n| rdfs:subClassOf | The subject and the object are OWL classes, and the subject is a subclass of the object. |\n| rdfs:subPropertyOf | The subject and the object are OWL object, data, or annotation properties, and the subject is a subproperty of the object. |\n| skos:relatedMatch | The subject and the object are associated in some unspecified way. |\n| skos:closeMatch | The subject and the object are sufficiently similar that they can be used interchangeably in some information retrieval applications. |\n| skos:exactMatch | The subject and the object can, with a high degree of confidence, be used interchangeably across a wide range of information retrieval applications. |\n| skos:narrowMatch | The object is a narrower concept than the subject. |\n| skos:broadMatch | The object is a broader concept than the subject. |\n| oboInOwl:hasDbXref | Two terms are related in some way. The meaning is frequently consistent across a single set of mappings. Note this property is often overloaded even where the terms are of a different nature (e.g. interpro2go). |\n| rdfs:seeAlso | The subject and the object are associated in some unspecified way. The object IRI often resolves to a resource on the web that provides additional information. |\n\nIn addition, predicates from the following sources MAY also be encouraged:\n\n* any relation from the [Relation Ontology (RO)](https://obofoundry.org/ontology/ro.html);\n* any relation under [skos:mappingRelation](http://www.w3.org/2004/02/skos/core#mappingRelation) in the [Semantic Mapping Vocabulary](https://mapping-commons.github.io/semantic-mapping-vocabulary/).\n\n\n## Literal mappings\n\n<a id=\"literal-mappings\"></a>\n\nThe SSSOM model is primarily intended to represent mappings between semantic entities. However, it may also be used to represent mappings where at least one side is a literal string that does not have an identifier of its own. Any such mapping is henceforth called a _literal mapping_.\n\nTo represent a mapping whose subject (resp. object) is a literal:\n\n* the `subject_type` (resp. `object_type`) slot MUST be set to `rdfs literal`;\n* the `subject_label` (resp. `object_label`) slot MUST be set to the literal itself;\n* the `subject_id` (resp. `object_id`) slot MAY be left empty.\n\nThe last point is an exception to the normal rules about required slots, which state that a mapping must always have a `subject_id` and an `object_id`. Implementations MUST accept a mapping without a `subject_id` (resp. `object_id`) _if and only if_ the `subject_type` (resp. `object_type`) slot is set to `rdfs literal`.\n\nAll other slots in the `Mapping` class may be used normally in a literal mapping, with the same meaning as for a non-literal mapping.\n\nWhen computing the cardinality of mappings in a set (e.g. to set the value of the `mapping_cardinality` slot), if the mapping has a literal subject (resp. object), then the `subject_label` (resp. `object_label`) slot must be used for determining the number of occurrences of the subject (resp. object) in the set.\n\n\n## Representing unmapped entities\n\nThe special value `sssom:NoTermFound` MAY be used as the `object_id` of a mapping to explicitly state that the subject of said mapping cannot be mapped to any entity in the domain represented by the `object_source` slot.\n\nLikewise, the `sssom:NoTermFound` value MAY be used as the `subject_id` of a mapping to state that the object of said mapping cannot be mapped to any entity in the domain represented by the `subject_source` slot.\n\nWhen that special value is used as the `subject_id` (respectively `object_id`), the `subject_source` (respectively `object_source`) slot SHOULD be defined.\n\nThe `sssom:NoTermFound` value MUST NOT be used in any other slot than `subject_id` or `object_id`.\n\nThe meaning of the NOT predicate modifier in a mapping that refers to `sssom:NoTermFound` is unspecified.\n\nWhen computing cardinality values (to fill the `mapping_cardinality` slot): (1) a mapping record with a `object_id` (respectively `subject_id`) of `sssom:NoTermFound` MUST be assigned a cardinality value of `1:0` (respectively `0:1`), regardless of any other record; (2) a mapping record with both the `subject_id` and the `object_id` set to `sssom:NoTermFound` MUST be assigned a cardinality value of `0:0`, regardless of any other record; (3) such records MUST be ignored when computing the cardinality of other records.\n\n\n## Mapping cardinality and cardinality scope\n\nThe `mapping_cardinality` slot is somewhat special in that its value is\nonly meaningful within a given context, or “scope”: a mapping record in\nitself does not have any cardinality – it only has one when it is part\nof a larger set of records.\n\nConsider the following three records (set metadata, and in particular\nprefix declarations, have been omitted for brevity):\n\n| `subject_id`   | `predicate_id`   | `object_id`  | `object_source` |\n| -------------- | ---------------- | ------------ | --------------- |\n| UBERON:0000011 | skos:broadMatch  | VHOG:0000755 | obo:VHOG        |\n| UBERON:0000011 | skos:narrowMatch | EHDAA:4655   | obo:EHDAA       |\n| UBERON:0000011 | skos:narrowMatch | NCIT:C12764  | obo:NCIT        |\n\nWithin that particular set, all three records have a cardinality of\n`1:n` (one subject, UBERON:0000011, mapped to many objects).\n\nBut cardinality can also be computed on smaller subsets. For example:\n\n* if we are only interested in records that have the same predicate,\n  then the first record has a cardinality of `1:1` (UBERON:0000011 is\n  mapped to only one object through a `skos:broadMatch` predicate),\n  while the other two still have a cardinality of `1:n` (UBERON:0000011\n  is mapped to two different objects through a `skos:narrowMatch`\n  predicate);\n* if we are only interested in records where the objects are from the\n  same source, then all three records have a cardinality of `1:1`\n  (UBERON:0000011 is mapped to only one object in each of the three\n  vocabularies VHOG, EHDAA, and NCIT).\n\nIt is left to users and downstream applications of SSSOM to decide which\ntype of cardinality (relative to the entire set or relative to any of\nthe many possible subsets) will be the most useful to them. The\n`cardinality_scope` slot is intended to allow them to specify which\ncardinality they use.\n\nWhen computing cardinality values:\n\n* if the cardinality is computed on the entire set, the\n  `cardinality_scope` slot MUST be left empty (or absent);\n* if the cardinality is computed on a subset, the `cardinality_scope`\n  slot MUST be filled with the list of slots that are used to define the\n  subset.\n\n\n## Non-standard slots\n\n<a id=\"non-standard-slots\"></a>\n\nImplementations are only REQUIRED to support the standard metadata slots defined in the SSSOM LinkML schema.\n\nHowever, implementations MAY support the use of supplementary, non-standard slots (hereafter called _extension slots_ or simply _extensions_). There are two types of extension slots: _defined_ extension slots and _undefined_ extension slots.\n\n### Defined extensions\n\nDefined extensions are non-standard slots that are explicitly declared (or, _defined_) before being used. Implementations SHOULD support the use of defined extensions.\n\nExtensions are defined in the `extension_definition` slot of the `MappingSet` object. Each definition is comprised of three elements:\n\n* the name of the slot, as it will appear when used in a mapping set (`slot_name`);\n* a property intended to specify the meaning of the slot (`property`);\n* the type of values expected by the slot (`type_hint`).\n\nA definition MUST have at least a `slot_name`. The name MUST be a XML “non-colonized name” (“NCName”, see [Namespaces in XML, §2](https://www.w3.org/TR/1999/REC-xml-names-19990114/#NT-NCName)). The name MUST NOT match the name of an existing standard slot.\n\nTo avoid any conflicy with a future version of the SSSOM specification (which could introduce new standard slot names), implementations are strongly encouraged to craft extension slot names that start with the `ext_` prefix. No new standard slot with a name starting with `ext_` will ever be introduced in any future version of the standard. (This is an advice for SSSOM producers only; SSSOM consumers MUST NOT reject an extension slot solely on the basis that its name does not start with `ext`.)\n\nA definition SHOULD have a `property`. If it does not, implementations MUST automatically construct a default property by concatenating the prefix `http://sssom.invalid/` with the name of the extension.\n\nThe slot name and the property MUST be unique to each definition. No two definitions can share the same name and/or the same property.\n\nA definition MAY have a `type_hint`. If it does not, a default type of `http://www.w3.org/2001/XMLSchema#string` is assumed.\n\nOnce defined, an extension slot may be used as a supplementary slot in either the `Mapping` class or the `MappingSet` class (or both), as if it was a normal, standard slot. How those slots are represented internally and provided to client code is left at the discretion of the implementations.\n\n### Undefined extensions\n\nUndefined extensions are non-standard slots that are not explicitly defined as described in the previous section. Implementations MAY support undefined extensions.\n\nUpon encountering a non-standard slot that is not a defined extension, an implementation that supports undefined extensions MUST behave as if the slot had been defined with:\n\n* a `property` constructed by catenating the prefix `http://sssom.invalid/` to the name of the slot;\n* a `type_hint` of `http://www.w3.org/2001/XMLSchema#string`.\n\n### Restrictions on the values of extension slots\n\n#### General restrictions\n\nThe following restrictions apply to all extension slots, regardless of whether they are defined or undefined.\n\nEach mapping set and each mapping can have at most _one_ value for each extension slot. The expected behaviour upon encountering a repeated extension slot is unspecified.\n\nAn extension value MUST be either a string or an instance of a simple data type such as a numerical value (integer or floating point), a boolean value, or a date or datetime value. In particular, composite data structures (e.g. lists or dictionaries) MUST NOT be used as extension values.\n\nIt is always possible to use arbitrarily complex values by encoding them as literal strings. However, how complex values would be encoded is out of scope of this specification; implementations MUST treat such values as opaque strings.\n\n#### Further restrictions for typed defined extensions\n\nIf a defined extension slot has a `type_hint` other than `http://www.w3.org/2001/XMLSchema#string`, implementations MAY enforce further constraints on extension values based on the type hint, according to the following table:\n\n| Type hint | Constraints |\n| --------- | ----------- |\n| http://www.w3.org/2001/XMLSchema#integer  | Implementations MAY check that the value is an integer |\n| http://www.w3.org/2001/XMLSchema#double   | Implementations MAY check that the value is a floating number |\n| http://www.w3.org/2001/XMLSchema#boolean  | Implementations MAY check that the value is either `true` or `false` |\n| http://www.w3.org/2001/XMLSchema#date     | Implementations MAY check that the value is a date in the ISO 8601 format (`yyyy-mm-dd`) |\n| http://www.w3.org/2001/XMLSchema#datetime | Implementations MAY check that the value is a date and time value in the ISO 8601 format (`yyyy-mm-ddThh:mm:ssTZ`) |\n\nImplementations MAY decide to recognise more types and to enforce type-specific constraints. For example, an implementation could recognise the type `http://www.w3.org/2001/XMLSchema#negativeInteger` and check that the value starts with a minus sign.\n\n## Versioning\n\nStarting from version 1.1 of the specification, the `MappingSet` class has an optional slot named `sssom_version` which indicates the version of the specification that the set declares itself to be compliant with.\n\n### Versioning rules\n\nThe SSSOM specification mostly follows the [Semantic Versioning principles](https://semver.org/), but only version numbers with two components: a _major_ number _X_ and a _minor_ number _Y_, expressed as `X.Y`.\n\nA set that is compliant with a minor version _X.Y_ is also compliant with any minor version _X.Y+n_, for any value of _n_. The opposite is not true: a set compliant with a minor version _X.Y_ may not necessarily be compliant with a minor version _X.Y-n_.\n\nA set that is compliant with a major version _X_ may not be compliant with any other major version _X+n_ or _X-n_.\n\nTherefore, an implementation that is itself compliant with version _X.Y_ SHOULD always accept a set compliant with any version _X.Y-n_. It MAY reject outright a set compliant with any version _X.Y+n_ (more recent minor version), _X-n_ (older major version), or _X+n_ (more recent major version).\n\nIn other words, the SSSOM specification guarantees backwards compatibility between two versions (in that a set compliant with an older version can be used with an implementation compliant with a newer version) only insofar as only the _minor_ version has changed.\n\n### Using the `sssom_version` slot\n\nWhen reading a SSSOM set:\n\n(A) If the set contains a `sssom_version` slot, implementations SHOULD check whether they recognize the indicated version as a supported version according to the rules in the previous section; if they don’t, they MAY reject the set outright.\n\n(B) If the set does not contain a `sssom_version` slot, it MUST be assumed to be compliant with version 1.0.\n\nWhen generating a SSSOM mapping set:\n\n(A) If the set uses slots or enum values that were added in more recent versions than 1.0, then the `sssom_version` slot MUST be set to the lowest version that defines all the slots effectively used.\n\n(B) If the set only uses slots or values that already existed in version 1.0, then the set is effectively compliant with said version 1.0 and the `sssom_version` slot MAY be omitted entirely.\n\nNote that, if the `sssom_version` slot is _not_ omitted, then it MUST be set to `1.1`, since that slot itself has been added in version 1.1. It follows that a `sssom_version=1.0` slot (a set that would declare itself to be compliant with version 1.0) is self-contradictory.\n\n### Model changes across versions\n\nFor all slots that were added to the specification after version 1.0, the LinkML model contains an `added_in` annotation that indicates the exact version in which the slot was introduced.\n\nNot all changes can be annotated thusly in the LinkML model, though. For changes other than the complete addition of a new slot, implementation can refer to the following subsections.\n\n#### Model changes in version 1.1\n\n* The `similarity_measure` slot, which previously only existed on the `Mapping` class, has been added to the `MappingSet` class.\n* The value `composed entity expression` has been added to the `EntityType` enumeration.\n* The type of the `see_also` slot has been changed to `sssom:NonRelativeURI`. When parsing a SSSOM 1.0 set, implementations SHOULD accept arbitrary string values in that slot.\n* All slots that were typed as `xsd:anyURI` have been re-typed as `sssom:NonRelativeURI`. When parsing a SSSOM 1.0 set, implementations SHOULD accept relative URI values in those slots.\n* The `curation_rule` and `curation_rule_text` slots which previously only existed on the `Mapping` class, have been added to the `MappingSet` class. Both slots have now been typed [propagatable](#propagation-of-mapping-set-slots).\n* A new value `0:0` has been added to the `mapping_cardinality_enum`.\n"
  },
  {
    "path": "src/docs/spec-support-hashing.md",
    "content": "# Hashing a SSSOM mapping record\n\nSSSOM implementations SHOULD provide a function to compute a hash on a SSSOM\nmapping record. That function is hereafter called “the SSSOM hashing function”\nand defined below.\n\n## Rationale and purpose\n\nThe SSSOM hashing function defined here allows to compute a value derived from a\nmapping record in such a way that, if two mapping records yield the same value,\nthe records are highly likely to be identical.\n\nThe function is intended for **interoperability** between SSSOM implementations.\nIts point is to ensure that one can always compute the same hash for the same\nmapping record regardless of which SSSOM implementation is used.\n\nWhen an implementation needs to compute a record hash **for its own internal\npurpose** (for example, to store records into a hash table), it may use whatever\nmethod is best suited without regard for the SSSOM hashing function.\n\n## Hashing procedure\n\nThe general principle of the SSSOM hashing function is to compute a\nhexadecimal-encoded FNV64 hash of a canonical S-expression representing the\nmapping record.\n\n### Step 0: Propagate all condensed slots\n\nIf the mapping set the mapping record to hash belongs to contains condensed\nslots, they MUST be propagated to the mapping record\n[as per the standard rules](spec-model.md#propagation).\n\n### Step 1: Turn the mapping record into a canonical S-expression\n\nThis step creates a representation of the mapping record into a canonical\nS-expression as per\n[RFC 9804](https://www.rfc-editor.org/rfc/rfc9804#name-canonical-representation).\n\nThe S-expression MUST be assembled as follows:\n\n1.  Start with `(7:mapping(`.\n2.  Iterate over all slots of the `Mapping` class, in the order in which they\n    are [listed](../Mapping/#slots) in the LinkML model. Exclude the `record_id`\n    slot and the `mapping_cardinality` slot. For all other slots:\n    1. If the slot has no value for the mapping record to hash, skip to next\n       slot.\n    2. Append to the S-expression `(N:SLOTNAME`, where _SLOTNAME_ is the LinkML\n       name for the slot and _N_ is the length of the slot name (so, for\n       example, `(10:subject_id`, `(9:author_id`, `(10:confidence`, etc.).\n    3. If the slot is defined as a multi-valued slot (and even if it has only\n       one value in the mapping record to hash):\n        1. Append `(`.\n        2. Sort the list of values in lexicographical order and iterate over the\n           sorted values. For each value _V_, append `N:V`, where _N_ is the\n           length of _V_.\n        3. Append `)`.\n    4. If the slot is typed as a floating point number (e.g. `confidence`),\n       convert the value into a string _V_ according to the rules set forth in\n       the section\n       [Formatting floating-point values](#formatting-floating-point-values).\n       Then append `N:V`, where _N_ is the length of _V_.\n    5. If the slot is typed as an enumeration (e.g. `subject_type`), append\n       `N:ENUMVALUE`, where _ENUMVALUE_ is the allowed value in the enumeration\n       as specified in the LinkML model, and _N_ is the length of _ENUMVALUE_\n       (e.g. `9:owl class` for a possible value for the `subject_type` slot).\n    6. If the slot is typed as a date, append `10:YYYY-MM-DD`, where\n       _YYYY-MM-DD_ is the representation of the value in ISO-8601 format.\n    7. If the slot is typed as an entity reference, ensure the value is expanded\n       according to the mapping set’s prefix map and append `N:V`, where _V_ is\n       the expanded reference and _N_ is the length of the expanded reference.\n    8. If the slot is of any other type, append `N:V`, where _V_ is the string\n       value of the slot and _N_ is the length of the string value.\n    9. Append `)`.\n3.  If the implementation support\n    [extension slots](spec-model.md#non-standard-slots) and the mapping record\n    does have such slots:\n    1. Append `(10:extensions(`.\n    2. Sort extension values by their properties in lexicographical order.\n    3. For each extension value:\n        1. Append `(N:PROP`, where _PROP_ is the property identifying the\n           extension and _N_ is the length of the property.\n        2. Use the table below to transform the extension value into a string\n           _V_ based on the declared type of the extension.\n        3. Append `N:V)`, where _N_ is the length of the string value _V_.\n    4. Append `))`.\n4.  Append `))`.\n\nConverting extension values to string:\n\n| Declared extension type | Conversion to string                                                                                       |\n| ----------------------- | ---------------------------------------------------------------------------------------------------------- |\n| `xsd:string`            | No conversion needed, use the value directly                                                               |\n| `xsd:integer`           | Base 10 representation of the integer value                                                                |\n| `xsd:double`            | Apply the rules from the section [Formatting floating-point values](#formatting-floating-point-values)     |\n| `xsd:boolean`           | `true` or `false`                                                                                          |\n| `xsd:date`              | ISO-8601 representation: `YYYY-MM-DD`                                                                      |\n| `xsd:datetime`          | ISO-8601 representation: `YYYY-MM-DDThh:mm:ssTZ` where `TZ` is the zone offset (e.g. `+01:00` or `-06:30`) |\n| `xsd:anyURI`            | No conversion needed, use the value directly                                                               |\n| `linkml:uriOrCurie`     | Expand the value according to the set’s prefix map                                                         |\n| any other type          | unspecified                                                                                                |\n\n### Step 2: Compute the FNV64 hash of the S-expression\n\nEncode the S-expression assembled in step 1 into UTF-8 (if it was not already\nassembled directly in UTF-8). Then hash the array of bytes containing the UTF-8\nrepresentation of the S-expression using the 64-bit variant of the FNV-1a hash\nfunction as defined in [RFC 9923](https://www.rfc-editor.org/rfc/rfc9923.html).\n\n### Step 3: Encode the hash into a hexadecimal string\n\nEncode the hash computed in step 2 into uppercase hexadecimal, also known as\nBase16 encoding as defined in\n[RFC 4648](https://datatracker.ietf.org/doc/html/rfc4648#section-8).\n\n<a id=\"formatting-floats\"></a>\n\n### Formatting floating-point values\n\nWhenever a floating-point number needs to be appended to the canonical\nS-expression built in Step 2 above, the following specific rules apply:\n\n1. The non-fractional part MUST NOT be omitted, even it is zero. For example,\n   `0.7` MUST NOT be written as `.7`.\n2. The fractional part MUST be truncated to _up to_ 3 digits _as needed_. If the\n   fractional part can be written in less than 3 digits, then it MUST NOT be\n   right-padded with zeros. For example, `0.7` MUST NOT be written as `0.700`.\n3. If the fractional part needs to be truncated, the value MUST be rounded to\n   the nearest value representable with 3 digits, rounding half away from zero.\n   This corresponds to the _roundTiesToAway_ mode as defined by [IEEE 754-2019\n   §4.3.1](https://doi.org/10.1109/IEEESTD.2019.8766229).\n\nThe following table gives some examples of rounding after truncation:\n\n| Original value | Canonical representation |\n| -------------- | ------------------------ |\n| 0.7832...      | 0.783                    |\n| 0.7835...      | 0.784                    |\n| 0.7836...      | 0.784                    |\n| -0.7832...     | -0.783                   |\n| -0.7836...     | -0.784                   |\n| -0.7835...     | -0.784                   |\n\n## Example\n\n> This section is not normative. It provides a step-by-step example of how to\n> apply the above procedure.\n\nGiven the following mapping set in SSSOM/TSV format:\n\n```\n#curie_map:\n#  FBbt: http://purl.obolibrary.org/obo/FBbt_\n#  UBERON: http://purl.obolibrary.org/obo/UBERON_\n#  orcid: https://orcid.org/\n#  semapv: https://w3id.org/semapv/vocab/\n#  skos: http://www.w3.org/2004/02/skos/core#\nsubject_id\tpredicate_id\tobject_id\tmapping_justification\tcreator_id\nFBbt:00001234\tskos:exactMatch\tUBERON:0005678\tsemapv:ManualMappingCuration\torcid:0000-0000-5678-1234|orcid:0000-0000-1234-5678\n```\n\nApplying step 1 of the above procedure to the only mapping record of that set\nwould yield the following canonical S-expression (**whitespaces added for\nclarity**, they MUST NOT appear in the actual S-expression):\n\n```\n(7:mapping(\n           (10:subject_id44:http://purl.obolibrary.org/obo/FBbt_00001234)\n           (12:predicate_id46:http://www.w3.org/2004/02/skos/core#exactMatch)\n           (9:object_id45:http://purl.obolibrary.org/obo/UBERON_0005678)\n           (21:mapping_justification51:https://w3id.org/semapv/vocab/ManualMappingCuration)\n           (10:creator_id(\n                          37:https://orcid.org/0000-0000-1234-5678\n                          37:https://orcid.org/0000-0000-5678-1234\n            ))\n))\n```\n\nApplying the FNV64 hash function to the above S-expression and encoding the\nresulting bytes in hexadecimal would yield the following final value:\n`0A442FB005783031`.\n\n## Test vectors\n\n> This section is not normative. It provides examples of SSSOM mapping sets\n> along with the canonical S-expression and the Base16-encoded hash value of the\n> set’s only record.\n\n**Source set:**\n\n```\n#curie_map:\n#  FOODON: http://purl.obolibrary.org/obo/FOODON_\n#  KF_FOOD: https://kewl-foodie.ince/food/\n#  semapv: https://w3id.org/semapv/vocab/\n#  skos: http://www.w3.org/2004/02/skos/core#\n#  wikidata: https://www.wikidata.org/wiki/\n#subject_source: KF_FOOD:DB\n#object_source: wikidata:Q55118395\n#object_source_version: http://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl\nsubject_id\tpredicate_id\tobject_id\tmapping_justification\tconfidence\tmapping_date\nKF_FOOD:F001\tskos:exactMatch\tFOODON:00002473\tsemapv:ManualMappingCuration\t0.95\t2022-05-02\n```\n\nS-expression:\n\n```\n(7:mapping((10:subject_id34:https://kewl-foodie.ince/food/F001)(12:predicate_id46:http://www.w3.org/2004/02/skos/core#exactMatch)(9:object_id46:http://purl.obolibrary.org/obo/FOODON_00002473)(21:mapping_justification51:https://w3id.org/semapv/vocab/ManualMappingCuration)(14:subject_source32:https://kewl-foodie.ince/food/DB)(13:object_source39:https://www.wikidata.org/wiki/Q55118395)(21:object_source_version68:http://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl)(12:mapping_date10:2022-05-02)(10:confidence4:0.95)))\n```\n\nHash value:\n\n```\n97170EB542E9AE8F\n```\n\n**Source set:**\n\n```\n#curie_map:\n#  FBbt: http://purl.obolibrary.org/obo/FBbt_\n#  UBERON: http://purl.obolibrary.org/obo/UBERON_\n#  semapv: https://w3id.org/semapv/vocab/\n#  skos: http://www.w3.org/2004/02/skos/core#\n#  example: https://example.org/sets/record-id#\nrecord_id\tsubject_id\tpredicate_id\tobject_id\tmapping_justification\nexample:0000001\tFBbt:0009124\tskos:exactMatch\tUBERON:0000003\tsemapv:LexicalMatching\n```\n\nS-expression:\n\n```\n(7:mapping((10:subject_id43:http://purl.obolibrary.org/obo/FBbt_0009124)(12:predicate_id46:http://www.w3.org/2004/02/skos/core#exactMatch)(9:object_id45:http://purl.obolibrary.org/obo/UBERON_0000003)(21:mapping_justification45:https://w3id.org/semapv/vocab/LexicalMatching)))\n```\n\nHash value:\n\n```\n18F3436E89AA1AA2\n```\n\n**Source set:**\n\n```\n#curie_map:\n#  HP: http://purl.obolibrary.org/obo/HP_\n#  MP: http://purl.obolibrary.org/obo/MP_\n#  semapv: https://w3id.org/semapv/vocab/\n#  skos: http://www.w3.org/2004/02/skos/core#\n#mapping_provider: https://w3id.org/sssom/core_team\nsubject_id\tpredicate_id\tobject_id\tmapping_justification\tsimilarity_score\nHP:0009124\tskos:exactMatch\tMP:0000003\tsemapv:LexicalSimilarityThresholdMatching\t0.8\n```\n\nS-expression:\n\n```\n(7:mapping((10:subject_id41:http://purl.obolibrary.org/obo/HP_0009124)(12:predicate_id46:http://www.w3.org/2004/02/skos/core#exactMatch)(9:object_id41:http://purl.obolibrary.org/obo/MP_0000003)(21:mapping_justification64:https://w3id.org/semapv/vocab/LexicalSimilarityThresholdMatching)(16:mapping_provider32:https://w3id.org/sssom/core_team)(16:similarity_score3:0.8)))\n```\n\nHash value:\n\n```\n0D45A2E8C64EBD65\n```\n\n**Source set:**\n\n```\n#curie_map:\n#  COMENT: https://example.com/entities/\n#  EXPROP: https://example.org/properties/\n#  ORGENT: https://example.org/entities/\n#  semapv: https://w3id.org/semapv/vocab/\n#  skos: http://www.w3.org/2004/02/skos/core#\n#extension_definitions:\n#  - slot_name: ext_bar\n#    property: EXPROP:barProperty\n#    type_hint: xsd:integer\n#  - slot_name: ext_baz\n#    property: EXPROP:bazProperty\n#    type_hint: linkml:Uriorcurie\nsubject_id\tsubject_label\tpredicate_id\tobject_id\tobject_label\tmapping_justification\text_bar\text_baz\nORGENT:0001\talice\tskos:closeMatch\tCOMENT:0011\talpha\tsemapv:ManualMappingCuration\t111\tORGENT:BAZ_0001\n```\n\nS-expression:\n\n```\n(7:mapping((10:subject_id33:https://example.org/entities/0001)(13:subject_label5:alice)(12:predicate_id46:http://www.w3.org/2004/02/skos/core#closeMatch)(9:object_id33:https://example.com/entities/0011)(12:object_label5:alpha)(21:mapping_justification51:https://w3id.org/semapv/vocab/ManualMappingCuration)(10:extensions((42:https://example.org/properties/barProperty3:111)(42:https://example.org/properties/bazProperty37:https://example.org/entities/BAZ_0001)))))\n```\n\nHash value:\n\n```\n66BD0A57A976A109\n```\n"
  },
  {
    "path": "src/docs/spec-support.md",
    "content": "# SSSOM supporting functions\n\nThis section defines functions and behaviours that SSSOM implementations should\nsupport to help users manipulate SSSOM mapping sets.\n\n- [Hashing mapping records](spec-support-hashing.md)\n- [Chaining rules](chaining-rules.md)\n\nIn addition, SSSOM implementations SHOULD also support the proposed\n[Mapping Sameness Identifier](https://ts4nfdi.github.io/mapping-sameness-identifier/)\nstandard; that is, implementations SHOULD offer a way to obtain the Mapping\nSameness Identifier for a given SSSOM mapping record.\n"
  },
  {
    "path": "src/docs/toolkit.md",
    "content": "# The SSSOM Toolkit\n\nIn the following we will give a brief introduction into the SSSOM toolkit. For more detailed documentation please refer to https://mapping-commons.github.io/sssom-py.\n\n## Pre-requisites\n\n- Complete the [basic SSSOM tutorial](tutorial.md)\n- [Install SSSOM toolkit](https://mapping-commons.github.io/sssom-py/installation.html). Alternatively, you can install the [Ontology Development Kit (ODK)](https://github.com/INCATools/ontology-development-kit) and follow the tutorial using its [docker image](https://oboacademy.github.io/obook/howto/odk-setup/).\n- We are assuming a Unix shell for this tutorial, but most of the principles should apply to the Windows CMD as well. Windows users may prefer to install the ODK (see above).\n\n## Overview\n\nSSSOM toolkit (STK), previously known as `sssom-py`, is a set of utility methods for processing SSSOM files, packaged as a Command Line Client (CLI) and a [python package](https://pypi.org/project/sssom/). In the following, we will extract mappings from an ontology an process them with the CLI. The goal is to give a sense of the functionality of the toolkit. Additional and more up-to-date information on usage can be found [here](https://mapping-commons.github.io/sssom-py).\n\n## Table of Contents\n\n1. `parse`: [Extracting mappings from an external source](#parse)\n2. `merge`: [Combining mappings from several sources](#merge)\n3. `convert`: [Converting an SSSOM mapping table into different formats](#convert)\n\n<a id=\"parse\"></a>\n\n## Extracting mappings from an external source\n\nOne key issue developers are faced with is to convert various different mapping formats into a common representation (e.g. SSSOM). The SSSOM toolkit (STK) already implements a number of commonly use mapping formats:\n\n1. [OWL Ontologies](https://en.wikipedia.org/wiki/Web_Ontology_Language)\n2. [Alignment API](https://moex.gitlabpages.inria.fr/alignapi/) Format (format used by the Ontology Alignment Evaluation Initiative, OAEI)\n3. Parsers for SNOMED mapping format and FHIR Concept Map are [in the making](https://github.com/mapping-commons/sssom-py/pull/207), June 2022.\n\nHere we use Uberon, an anatomy ontology in the biomedical domain.\n\n```\nwget http://purl.obolibrary.org/obo/uberon/uberon-base.json -O uberon-base.json\n```\n\nFeel free to download the file manually if you do not have `wget` installed.\n\nNow use `sssom parse` to extract all the mappings provided by the ontology. As there are multiple json based formats that can be parsed, you have to tell `sssom` which format you are using: `--input-format obographs-json`.\n\n```\nsssom parse uberon-base.json --input-format obographs-json --output uberon.sssom.tsv\n```\n\nFrom a CLI design perspective we already notice a few things:\n\n- `uberon-base.json` is passed to the STK _as an argument_ (without an option like `-i`). This is the case for most _primary inputs_ (mapping tables, source files) throughout the SSSOM client.\n- The output generated by the above command is large. There seem to be a lot of messages where some URL `does not follow any known prefixes`:\n\n```\nWARNING:root:http://dbpedia.org/ontology/AnatomicalStructure does not follow any known prefixes\nWARNING:root:http://uri.neuinfo.org/nif/nifstd/nlx_subcell_100205 does not follow any known prefixes\nWARNING:root:http://neurolex.org/wiki/Category:Embryonic_organism does not follow any known prefixes\nWARNING:root:http://www.informatics.jax.org/cookbook/figures/figure20.shtml does not follow any known prefixes\nWARNING:root:http://mbe.oxfordjournals.org/content/26/3/613/F1.large.jpg does not follow any known prefixes\nWARNING:root:http://palaeos.com/vertebrates/glossary/images/450x218xEctocuneiform.gif.pagespeed.ic.kaiuLYQELL.png does not follow any known prefixes\nWARNING:root:http://palaeos.com/vertebrates/bones/dermal/images/289x311xPalatine1.gif.pagespeed.ic.tglmNBrF4D.png does not follow any known prefixes\nWARNING:root:http://uri.neuinfo.org/nif/nifstd/nifext_14 does not follow any known prefixes\n....\n```\n\nUnderstanding this is important to understand a lot about how SSSOM treats entities in general.\n\n### Why are there so many `does not follow any known prefixes` warnings?\n\nCURIEs are a key concept for the representation of SSSOM documents, in particular its table. All fields that constitute a reference to some entity, such as ids (`subject_id`, `object_id`, `predicate_id`), and other fields such as `mapping_justification` are represented in CURIE syntax.\n\nThe [Semantic Web](https://www.w3.org/standards/semanticweb/) uses URIs (which look more like URLs rather than CURIEs) to refer to entities - there is, however, no standard protocol to translate a URI into a _Compact_ URI (or CURIE).\n\nEfforts such as https://bioregistry.io/, https://github.com/prefixcommons or https://identifiers.org/ try to bring a bit of an organisation to prefixes. In particular the former two curate maps between prefixes and URIs.\n\n- URI: `http://purl.obolibrary.org/obo/MONDO_0000001`\n- CURIE: `MONDO:0000001`\n- PREFIX: `MONDO`\n- URI expansion: `http://purl.obolibrary.org/obo/MONDO_`\n\nNow the problem is that over the years, many very idiosyncratic URIs where used to denote entities in ontologies. While the STK tries to figure out the correct prefixes using https://bioregistry.io/, many times it fails - in these cases, the user _must provide its own prefix map_.\n\nLets create a simple one, and save it as `metadata.yml` (we call it \"metadata\", because we will add more metadata to it in this tutorial):\n\n```\ncurie_map:\n  dbpedia: http://dbpedia.org/ontology/\n```\n\nWe can now use this _in addition to the default prefix maps_:\n\n```\nsssom parse uberon-base.json --input-format obographs-json --metadata metadata.yml --prefix-map-mode merged --output uberon.sssom.tsv\n```\n\n<a id=\"merge\"></a>\n\n## Combining mappings from several sources\n\n<a id=\"convert\"></a>\n\n## Converting an SSSOM mapping table into different formats\n\n\n\n## Other methods:\n\n- cliquesummary\n- correlations\n- crosstab\n- dedupe\n- diff\n- dosql\n- partition\n- ptable\n- reconcile-prefixes\n- rewire\n- sort\n- sparql\n- split\n- validate\n\n_Under construction_."
  },
  {
    "path": "src/docs/training.md",
    "content": "## SSSOM Training materials\n\n- [Elevator pitch](#elevator)\n- [Tutorials and Guides](#guides)\n- [Related tutorials](#related)\n\n<a id=\"elevator\"></a>\n\n### Elevator pitch\n\n<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/T-YP-Lv9k2s?si=tN9lHUFcovkyvm6z\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen></iframe>\n\n<a id=\"guides\"></a>\n\n### Tutorials and Guides\n\n- [Mapping curation with SSSOM](https://oboacademy.github.io/obook/tutorial/sssom-tutorial/)\n- [Are these two entities the same? A guide.](https://oboacademy.github.io/obook/howto/are-two-entities-the-same/). An important tutorial that explains that it is not directly possible to determine if two things are the same across ontologies, but its still worth doing when explicitly recording the rationale.\n- [Linking across vocabularies: Semantic Entity Matching](https://oboacademy.github.io/obook/lesson/entity-matching/): Entity matching is the process of establishing a link between an identifier in one semantic space to an identifier in another. There are many cultures of thought around entity matching, including Ontology Matching, Entity Resolution and Entity Linking.\n\n<a id=\"related\"></a>\n\n### Related tutorials\n\n- [Introduction to processing mappings with SSSOM and sssom-py CLI](https://oboacademy.github.io/obook/tutorial/sssom-toolkit/)\n- [Introduction to matching with OAK lexmatch](https://oboacademy.github.io/obook/tutorial/lexmatch-tutorial/)\n- [Curating Semantic Mappings with Biomappings](https://oboacademy.github.io/obook/tutorial/biomappings/)"
  },
  {
    "path": "src/docs/tutorial.md",
    "content": "# Introduction to mapping curation with SSSOM\n\nMappings between entities from ontologies, terminologies and databases are created for many reasons (data integration, knowledge graphs) and maintained in many different ways (automated matching, manual curation). In the following tutorial, we will learn how to curate semantic mappings manually using SSSOM. Knowledge about manual mapping curation is important even in scenarios where most, if not all, of the mapping curation is performed automatically - the basic principles are still the same.\n\n## Pre-requisites\n\nWe expect the reader of this tutorial to have a basic understanding of the following:\n\n- What are ontology classes? What is a database?\n- What is an (ontology) mapping?\n- Why do we need to map across ontologies and between databases and ontologies?\n\nWe do provide a few materials in the [Background](#background) section below that touch on the above concepts, but a detailed discussion is out of scope.\n\n## Table of contents\n\n- [Background](#background)\n   - [Ontology alignment](#align)\n   - [What are we mapping?](#what)\n   - [CURIEs, URIs and databases](#curie)\n- [How to create an SSSOM mapping set from scratch](#scratch)\n   - [Manually curating mapping sets](#scratchstart)\n   - [Automated processing 1: Creating an embedded SSSOM file](#automated1)\n\n## Background\n\nAs a reminder, a SSSOM mapping comprises three major components:\n\n1. The **mapping** itself, that is, a triple `<subject, predicate, object>` that reflects a correspondence of a `subject` entity, for example a class in an ontology, to an `object` entity, for example an identifier in some database, via a semantic mapping `predicate`, such as `skos:exactMatch`.\n2. A **mapping justification**, the process or activity that led us to consider the mapping to be correct or reasonable (typical examples: labels match exactly; two classes are logically equivalent; a domain expert determined that two terms reflect the same real world concept).\n3. **Provenance metadata**, including information about `author` and `mapping_tool`.\n\nIn the following, we will give pointers to some useful background materials before we describe how SSSOM mappings are created.\n\n<a id=\"align\"></a>\n\n### Ontology alignment/matching\n\nOntology alignment is the process of determining correspondences between ontological concepts. The usage of \"alignment\", \"matching\" and \"mapping\" is fuzzy in practice. From the perspective of SSSOM, alignment usually involves determining _all_ (or a more or less complete set of) correspondences between ontological concepts of two or more source ontologies. The most important resource on the subject is [\"Ontology Matching\"](https://link.springer.com/book/10.1007/978-3-642-38721-0) by Jérôme Euzenat and Pavel Shvaiko. If you are interested in really diving into the subject, there is no avoiding this book!\n\nThis 25 minute course unit by the OpenHPI gives a nice overview over the area, which is relevant to all mapping activities:\n\n<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/VJHKcq_GuxY\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen></iframe>\n\nAnother useful overview is this one by the Knowledge and Data VU Amsterdam. Especially after minute 12, we learn a bit about the differences of OWL and SKOS.\n\n<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/gnq9I0OTjRo\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen></iframe>\n\nA 10 minute deep-dive into Jerome Euzenat classification of ontology matching techniques can be seen here:\n\n<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/Jag9hHCZRj8\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen></iframe>\n\n<a id=\"what\"></a>\n\n### What are we mapping?\n\nIn SSSOM we are concerned with mapping _information entities_, i.e. representations of a real world entities. Examples of such entities are:\n\n- Classes, Individuals and Properties in an ontology.\n- Entities in Databases, such as a specific person in a \"Person\" table of a relational database.\n- A specific value in the slot of a data model, for example the \"UNIVERSITY\" constant in the `highest-degree` enumeration for a demographics survey data model.\n- A specific code from a code system or terminology such as ICD10CM.\n\nInformation entities represent _real world objects_ such as diseases (e.g. Alzheimer's, Diabetes), kinds of vegetables (Asparagus, Broccoli), concrete instances of vegetables (a specific broccoli that was sold in your local supermarket yesterday).\n\n#### What kind of entities can we _not_ map with SSSOM?\n\nSome of the limitations of SSSOM are discussed in our [paper](https://arxiv.org/abs/2112.07051). A selection of the most important things that cannot be mapped at the moment:\n\n- Compound/complex entities, i.e. entities that are defined by more than one term. For example, we cannot currently map \"Raw apple\" (subject) to \"Apple\" and \"Raw\" (two objects).\n- Anything that is not an entity, e.g. unit conversion rules (1000mg maps to 1g * 1000) or functions.\n- Highly contextual entities like \"PERSON:1\" as they enter the hospital.\n\nAs a rule of thumb, we can map any entity for which (1) we can provide a single identifier and (2) whose identifier establishes its context (i.e. no further information is needed to understand the meaning of the identifier).\n\nNote that _literal values_ are a special case - SSSOM is not designed for mapping literals to entity identifiers, but there are some discussions on how to do this anyways [here](https://github.com/mapping-commons/sssom/issues/81).\n\n<a id=\"curie\"></a>\n\n### CURIEs, URIs and databases\n\nA mapping involves three entities: \n\n1. A `subject` (the entity which is mapped to some other entity)\n1. An `object` (the entity the subject is mapped to)\n1. A semantic `mapping predicate`, such as \"skos:exactMatch\" which defines how the subject entity is mapped to the object entity.\n\nAll three _must_ be referred to by an **identifier in CURIE syntax** ([Compact URI](https://www.w3.org/TR/2010/NOTE-curie-20101216/)) when using the SSSOM table format or JSON, or an IRI (Internationalized Resource Identifier) when you are using the RDF representation of SSSOM. This is necessary to ensure that entities are globally unique and mapping sets are fully interoperable across an organisation and beyond. While these concepts are common practice in the Semantic Web world, they may be less well understood in the database world. In fact, they can be quite awkward: \n- Your database my use `p9787869` to identify a specific person in a \"Person\" table of a relational database.\n- Your data model for a demographics survey uses, among others, the `UNIVERSITY` constant in the `highest-degree` enumeration.\n\nTo be compliant with SSSOM, such values must be \"curified\". While this process sounds daunting at first, it is essential: Both the `p9787869` identifier and the `UNIVERSITY` constant may be used in different contexts (different databases or data models) to refer to entirely different entities! While there is no 100% reliable guide for \"curification\", we usually recommend the following steps:\n\n* Choose a globally unique URI prefix which can unambiguously define the context of your entity. For example (1) `http://embl.org/ebi/person/p9787869` to refer to the person in your `Person` table and (2) `http://embl.org/demographics-survey-datamodel/demographics.highest_education#UNIVERSITY`. In an ideal world, these can be de-referenced (i.e. you can look them up in a web-browser), but the important thing is that they are globally unique (and persistent), so that they cannot be confused with, for example, the `UNIVERSITY` code in another data model.\n* We select a reasonable prefix for the code, for example (1) `embl.ebi.person` and (2) `demographics-survey-datamodel.demographics.highest_education`. Note these do not need to be globally unique anymore. Indeed, you could, if you wanted to, use (much) shorter prefixes. (NOTE: some people disagree with this and strive for globally unique prefixes. In the biomedical domain, for example, we try to coordinate prefixes at http://bioregistry.io/. This is not however, necessary when using SSSOM).\n* We record the prefixes and their URI prefixes (sometimes called URI expansions) in the `curie_map` of our SSSOM file:\n\n```\ncurie_map:\n  embl.ebi.person: \"http://embl.org/ebi/person/\"\n  demographics-survey-datamodel.demographics.highest_education: \"http://embl.org/demographics-survey-datamodel/demographics.highest_education#\"\n```\n\n* Now we can refer to our entities in the SSSOM mapping table like this: (1) `embl.ebi.person:p9787869` and (2) `demographics-survey-datamodel.demographics.highest_education:UNIVERSITY`.\n\nThis may strike some users as verbose - but the concept of unique identifiers for all information entities is _at the heart of SSSOM_. There is an initial cost to carefully defining namespaces for the various vocabularies and contexts (data model enums, value sets), but the ability to unambiguously refer to an entity will pay of as the organisation grows and data needs to be integrated from a wide variety of sources. \n\n_Tangent:_ See [here](https://hl7.org/fhir/conceptmap-example.ttl.html) for an example how [FHIR](http://hl7.org/fhir/), a standard for health care data exchange, published by HL7, deals with this: Rather than using a lot of prefixes, FHIR chooses to have one small namespace for `fhir`, and then having the path to the data model element all the way to its value as the local identifier.\n\n<a id=\"scratch\"></a>\n## How to create an SSSOM mapping set from scratch\n\nSSSOM mapping sets can be created as part of automated processes, like ontology matchers, or manually by ontology curators. While there is overlap, it makes sense to look at both cases separately. To remind yourself why you should build SSSOM mapping sets in the first place, please refer to [the FAQ](faq.md#why).\n\n<a id=\"scratchstart\"></a>\n### Manually curating mapping sets\n\nTo gradually improve terminological mapping practices we are proposing a [5-star system for mappings](5star-mappings.md). For the sake of this tutorial, we will focus on producing a [solid 3-Star mapping set](5star-mappings.md) with the following metadata:\n\n**Core mapping metadata**:\n\n- `subject_id`: The ID of the subject of the mapping\n- `predicate_id`: The ID of the predicate of the mapping\n- `object_id`: The ID of the object of the mapping\n\n**Mapping justification metadata**:\n\n- `mapping_justification`: the process or activity that led us to believe the mapping to be correct or reasonable.\n\n**Basic provenance metadata**:\n\n- `mapping_date`: The date the mapping was asserted. This is different from the date the mapping was published or compiled in a SSSOM file.\n- `author_id`: Identifies the persons or groups responsible for asserting the mappings. Recommended to be a (pipe-separated) list of ORCIDs or otherwise identifying URLs, but any identifying string (such as name and affiliation) is permissible.\n- `mapping_set_description`: A description of the mapping set, providing context and motivation.\n- `license`: An identifier for a license description.\n- `mapping_set_id`: A unique identifier of the mapping set.\n- `mapping_set_version`: The version of a mapping set.\n- `subject_source`: URI of source the subject.\n- `subject_source_version`: The version of the source of the subject.\n- `object_source`: URI of source the subject.\n- `object_source_version`: The version of the source of the object.\n- `confidence`: the level of certainty you have for the mapping to be true (based on the process used to confirm or generate it).\n\n**Some convenience metadata**\n\n- `subject_label`: The human readable label of the subject.\n- `object_label`: The human readable label of the object.\n\n#### The tutorial scenario\n\nYou are charged with aligning your organisations (KEWL FOODIE INC) internal database about food and nutrition with [Food Ontology (FOODON)](https://foodon.org/). In your database, you have a table with food items:\n\n| ID | LABEL |\n| --- | ---- |\n| F001 | apple |\n| F002 | gala |\n| F003 | pink |\n| F004 | braeburn |\n\nAs a first pass, you are tasked to map the food items (kinds of apples) in your database to classes in the FOODON ontology.\n\n#### Getting the tools together\n\nTo complete this tutorial, we need the following tools:\n\n1. A table editor. In this tutorial we will use [Google Sheets](https://docs.google.com/spreadsheets/u/0/). Manually curating mappings is often done in a collaborative fashion. We like Google Sheets because it allows multiple people to edit the same mapping set at once.\n1. OPTIONAL: The [SSSOM toolkit](https://mapping-commons.github.io/sssom-py) installed (requires python 3.9+).\n\n#### Creating a first draft of the mappings\n\nFirst create a google sheet with the following columns:\n\n| subject_id | subject_label | predicate_id | object_id | object_label | mapping_justification | mapping_date | author_id | subject_source | subject_source_version | object_source | object_source_version | confidence |\n|------------|---------------|--------------|-----------|--------------|-----------------------|--------------|-----------|----------------|------------------------|---------------|-----------------------|------------|\n\nAs we are mapping database identifiers, our first step is _curiefy our database identifiers_. Read up in detail on why this is done [here](#curie).\n\nWe chose to use the following URI prefix for our food database: http://kewl-foodie.com/foods/, with the `KF_FOODS:` prefix (for now, we just document this information in the side, but later, we will add this to our mapping table).\n\nNext, we will add all the entities we hope to align to the mapping table above (we removed some columns here for readability, we will get back to these later):\n\n| subject_id   | subject_label | predicate_id | object_id | object_label | confidence |\n|--------------|---------------|--------------|-----------|--------------|-----------------------|\n| KF_FOOD:F001 | apple         |              |           |              |                       |\n| KF_FOOD:F002 | gala          |              |           |              |                       |\n| KF_FOOD:F003 | pink          |              |           |              |                       |\n| KF_FOOD:F004 | braeburn      |              |           |              |                       |\n\nWhile not necessary from a computational perspective, we recommend to document the labels of both the subject and the object to make the mapping table easier to process for human curators.\n\nThe next step is now to try and identify suitable terms from FOODON to map to. In the biomedical domain, most curators will [search OLS](https://www.ebi.ac.uk/ols/search?q=apple&groupField=iri&start=0&ontology=foodon) or [Ontobee](https://www.ontobee.org/search?ontology=FOODON&keywords=apple&submit=Search+terms), but some more technically advanced users may choose to use [SPARQL over ontobee](https://api.triplydb.com/s/nq_xvl3JQ) or another endpoint:\n\n```\nPREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\nPREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\nSELECT * WHERE {\n  ?sub rdfs:label ?obj .\n  FILTER(regex(str(?obj), \"apple\"))\n  FILTER(STRSTARTS(str(?sub),\"http://purl.obolibrary.org/obo/FOODON_\"))\n}\n```\n\nA detailed discussion on mapping predicates can be found [here](mapping-predicates.md).\n\n##### Mapping \"apple\", attempt 1\n\nOur first attempt is to try and map `KF_FOOD:F001` (apple). At the time of writing, a search for the string \"apple\" just across the labels in FOODON reveals more than 300 results. There are no exact matches for the search string \"apple\", i.e. there is no entity in FOODON that has the label \"apple\" exactly. Rather than sifting through the large set of results, we move on to try to map a more specific element first. As FOODON is an ontology, having a mapping to a more specific element (e.g. `gala`) may help us to find an appropriate mapping for the more general concept (e.g. `apple`), which should be hierarchically related to the more specific term.\n\n##### Mapping \"gala\"\n\nIndeed, a [search for \"gala\"](https://www.ebi.ac.uk/ols/search?q=gala&groupField=iri&start=0&ontology=foodon) reveals one single result: [Gala apple (whole)](https://www.ebi.ac.uk/ols/ontologies/foodon/terms?iri=http%3A%2F%2Fpurl.obolibrary.org%2Fobo%2FFOODON_00003348). How do we know if this is a good mapping for our own database entity `gala`? This is a very difficult question, and there is no perfect answer. It is important to remember that mappings should not be judged in terms of \"correct\" or \"wrong\", but in terms of \"fit for purpose\", or, in the case of SSSOM, \"fit for most purposes\". The following thoughts should cross the curators mind:\n\n- There does not seem to be another FOODON class concerned with \"Gala\".\n- From the description, \"A pome fruit of a Gala apple tree cultivar.\" it seems like we are indeed talking about a kind of apple. ([The picture in the OLS Term information box also helps.](https://www.ebi.ac.uk/ols/ontologies/foodon/terms?iri=http%3A%2F%2Fpurl.obolibrary.org%2Fobo%2FFOODON_00003348))\n- A quick email to our product team at KEWL FOODIE INC confirms that indeed, our `gala` database entity and FOODON's `Gala apple (whole)` class seem to refer to the same entity. As apples in our database are usually considered \"whole\", we do not concern ourselves further with the that slightly ambiguous part of the label. (Can I map my apple snack pack which has the \"whole\" apple cut in slices to `FOODON:00003348`?)\n\nWe add the new mapping to our mapping table. Due to our domain expertise and consultation with the product team of our company, we are very confident (1.0 or 100%) that the mapping between `KF_FOOD:F002` and `FOODON:00003348` is exact (for exact matches, we use `skos:exactMatch` as per [SSSOM convention](https://mapping-commons.github.io/sssom/spec-model/#allowed-and-common-mapping-predicates)).\n\n| subject_id   | subject_label | predicate_id    | object_id       | object_label       | confidence |\n|--------------|---------------|-----------------|-----------------|--------------------|------------|\n| KF_FOOD:F001 | apple         |                 |                 |                    |            |\n| KF_FOOD:F002 | gala          | skos:exactMatch | FOODON:00003348 | Gala apple (whole) |          1 |\n| KF_FOOD:F003 | pink          |                 |                 |                    |            |\n| KF_FOOD:F004 | braeburn      |                 |                 |                    |            |\n\n##### Mapping \"apple\", attempt 2\n\nGiven our mapping of [Gala apple (whole)](https://www.ebi.ac.uk/ols/ontologies/foodon/terms?iri=http%3A%2F%2Fpurl.obolibrary.org%2Fobo%2FFOODON_00003348) we take a better look at the class hierarchy around. We notice three things:\n\n- There is indeed a class called \"apple (whole)\" which seems to fit our purpose. This also seems to be consistent with our choice of \"Gala apple (whole)\".\n- What is, however, annoying is that there is also a [\"apple (whole or parts)\"](https://www.ebi.ac.uk/ols/ontologies/foodon/terms?iri=http%3A%2F%2Fpurl.obolibrary.org%2Fobo%2FFOODON_03310788&viewMode=All&siblings=false) class. KEWL FOODS INC definitely has plans to introduce products involving sliced Gala apples!\n- FOODON does not have a concept of a sliced Gala apple.\n\nAgain, our judgement as curators is asked here. There is no \"correct\" or \"wrong\". To keep things consistent, we decide to map to the \"whole\" apple, but we take a mental note that this might change in the future. We also take a physical note to _document this design decision_ as a comment.\n\n| subject_id   | subject_label | predicate_id    | object_id       | object_label       | confidence | comment                                                                                             |\n|--------------|---------------|-----------------|-----------------|--------------------|------------|-----------------------------------------------------------------------------------------------------|\n| KF_FOOD:F001 | apple         | skos:exactMatch | FOODON:00002473 | apple (whole)      |       0.95 | We could map to FOODON:03310788 instead to cover sliced apples, but only \"whole\" apple types exist. |\n| KF_FOOD:F002 | gala          | skos:exactMatch | FOODON:00003348 | Gala apple (whole) |          1 |                                                                                                     |\n| KF_FOOD:F003 | pink          |                 |                 |                    |            |                                                                                                     |\n| KF_FOOD:F004 | braeburn      |                 |                 |                    |            |                                                                                                     |\n\n##### Mapping \"pink\"\n\nIn the same hierarchy as `apple (whole)`, we find [Pink apple (whole)](https://www.ebi.ac.uk/ols/ontologies/foodon/terms?iri=http%3A%2F%2Fpurl.obolibrary.org%2Fobo%2FFOODON_00004186). This is seems like an excellent match, consistent with our previous design decisions. However two observations leave us uncertain:\n\n- The [Pink apple (whole)](https://www.ebi.ac.uk/ols/ontologies/foodon/terms?iri=http%3A%2F%2Fpurl.obolibrary.org%2Fobo%2FFOODON_00004186) class has no definition (at the time of writing this tutorial at least) and no pictures, so we cannot be 100% certain that our notion of \"pink\" is the same as Foodon. A search on Wikipedia reveals different names, like \"Pink Pearl\" and \"Pink Lady\", which makes us a bit uncertain.\n- In contrast to \"Gala apple (whole)\", \"Pink apple (whole)\" has a further subclass, \"Pink apple (whole, raw)\". What does that mean? All data in our KEWL FOODS INC database pertains to raw apple, so is this now a better match? Raw as opposed to what? Cooked?\n\nAgain, there is no great recipe to solve this dilemma. We chose our default recipe:\n\n1. prefer consistent mapping rules over occasionally increased precision (not always a good idea)\n2. document design decision\n\n| subject_id   | subject_label | predicate_id    | object_id       | object_label       | confidence | comment                                                                                                                                                   |\n|--------------|---------------|-----------------|-----------------|--------------------|------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------|\n| KF_FOOD:F001 | apple         | skos:exactMatch | FOODON:00002473 | apple (whole)      |       0.95 | We could map to FOODON:03310788 instead to cover sliced apples, but only \"whole\" apple types exist.                                                       |\n| KF_FOOD:F002 | gala          | skos:exactMatch | FOODON:00003348 | Gala apple (whole) |          1 |                                                                                                                                                           |\n| KF_FOOD:F003 | pink          | skos:exactMatch | FOODON:00004186 | Pink apple (whole) |        0.9 | We could map to FOODON:00004187 instead which more specifically refers to \"raw\" Pink apples. Decided against to be consistent with other mapping choices. |\n| KF_FOOD:F004 | braeburn      |                 |                 |                    |            |                                                                                                                                                           |\n\n##### Mapping \"braeburn\"\n\nWe now turn our attention to the last database entity: `KF_FOOD:F004` (braeburn).\n\nUnfortunately, our search for `braeburn`, `brae-burn` yields no results in Foodon. We search Wikipedia and Google for potential synonyms of Braeburn that might have been missed by the FOODON developers, but are unsuccessful. In the end, we give up and decide that there is no matching concept for `KF_FOOD:F004` (braeburn) in FOODON. Now we have to make a choice and how to reflect that in our mapping set:\n\n- We can document directly the fact that there is no `skos:exactMatch` in our SSSOM table.\n- We can map `KF_FOOD:F004` (braeburn) to a more general concept, i.e. `apple (whole)`.\n- We can do both.\n\nFor our data integration efforts, it is generally useful to know if no exact match could be found. Here, again, we have two options:\n\n- we can convey this information by omission. By not including a mapping in the dataset, it does not exist. The downside is that we do not know further down the line if (a) we have looked and there really was no suitable code and (b) we have not looked.\n- we can convey this information by using a special code `sssom:NoMapping`. (NOTE as of 2 May 2022, the final decision on how this is represented has not been made. Follow [this discussion](https://github.com/mapping-commons/sssom/issues/28)).\n\nIn our case, we have plans to extend our manual mapping efforts with automated ones. We want to use manual non-mapping assertions to filter out false positive mappings with our automated approaches, so we decide to go with the second option and make the non-mapping explicit.\n\nThe second question is whether to include a _less precise_ mapping. This depends heavily on the target use case. As a rule of thumb, if the target use case requires precise 1:1 mappings (for example, data transformation use cases often do), we do not include any broad mappings. If our use case is data aggregation, broad matches can still be very useful: At least, we will be able to use the hierarchical structure of FOODON to retrieve all kinds of apples in our FOOD database! We are interested in data aggregation, so we decide to include the mapping.\n\n| subject_id   | subject_label | predicate_id    | object_id       | object_label       | confidence | comment                                                                                                                                                   |\n|--------------|---------------|-----------------|-----------------|--------------------|------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------|\n| KF_FOOD:F001 | apple         | skos:exactMatch | FOODON:00002473 | apple (whole)      |       0.95 | We could map to FOODON:03310788 instead to cover sliced apples, but only \"whole\" apple types exist.                                                       |\n| KF_FOOD:F002 | gala          | skos:exactMatch | FOODON:00003348 | Gala apple (whole) |          1 |                                                                                                                                                           |\n| KF_FOOD:F003 | pink          | skos:exactMatch | FOODON:00004186 | Pink apple (whole) |        0.9 | We could map to FOODON:00004187 instead which more specifically refers to \"raw\" Pink apples. Decided against to be consistent with other mapping choices. |\n| KF_FOOD:F004 | braeburn      | skos:exactMatch | sssom:NoMapping |                    |          1 |                                                                                                                                                           |\n| KF_FOOD:F004 | braeburn      | skos:broadMatch | FOODON:00002473 | apple (whole)      |          1 |                                                                                                                                                           |\n\n#### Adding rich metadata\n\nWe are done curating the basic mappings. Next, we will add some richer metadata for the mapping set. For this tutorial we will add the metadata introduce [here](#scratchstart).\n\n**Mapping justification metadata**:\n\n`mapping_justification`: the process or activity that led us to believe the mapping to be correct or reasonable.\n\nThis is the most important piece of metadata and a pivotal concept for SSSOM curation in general. Let us think about all the various ways that can lead us to believe a mapping to be correct.\n\nThe most crude thing would be to document is: \"a Human determined this mapping\". We do that by documenting the mapping justification `semapv:HumanCuration`. This justification is a vague placeholder, but it instills some confidence in the mapping consumer (the user) that someone with at least some domain expertise determined the mapping to be ok. We will discuss `mapping_justification`s in more detailed in a later tutorial on automated matching, where we have many more fine-grained distinctions, like \"the justification for asserting this mapping is that the label of the subject matches to an exact synonym of the object after applying 'stemming' during preprocessing\". Nevertheless, modelling human curation better is one of the future goals of SSSOM. The key is to document \"curation rules\", which contain the conditions and assumptions made by the (human) mapping author when asserting the mapping. In the absence of a [formal element](https://github.com/mapping-commons/sssom/issues/166) (at least at the time of this writing, May 2022), you should try and document such curation rules in the `comment` field.\n\n**Basic provenance metadata**:\n\n`mapping_date`: The date the mapping was asserted. \n\nWhy is this important? Time of an assertion is essential provenance. It allows us to prefer assertions (mapping decisions) that were done later, but it also gives us a hint how old a mapping is, in particular if the source versions are not, or cannot, be documented. It is a very easy element to document, and we should try to do that at all times.\n\n`author_id`: Identifies the persons or groups responsible for asserting the mappings.\n\nThe author is a crucial bit of metadata, in particular in conjunction with the mapping justification `human curation`. A mapping consumer can look up the author of a mapping through their unique identifier (e.g. an [ORCiD](https://orcid.org/), which we use in the biomedical domain, but might be anything, including a unique database identifier). Again, we prefer PURLs here, that resolve to some useful information when you look them up.\n\n`mapping_set_id`: A unique identifier of the mapping set. This is a pivotal concept in FAIR data and data management in general: every unit of data that is shared around within an organisation (or the whole world) [should have a unique identifier](https://www.go-fair.org/fair-principles/f1-meta-data-assigned-globally-unique-persistent-identifiers/). As per Semantic Web conventions, we recommend using persistent URLs, or PURLs, to identify your mappings set. For example: http://purl.obolibrary.org/obo/mondo.owl is a unique identifier to an ontology and http://purl.obolibrary.org/obo/mondo/mapping/mondo.sssom.tsv refers to the \"Mondo disease mappings\".\n\n`mapping_set_version`: The version of a mapping set. Versioning is absolutely crucial for mapping sets, much the same way as it is for ontologies. We recommend to use [semantic versioning](https://semver.org/) or simple ISO Date versioning, like \"2022-05-01\". The latter is recommended by some organisations like the [OBO foundry](https://obofoundry.org/principles/fp-004-versioning.html) (it is easier to see how new a mapping set is, and it is easier to sort as a string), but semantic versioning is much more widely used. We use date based versioning in the tutorial.\n\n`mapping_set_description`: A description of the mapping set, providing context and motivation. This is another underrated piece of metadata that allows humans to understand and build trust towards a mapping set. A good description of a mapping set\n\n- describes the scope and content of a mapping set\n- describes the purpose for the creation of the mapping set\n- is reasonably short, but not too short (3-4 sentences)\n\n`license`: An identifier for a license description. One of the most serious impediments to reuse on the web is the absence of clear and **standardised** licenses. We recommend the creative commons licenses for open data, either CC-0 (public domain, no license) or CC-BY 4.0. (Some people prefer CC-BY 4.0, because it ensures that attribution is taken more seriously.) Even when using a proprietary license, it is good to be transparent here, so that an \"accidentally leaked\" data file is not mistakenly assumed to be \"open\".\n\n`subject_source`: URI of source the subject. This is one of the most important pieces of metadata: an unambiguous reference to a source. It is notoriously hard to standardise source references ([see past debate](https://github.com/mapping-commons/sssom/issues/126)). We recommend to use the standard URIs used in your own domain, for example OBO (`obo:mondo`) or Wikidata (`wikidata:Q7876491`).\n\n`subject_source_version`: The version of the source of the subject. In order to interpret a mapping, it is not enough to know the source. Sources changes all the time, whether they are database and/or ontology: classes are obsoleted, database records are deleted. What counts for an exact mapping may change through the evolution of a source. _Always_ document the source version, if you can. This can be very difficult for database systems that do not have a real notion of versioning.\n\n`object_source`: URI of source the object. See `subject_source`.\n\n`object_source_version`: The version of the source of the object. See `subject_source_version`.\n\n#### Mapping vs Mapping set metadata - where should it go?\n\nSSSOM distinguishes between `mapping` and `mapping_set` metadata, i.e. metadata that pertains to each individual mapping and metadata that pertains to the whole mapping set. To understand which is which, you can browse [the specification](https://mapping-commons.github.io/sssom/spec/).\n\n\n**Mapping metadata** is usually captured in the rows of the SSSOM mapping table. We have done this a lot so far during this tutorial: documenting our confidence in our mapping decision, and specifying the source of our subject id. However, in SSSOM we have the option to document some `mapping` metadata on the level of the `mapping_set`, which means that the `metadata` item applies to **all mappings in the mapping set**. We will capture `subject` and `object_source` this way, see a bit further below. We capture `mapping` level metadata in the usual way using our table:\n\n| subject_id   | subject_label | predicate_id    | object_id       | object_label       | confidence | comment                                                                                                                                                   | mapping_justification | mapping_date | author_id                 | subject_source_version | object_source_version                                                |\n|--------------|---------------|-----------------|-----------------|--------------------|------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------|--------------|---------------------------|------------------------|----------------------------------------------------------------------|\n| KF_FOOD:F001 | apple         | skos:exactMatch | FOODON:00002473 | apple (whole)      |       0.95 | We could map to FOODON:03310788 instead to cover sliced apples, but only \"whole\" apple types exist.                                                       | semapv:HumanCuration  |   2022-05-02 | orcid:0000-0002-7356-1779 |                        | http://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl |\n| KF_FOOD:F002 | gala          | skos:exactMatch | FOODON:00003348 | Gala apple (whole) |          1 |                                                                                                                                                           | semapv:HumanCuration  |   2022-05-02 | orcid:0000-0002-7356-1779 |                        | http://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl |\n| KF_FOOD:F003 | pink          | skos:exactMatch | FOODON:00004186 | Pink apple (whole) |        0.9 | We could map to FOODON:00004187 instead which more specifically refers to \"raw\" Pink apples. Decided against to be consistent with other mapping choices. | semapv:HumanCuration  |   2022-05-02 | orcid:0000-0002-7356-1779 |                        | http://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl |\n| KF_FOOD:F004 | braeburn      | skos:exactMatch | sssom:NoMapping |                    |          1 |                                                                                                                                                           | semapv:HumanCuration  |   2022-05-02 | orcid:0000-0002-7356-1779 |                        | http://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl |\n| KF_FOOD:F004 | braeburn      | skos:broadMatch | FOODON:00002473 | apple (whole)      |          1 |                                                                                                                                                           | semapv:HumanCuration  |   2022-05-02 | orcid:0000-0002-7356-1779 |                        | http://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl |\n\n**Mapping set metadata**. In this tutorial, only `mapping_set_id`, `mapping_set_version`, `license` and `mapping_set_description` are purely `mapping_set` metadata. Everything else is considered `mapping` metadata.\nMapping set metadata is captured in [YAML](https://yaml.org/) format. For this tutorial, we will capture the following:\n\n```\nmapping_set_id: https://w3id.org/sssom/tutorial/example1.sssom.tsv\nlicense: https://creativecommons.org/licenses/by/4.0/\nmapping_set_version: \"2022-06-01\"\nmapping_set_description: \"Manually curated alignment of KEWL FOODIE INC internal food and nutrition database with Food Ontology (FOODON). Intended to be used for ontological analysis and grouping of KEWL FOODIE INC related data.\"\nobject_source: wikidata:Q55118395\nsubject_source: KF_FOOD:DB\ncurie_map:\n  KF_FOOD: https://kewl-foodie.inc/food/\n  wikidata: http://www.wikidata.org/entity/\n  FOODON: http://purl.obolibrary.org/obo/FOODON_\n  semapv: https://w3id.org/semapv/vocab/\n  skos: \"http://www.w3.org/2004/02/skos/core#\"\n  sssom: https://w3id.org/sssom/\n```\n\nDespite `object_source` and `subject_source` being _mapping_ metadata, we decided to capture them at mapping set level, as they are not likely to change throughout versions of the mapping set. Note that while the `object_source` resolves to an actual page on the web ([FOODON](https://www.wikidata.org/wiki/Q55118395)), `KF_FOOD:DB` does not. SSSOM requires a source to correspond to an IRI (see ongoing [debate](https://github.com/mapping-commons/sssom/issues/126)). This helps to ensure that it is unambiguously clear what the source was. Imagine someone documenting the string `INTERNAL_DB` or just `DB` - even in large organisations, but certainly on the web, this can cause clashes.\n\nThe `curie_map` (better known as \"prefix map\") is another key concept in SSSOM (and most Semantic Web standards). It maps prefixes to URI expansions. This serves three main purposes.\n\n1. Unambiguously identify the namespace of a prefix. The prefix `FOODON:`, all by itself, can be used by many different sources. `http://purl.obolibrary.org/obo/FOODON_` uniquely identifies the namespace of `FOODON`. This is important when merging different mapping sets together.\n2. Expanding and resolving identifiers. Some identifier schemes like the one in the OBO Foundry, Wikidata and many others, resolve identifiers to a page on the web. This allows people (and sometimes machines) to look up additional information about an entity on the web. For example, when we expand FOODON:00002473 to http://purl.obolibrary.org/obo/FOODON_00002473, we can look this URI up in a browser.\n3. Providing a recipe for creating RDF resources from CURIEs. RDF requires an entity to be represented by a full URI, e.g. <http://purl.obolibrary.org/obo/FOODON_00002473>. In this case, you can think of the `curie_map` in essence as a set of RDF [prefix declarations](https://www.w3.org/TR/1999/REC-xml-names-19990114/#NT-Prefix). This is only important if your use case requires serialisation into RDF.\n\nThis concludes the manual curation tutorial. Next, we will process the two mapping sets using \"SSSOM python toolkit\" (aka sssom-py).\n\n<a id=\"automated1\"></a>\n### Automated processing 1: Creating an embedded SSSOM file\n\n*Important note May 8 2022**: The SSSOM toolkit have not yet been updated to the most recent changes of the SSSOM data model. If you get an error `ValueError: match_type must be supplied`, you have to update your local installation.\n\n#### Embedded vs external mode for SSSOM metadata\n\nOne problem with table formats like TSV or CSV, in contrast to more flexible tree shaped formats like JSON or XML, is that it is notoriously hard to include metadata about the whole table (for example, mapping **set** metadata) in them. There are essentially three options:\n\n1. All metadata is stored as values in columns. While this is definitely possible, it is not ideal for a few reasons:\n    1. It is highly redundant. If we have to store the `mapping_set_id`, for example, as a value in a mapping table with 1000 mappings, it is repeated 1000 times.\n    2. It is less immediately clear whether a piece of metadata pertains to the `mapping_set` or a `mapping` (you have to study the specification to understand that `author_id` pertains to an individual mapping rather than the whole mapping set).\n2. Metadata about the mapping set is stored within the TSV file header. Basically, we introduce a number of rows at the top of the TSV file that we reserve for metadata. The disadvantage is that many parsers for such flat files do not know how to deal with a header like this.\n3. We keep metadata about tables and mapping sets separate, i.e. we keep one TSV file that contains the data and one YAML file that contains the mapping set metadata. This is often a good option, but keeping the two separate may cause a problem: in environments where the data is shared around (emailed, copied) the connection can get lost.\n\nIn SSSOM, we opted for option 2 as the default, which we call \"embedded mode\" (the metadata is embedded). Most commands in the [SSSOM toolkit](https://github.com/mapping-commons/sssom-py) expect SSSOM files to be in embedded mode. However, we support option 3 (external mode) indirectly by providing operations to simply merge the two before other processing steps.\n\n#### Converting an SSSOM file from from external to embedded mode\n\nIf you do not have the SSSOM toolkit installed, [do so now](https://mapping-commons.github.io/sssom-py/installation.html).\n\nDownload the food mappings created before. If you feel confident with your own mappings, feel free to use these instead.\n\n- [Mappings](https://raw.githubusercontent.com/mapping-commons/sssom/master/examples/external/example1.sssom.tsv)\n- [Metadata](https://raw.githubusercontent.com/mapping-commons/sssom/master/examples/external/example1.sssom.yml)\n\nNow you let's use SSSOM toolkit to merge these two:\n\n```\nsssom parse example1.sssom.tsv -m example1.sssom.yml -o foodieinc-food.sssom.tsv\n```\n\nIf you open `foodieinc-food.sssom.tsv`, you will see:\n\n```\n# comment: We could map to FOODON:00004187 instead which more specifically refers to\n#   \"raw\" Pink apples. Decided against to be consistent with other mapping choices.\n# curie_map:\n#   FOODON: http://purl.obolibrary.org/obo/FOODON_\n#   KF_FOOD: https://kewl-foodie.inc/food/\n#   skos: http://www.w3.org/2004/02/skos/core#\n#   sssom: https://w3id.org/sssom/\n# license: https://creativecommons.org/licenses/by/4.0/\n# mapping_date: '2022-05-02'\n# mapping_set_description: Manually curated alignment of KEWL FOODIE INC internal food\n#   and nutrition database with Food Ontology (FOODON). Intended to be used for ontological\n#   analysis and grouping of KEWL FOODIE INC related data.\n# mapping_set_id: https://w3id.org/sssom/tutorial/example1.sssom.tsv\n# mapping_set_version: '2022-06-01'\n# object_source: wikidata:Q55118395\n# object_source_version: http://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl\n# subject_source: KF_FOOD:DB\nsubject_id\tsubject_label\tpredicate_id\tobject_id\tobject_label\tmapping_justification\tauthor_id\tobject_source_version\tmapping_date\tconfidence\tcomment\nKF_FOOD:F001\tapple\tskos:exactMatch\tFOODON:00002473\tapple (whole)\tsemapv:ManualMappingCuration\torcid:0000-0002-7356-1779\thttp://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl\t2022-05-02\t0.95\t\"We could map to FOODON:03310788 instead to cover sliced apples, but only \"\"whole\"\" apple types exist.\"\nKF_FOOD:F002\tgala\tskos:exactMatch\tFOODON:00003348\tGala apple (whole)\tsemapv:ManualMappingCuration\torcid:0000-0002-7356-1779\thttp://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl\t2022-05-02\t1.0\t\nKF_FOOD:F003\tpink\tskos:exactMatch\tFOODON:00004186\tPink apple (whole)\tsemapv:ManualMappingCuration\torcid:0000-0002-7356-1779\thttp://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl\t2022-05-02\t0.9\t\"We could map to FOODON:00004187 instead which more specifically refers to \"\"raw\"\" Pink apples. Decided against to be consistent with other mapping choices.\"\nKF_FOOD:F004\tbraeburn\tskos:exactMatch\tsssom:NoMapping\t\tsemapv:ManualMappingCuration\torcid:0000-0002-7356-1779\thttp://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl\t2022-05-02\t1.0\t\nKF_FOOD:F004\tbraeburn\tskos:broadMatch\tFOODON:00002473\tapple (whole)\tsemapv:ManualMappingCuration\torcid:0000-0002-7356-1779\thttp://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl\t2022-05-02\t1.0\t\n```\n\n#### Converting an SSSOM file to JSON\n\nWe will now convert the embedded SSSOM file we created before into JSON:\n\n```\nsssom convert foodieinc-food.sssom.tsv --output-format json -o foodieinc-food.sssom.json\n```\n\nWhile the JSON format is [not yet stable](https://github.com/mapping-commons/sssom/issues/102), it is close to completion.\n\n#### Diff between two versions\n\nThe last part of this tutorial concerns one of the main motivations of using a controlled metadata model for mappings: versioning. One key concern for data management, and mapping management in particular, is to be able under understand the evolution of mappings over time. While this command is not stable yet, we can use it to understand the difference between two mappings sets: `sssom diff`. Let us try to look at the difference between an old version of our foodie-inc mapping set and our new one:\n\n```\nsssom diff foodieinc-food.sssom.tsv ../embedded/foodie-inc-2022-05-01.sssom.tsv -o diff.sssom.tsv\n```\n\nThe outcome gives us the following information:\n\n| subject_id   | subject_label | predicate_id    | object_id       | object_label            | mapping_justification | author_id                 | object_source_version                                                | mapping_date | confidence | comment        |\n|--------------|---------------|-----------------|-----------------|-------------------------|--------------|---------------------------|----------------------------------------------------------------------|--------------|------------|----------------|\n| KF_FOOD:F003 | pink          | skos:exactMatch | FOODON:00004186 | Pink apple (whole)      | semapv:ManualMappingCuration | orcid:0000-0002-7356-1779 | http://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl | 2022-05-02   | 0.9        | UNIQUE_1       |\n| KF_FOOD:F003 | pink          | skos:exactMatch | FOODON:00004187 | Pink apple (whole, raw) | semapv:ManualMappingCuration | orcid:0000-0002-7356-1779 | http://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl | 2022-05-02   | 0.9        | UNIQUE_2       |\n| KF_FOOD:F002 | gala          | skos:exactMatch | FOODON:00003348 | Gala apple (whole)      | semapv:ManualMappingCuration | orcid:0000-0002-7356-1779 | http://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl | 2022-05-02   | 1.0        | COMMON_TO_BOTH |\n| KF_FOOD:F004 | braeburn      | skos:broadMatch | FOODON:00002473 | apple (whole)           | semapv:ManualMappingCuration | orcid:0000-0002-7356-1779 | http://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl | 2022-05-02   | 1.0        | COMMON_TO_BOTH |\n| KF_FOOD:F001 | apple         | skos:exactMatch | FOODON:00002473 | apple (whole)           | semapv:ManualMappingCuration | orcid:0000-0002-7356-1779 | http://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl | 2022-05-02   | 0.95       | COMMON_TO_BOTH |\n| KF_FOOD:F004 | braeburn      | skos:exactMatch | sssom:NoMapping |                         | semapv:ManualMappingCuration | orcid:0000-0002-7356-1779 | http://purl.obolibrary.org/obo/foodon/releases/2022-02-01/foodon.owl | 2022-05-02   | 1.0        | COMMON_TO_BOTH |\n\nThis can be used to understand that the first mapping is only present in the new mapping set, while the second mapping was present in the old mapping set - all the other ones are in common between the two.\n"
  },
  {
    "path": "src/docs/tutorials/omop-mappings.md",
    "content": "# How to gradually enrich OMOP mappings with SSSOM\n\nThis document is a guide for OMOP ETL developers to think about gradually improving the (documentation of the) strength of evidence for their vocabulary mappings.\n\n## Example table from OMOP\n\nGenerated manually with Athena on the 20th July 2023. The start and end dates are invented.\n\n| concept_id_1 | concept_id_2 | relationship_id | valid_start_date | valid_end_date | invalid_reason |\n|--------------|--------------|-----------------|------------------|----------------|----------------|\n| 44499396        | 4028717        | Maps to         | 19700101         | 20991231       |                |\n| 45586281        | 4028717        | Maps to         | 73754         | 20991231       |                |\n\n## Level 1, basic mapping table, basic provenance\n\nThe SSSOM metadata provided is conceptually correct, but fictitious. \n\nThe reader should imagine this being provided as a separate CONCEPT_MAPPINGS.CSV table that can be joined on `subject_id`->`concept_id_1`, `object_id`->`concept_id_2` for all rows with a `Maps to` `relationship_id` (this is assuming that the `concept_id_1`,`concept_id_2` tuple is unique for `Maps to`).\n\n| subject_id | object_id | predicate_id | mapping_provider | mapping_tool | mapping_tool_version | mapping_justification | reviewer_id | author_id |\n|---|---|---|---|---|---|---|---|---|\n| OMOP:44499396 | OMOP:4028717 | omoprel:mapsTo | OHDSI:Odysseus | | | semapv:ManualMappingCuration | | ORCID:0000-0003-4147-1485 |\n| OMOP:45586281 | OMOP:4028717 | omoprel:mapsTo | OHDSI:Odysseus | OHDSI_TOOLS:Usagi | 1.4.3 | semapv:LexicalMatching | ORCID:0000-0003-4147-1485 |\n| OMOP:45610575 | OMOP:441554 | omoprel:mapsTo | OHDSI:UMLS | | | semapv:UnspecifiedMatching | | |\n\nWhat we see here:\n\n1. all identifiers are prefixed to make sure they are interpreted correctly when they are reused. This includes OMOP ids (e.g. `OMOP:44499396`) as well as ORCIDs (OPTIONAL)\n1. \"Maps to\" is encoded using a proper identifier rather than a string (OPTIONAL)\n1. All three mappings have a `mapping_justification` to distinguish for example if the mapping was determined by human manual curation (`semapv:ManualMappingCuration`) or lexical matching (`semapv:LexicalMatching`). Many other justifications exist and/or can be created. If the justification for the mapping is unknown, we can make our lack of knowledge transparent by using `semapv:UnspecifiedMatching`.\n1. `author_id`, in the case of `semapv:ManualMappingCuration`, tells us who the person is that determined the mapping. This is basic provenance. If the identity of the author can be connected with a public record such as ORCID, this can help mapping users to increase trust in a mapping. `reviewer_id` tells us that some human looked at the mapping after it was proposed by a tool, and \"signed off\" on it. This can be valuable, again, to increase trust. `review_date` can also be given to add context to the review.\n1. If the match was generated by the tool, some basic provenance is added (`mapping_tool`, `mapping_tool_version`).\n\n## Level 2: Curate semantic mapping predicate\n\n| subject_id    | object_id    | predicate_id    | mapping_provider | mapping_tool      | mapping_tool_version | mapping_justification          | reviewer_id               | review_date | author_id                 |\n|---------------|--------------|-----------------|------------------|-------------------|----------------------|--------------------------------|---------------------------|-------------|---------------------------|\n| OMOP:44499396 | OMOP:4028717 | skos:broadMatch | OHDSI:Odysseus   |                   |                      | semapv:ManualMappingCuration   |                           |             | ORCID:0000-0003-4147-1485 |\n| OMOP:45586281 | OMOP:4028717 | skos:exactMatch | OHDSI:Odysseus   | OHDSI_TOOLS:Usagi | 1.4.3                | semapv:LexicalMatching         | ORCID:0000-0003-4147-1485 | 2021-01-01  |                           |\n| OMOP:45610575 | OMOP:441554  | skos:exactMatch | OHDSI:UMLS       |                   |                      | semapv:UnspecifiedMatching     |                           |             |                           | \n\nWhat do we see here?\n\n1. Rather than `Maps to`, the mapping predicate (e.g. `skos:exactMatch`) is a semantic mapping predicate from a standardised vocabulary ([SKOS](https://www.w3.org/TR/skos-reference)). Here, we distinguish between `skos:exactMatch` and `skos:broadMatch`, but there are other predicates, see for example in the [Semantic Mapping Vocabulary](https://github.com/mapping-commons/semantic-mapping-vocabulary/blob/main/semapv-properties.tsv).\n\n## Level 3: Document confidence widely\n\n`confidence` is an incredibly useful metric for downstream users, including ETL engineers and data analysts. In an ideal world, all mappings have some kind of `confidence` associated with them. `confidence` scores should be read as \"the strength of evidence provided in this record/table row (i.e mapping justification) leads us to believe the mapping (e.g. `OMOP:44499396 --[skos:broadMatch]--> OMOP:4028717`) is correct with 90% confidence.\n\n| subject_id | object_id | predicate_id | mapping_provider | mapping_tool | mapping_tool_version | mapping_justification | reviewer_id | author_id | confidence |\n|---|---|---|---|---|---|---|---|---|---|\n| OMOP:44499396 | OMOP:4028717 | skos:broadMatch | OHDSI:Odysseus | | | semapv:ManualMappingCuration | | ORCID:0000-0003-4147-1485 | 0.9 |\n| OMOP:45586281 | OMOP:4028717 | skos:exactMatch | OHDSI:Odysseus | OHDSI_TOOLS:Usagi | 1.4.3 | semapv:LexicalMatching | ORCID:0000-0003-4147-1485 | 0.8 |\n| OMOP:45610575 | OMOP:441554 | skos:exactMatch | OHDSI:UMLS | | | semapv:UnspecifiedMatching | | | 0.6 |\n\nWhat do we see here?\n\n- For matching tools, confidence can be calculated by proxies such as \"lexical similarity\", \"edit distance\", \"cosine similarity of node embedding\" and other metrics. In the example above, Usagi has determined that the subject and objects match, but it was only 80% sure (we dont know why - this is [more advanced SSSOM](../mapping-justifications.md))\n- For case where an external mapping is reused using ETL, `confidence` describes the level of trust you as an ETL expert have in the fidelty of the mapping provided by the source.\n\n## Level 4: Document curation rules\n\n| subject_id | object_id | predicate_id | mapping_provider | mapping_tool | mapping_tool_version | mapping_justification | reviewer_id | author_id | confidence | curation_rule |\n|---|---|---|---|---|---|---|---|---|---|---|\n| OMOP:44499396 | OMOP:4028717 | skos:broadMatch | OHDSI:Odysseus | | | semapv:ManualMappingCuration | | ORCID:0000-0003-4147-1485 | 0.9 | OHDSI_CURATION_RULE:19 |\n\nWhat do we see here?\n\n- For manual matches, it is often unclear by what criteria a match was established. Documenting the curation rules can help increasing consistency for manual curation, and transparency for downstream users.\n- `OHDSI_CURATION_RULE:19` is a rule defined by your own curation rulebook. This can be _anything_. For example `OHDSI_CURATION_RULE:19` could correspond to the following rule: \n```\nOHDSI_CURATION_RULE:19 = If the subject concept does not have an exact match in the object source vocabulary, we select the nearest broad (\"up-hill\") concept applicable. Conceptually, if both terms would exist in the same terminology, the subject concept can be defined as a subconcept of the object concept. The determination for both criteria (nearest broad, conceptally subconcept) is performed through medical expert judgement.\n```\n"
  },
  {
    "path": "src/docs/usecases.md",
    "content": "# Use cases and case studies\n\n## Mondo disease mappings\n\n- [Mondo mappings](https://github.com/monarch-initiative/mondo/tree/master/src/ontology/mappings)\n\n## The National Microbiome Data Collaborative (NMDC, https://microbiomedata.org/):\n\n- [Various data model mappings](https://github.com/microbiomedata/nmdc-schema/tree/main/sssom), e.g. MIXS, GOLD, etc\n\n## CCDH (mapping clinical data models, ontologies and value sets)\n\n- https://harmonization.datacommons.cancer.gov/ccdh-resources\n- SNOMED-NCIT [example](https://docs.google.com/spreadsheets/d/18luA05E9wLukOFamsRV3FWVnoCr57o8qAHe-aGYrPr8/edit#gid=509055704)\n\n## Cross-species mapping efforts\n\n- [mouse-human mapping commons](https://github.com/mapping-commons/mh_mapping_initiative)\n\n## Microbial traits\n\n- https://github.com/mapping-commons/microbial-trait-mappings\n\n## Biomappings\n\n- https://github.com/biomappings/biomappings/tree/master/docs/_data/sssom\n- Decentralized curation of mappings, especially ones that aren't incident to ontology terms\n\n## Clinical mappings\n\n[Gdocs](https://docs.google.com/document/d/1p7MVn0UGro6SMgnCfi70BOYgrDRoNkEjpXXAl8_hYXw/edit) for discussion.\n"
  },
  {
    "path": "src/docs/workshops.md",
    "content": "# Workshops\n\n## Mapping Commons Workshop Series\n\nWikidata: https://www.wikidata.org/wiki/Q108394475\n\n- [1st Mapping Commons Workshop on Simple Standard for Sharing Ontology Mappings](events/mc2021.md)\n- [2nd Mapping Commons Workshop on Simple Standard for Sharing Ontology Mappings](events/mc2023.md)\n"
  },
  {
    "path": "src/sssom_schema/__init__.py",
    "content": "from .datamodel.sssom_schema import *"
  },
  {
    "path": "src/sssom_schema/context/sssom_schema.context.jsonld",
    "content": "{\n   \"@context\": {\n      \"xsd\": \"http://www.w3.org/2001/XMLSchema#\",\n      \"dcterms\": \"http://purl.org/dc/terms/\",\n      \"linkml\": \"https://w3id.org/linkml/\",\n      \"oboInOwl\": \"http://www.geneontology.org/formats/oboInOwl#\",\n      \"owl\": \"http://www.w3.org/2002/07/owl#\",\n      \"pav\": \"http://purl.org/pav/\",\n      \"prov\": \"http://www.w3.org/ns/prov#\",\n      \"rdf\": \"http://www.w3.org/1999/02/22-rdf-syntax-ns#\",\n      \"rdfs\": \"http://www.w3.org/2000/01/rdf-schema#\",\n      \"semapv\": \"https://w3id.org/semapv/vocab/\",\n      \"skos\": \"http://www.w3.org/2004/02/skos/core#\",\n      \"sssom\": \"https://w3id.org/sssom/\",\n      \"@vocab\": \"https://w3id.org/sssom/\",\n      \"author_id\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"pav:authoredBy\"\n      },\n      \"author_label\": {\n         \"@id\": \"author_label\"\n      },\n      \"cardinality_scope\": {\n         \"@id\": \"cardinality_scope\"\n      },\n      \"comment\": {\n         \"@id\": \"rdfs:comment\"\n      },\n      \"confidence\": {\n         \"@type\": \"xsd:double\",\n         \"@id\": \"confidence\"\n      },\n      \"creator_id\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"dcterms:creator\"\n      },\n      \"creator_label\": {\n         \"@id\": \"creator_label\"\n      },\n      \"curation_rule\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"curation_rule\"\n      },\n      \"curation_rule_text\": {\n         \"@id\": \"curation_rule_text\"\n      },\n      \"curie_map\": {\n         \"@type\": \"@id\",\n         \"@id\": \"curie_map\"\n      },\n      \"documentation\": {\n         \"@type\": \"xsd:anyURI\",\n         \"@id\": \"documentation\"\n      },\n      \"extension_definitions\": {\n         \"@type\": \"@id\",\n         \"@id\": \"extension_definitions\"\n      },\n      \"property\": {\n         \"@type\": \"xsd:anyURI\",\n         \"@id\": \"property\"\n      },\n      \"slot_name\": {\n         \"@id\": \"slot_name\"\n      },\n      \"type_hint\": {\n         \"@type\": \"xsd:anyURI\",\n         \"@id\": \"type_hint\"\n      },\n      \"homepage\": {\n         \"@type\": \"xsd:anyURI\",\n         \"@id\": \"homepage\"\n      },\n      \"imports\": {\n         \"@type\": \"xsd:anyURI\",\n         \"@id\": \"imports\"\n      },\n      \"issue_tracker\": {\n         \"@type\": \"xsd:anyURI\",\n         \"@id\": \"issue_tracker\"\n      },\n      \"issue_tracker_item\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"issue_tracker_item\"\n      },\n      \"last_updated\": {\n         \"@type\": \"xsd:date\",\n         \"@id\": \"last_updated\"\n      },\n      \"license\": {\n         \"@type\": \"xsd:anyURI\",\n         \"@id\": \"dcterms:license\"\n      },\n      \"local_name\": {\n         \"@id\": \"local_name\"\n      },\n      \"mapping_cardinality\": {\n         \"@context\": {\n            \"text\": \"skos:notation\",\n            \"description\": \"skos:prefLabel\",\n            \"meaning\": \"@id\"\n         },\n         \"@id\": \"mapping_cardinality\"\n      },\n      \"mapping_date\": {\n         \"@type\": \"xsd:date\",\n         \"@id\": \"dcterms:created\"\n      },\n      \"mapping_justification\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"mapping_justification\"\n      },\n      \"mapping_provider\": {\n         \"@type\": \"xsd:anyURI\",\n         \"@id\": \"mapping_provider\"\n      },\n      \"mapping_registry_description\": {\n         \"@id\": \"mapping_registry_description\"\n      },\n      \"mapping_registry_id\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"mapping_registry_id\"\n      },\n      \"mapping_registry_title\": {\n         \"@id\": \"mapping_registry_title\"\n      },\n      \"mapping_set_confidence\": {\n         \"@type\": \"xsd:double\",\n         \"@id\": \"mapping_set_confidence\"\n      },\n      \"mapping_set_description\": {\n         \"@id\": \"dcterms:description\"\n      },\n      \"mapping_set_group\": {\n         \"@id\": \"mapping_set_group\"\n      },\n      \"mapping_set_id\": {\n         \"@type\": \"xsd:anyURI\",\n         \"@id\": \"mapping_set_id\"\n      },\n      \"mapping_set_references\": {\n         \"@type\": \"@id\",\n         \"@id\": \"mapping_set_references\"\n      },\n      \"mapping_set_source\": {\n         \"@type\": \"xsd:anyURI\",\n         \"@id\": \"prov:wasDerivedFrom\"\n      },\n      \"mapping_set_title\": {\n         \"@id\": \"dcterms:title\"\n      },\n      \"mapping_set_version\": {\n         \"@id\": \"owl:versionInfo\"\n      },\n      \"mapping_source\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"mapping_source\"\n      },\n      \"mapping_tool\": {\n         \"@id\": \"mapping_tool\"\n      },\n      \"mapping_tool_id\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"mapping_tool_id\"\n      },\n      \"mapping_tool_version\": {\n         \"@id\": \"mapping_tool_version\"\n      },\n      \"mappings\": {\n         \"@type\": \"@id\",\n         \"@id\": \"mappings\"\n      },\n      \"match_string\": {\n         \"@id\": \"match_string\"\n      },\n      \"mirror_from\": {\n         \"@type\": \"xsd:anyURI\",\n         \"@id\": \"mirror_from\"\n      },\n      \"object_category\": {\n         \"@id\": \"object_category\"\n      },\n      \"object_id\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"owl:annotatedTarget\"\n      },\n      \"object_label\": {\n         \"@id\": \"object_label\"\n      },\n      \"object_match_field\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"object_match_field\"\n      },\n      \"object_preprocessing\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"object_preprocessing\"\n      },\n      \"object_source\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"object_source\"\n      },\n      \"object_source_version\": {\n         \"@id\": \"object_source_version\"\n      },\n      \"object_type\": {\n         \"@context\": {\n            \"text\": \"skos:notation\",\n            \"description\": \"skos:prefLabel\",\n            \"meaning\": \"@id\"\n         },\n         \"@id\": \"object_type\"\n      },\n      \"other\": {\n         \"@id\": \"other\"\n      },\n      \"predicate_id\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"owl:annotatedProperty\"\n      },\n      \"predicate_label\": {\n         \"@id\": \"predicate_label\"\n      },\n      \"predicate_modifier\": {\n         \"@context\": {\n            \"text\": \"skos:notation\",\n            \"description\": \"skos:prefLabel\",\n            \"meaning\": \"@id\"\n         },\n         \"@id\": \"predicate_modifier\"\n      },\n      \"predicate_type\": {\n         \"@context\": {\n            \"text\": \"skos:notation\",\n            \"description\": \"skos:prefLabel\",\n            \"meaning\": \"@id\"\n         },\n         \"@id\": \"predicate_type\"\n      },\n      \"prefix_name\": {\n         \"@id\": \"prefix_name\"\n      },\n      \"prefix_url\": {\n         \"@type\": \"xsd:anyURI\",\n         \"@id\": \"prefix_url\"\n      },\n      \"propagated\": {\n         \"@type\": \"xsd:boolean\",\n         \"@id\": \"propagated\"\n      },\n      \"publication_date\": {\n         \"@type\": \"xsd:date\",\n         \"@id\": \"dcterms:issued\"\n      },\n      \"record_id\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"record_id\"\n      },\n      \"registry_confidence\": {\n         \"@type\": \"xsd:double\",\n         \"@id\": \"registry_confidence\"\n      },\n      \"review_date\": {\n         \"@type\": \"xsd:date\",\n         \"@id\": \"review_date\"\n      },\n      \"reviewer_agreement\": {\n         \"@type\": \"xsd:double\",\n         \"@id\": \"reviewer_agreement\"\n      },\n      \"reviewer_id\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"reviewer_id\"\n      },\n      \"reviewer_label\": {\n         \"@id\": \"reviewer_label\"\n      },\n      \"see_also\": {\n         \"@type\": \"xsd:anyURI\",\n         \"@id\": \"rdfs:seeAlso\"\n      },\n      \"similarity_measure\": {\n         \"@id\": \"similarity_measure\"\n      },\n      \"similarity_score\": {\n         \"@type\": \"xsd:double\",\n         \"@id\": \"similarity_score\"\n      },\n      \"sssom_version\": {\n         \"@context\": {\n            \"text\": \"skos:notation\",\n            \"description\": \"skos:prefLabel\",\n            \"meaning\": \"@id\"\n         },\n         \"@id\": \"sssom_version\"\n      },\n      \"subject_category\": {\n         \"@id\": \"subject_category\"\n      },\n      \"subject_id\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"owl:annotatedSource\"\n      },\n      \"subject_label\": {\n         \"@id\": \"subject_label\"\n      },\n      \"subject_match_field\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"subject_match_field\"\n      },\n      \"subject_preprocessing\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"subject_preprocessing\"\n      },\n      \"subject_source\": {\n         \"@type\": \"rdfs:Resource\",\n         \"@id\": \"subject_source\"\n      },\n      \"subject_source_version\": {\n         \"@id\": \"subject_source_version\"\n      },\n      \"subject_type\": {\n         \"@context\": {\n            \"text\": \"skos:notation\",\n            \"description\": \"skos:prefLabel\",\n            \"meaning\": \"@id\"\n         },\n         \"@id\": \"subject_type\"\n      },\n      \"added_in\": {\n         \"@context\": {\n            \"text\": \"skos:notation\",\n            \"description\": \"skos:prefLabel\",\n            \"meaning\": \"@id\"\n         },\n         \"@id\": \"added_in\"\n      },\n      \"ExtensionDefinition\": {\n         \"@id\": \"ExtensionDefinition\"\n      },\n      \"Mapping\": {\n         \"@id\": \"owl:Axiom\"\n      },\n      \"MappingRegistry\": {\n         \"@id\": \"MappingRegistry\"\n      },\n      \"MappingSet\": {\n         \"@id\": \"MappingSet\"\n      },\n      \"MappingSetReference\": {\n         \"@id\": \"MappingSetReference\"\n      },\n      \"NoTermFound\": {\n         \"@id\": \"NoTermFound\"\n      },\n      \"Prefix\": {\n         \"@id\": \"Prefix\"\n      },\n      \"Propagatable\": {\n         \"@id\": \"Propagatable\"\n      },\n      \"Versionable\": {\n         \"@id\": \"Versionable\"\n      }\n   }\n}\n"
  },
  {
    "path": "src/sssom_schema/context/sssom_schema.jsonld",
    "content": "{\n  \"name\": \"sssom\",\n  \"description\": \"Datamodel for Simple Standard for Sharing Ontological Mappings (SSSOM)\",\n  \"see_also\": [\n    \"https://github.com/mapping-commons/sssom\",\n    \"https://mapping-commons.github.io/sssom/home/\"\n  ],\n  \"id\": \"https://w3id.org/sssom/schema/\",\n  \"imports\": [\n    \"linkml:types\"\n  ],\n  \"license\": \"https://creativecommons.org/publicdomain/zero/1.0/\",\n  \"prefixes\": [\n    {\n      \"prefix_prefix\": \"dcterms\",\n      \"prefix_reference\": \"http://purl.org/dc/terms/\"\n    },\n    {\n      \"prefix_prefix\": \"linkml\",\n      \"prefix_reference\": \"https://w3id.org/linkml/\"\n    },\n    {\n      \"prefix_prefix\": \"sssom\",\n      \"prefix_reference\": \"https://w3id.org/sssom/\"\n    },\n    {\n      \"prefix_prefix\": \"rdfs\",\n      \"prefix_reference\": \"http://www.w3.org/2000/01/rdf-schema#\"\n    },\n    {\n      \"prefix_prefix\": \"rdf\",\n      \"prefix_reference\": \"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n    },\n    {\n      \"prefix_prefix\": \"oboInOwl\",\n      \"prefix_reference\": \"http://www.geneontology.org/formats/oboInOwl#\"\n    },\n    {\n      \"prefix_prefix\": \"pav\",\n      \"prefix_reference\": \"http://purl.org/pav/\"\n    },\n    {\n      \"prefix_prefix\": \"prov\",\n      \"prefix_reference\": \"http://www.w3.org/ns/prov#\"\n    },\n    {\n      \"prefix_prefix\": \"skos\",\n      \"prefix_reference\": \"http://www.w3.org/2004/02/skos/core#\"\n    },\n    {\n      \"prefix_prefix\": \"xsd\",\n      \"prefix_reference\": \"http://www.w3.org/2001/XMLSchema#\"\n    },\n    {\n      \"prefix_prefix\": \"semapv\",\n      \"prefix_reference\": \"https://w3id.org/semapv/vocab/\"\n    }\n  ],\n  \"default_curi_maps\": [\n    \"semweb_context\",\n    \"obo_context\"\n  ],\n  \"default_prefix\": \"sssom\",\n  \"default_range\": \"string\",\n  \"types\": [\n    {\n      \"name\": \"EntityReference\",\n      \"definition_uri\": \"https://w3id.org/sssom/EntityReference\",\n      \"description\": \"A reference to an entity involved in the mapping.\\n\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://mapping-commons.github.io/sssom/spec/#tsv\"\n      ],\n      \"typeof\": \"uriorcurie\",\n      \"base\": \"str\",\n      \"uri\": \"http://www.w3.org/2000/01/rdf-schema#Resource\",\n      \"repr\": \"str\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"NonRelativeURI\",\n      \"definition_uri\": \"https://w3id.org/sssom/NonRelativeURI\",\n      \"description\": \"A URI as per RFC 3986, that is a string that matches the production of the \\\"URI\\\" rule defined in Appendix A of that RFC. Contrary to the underlying LinkML type, this specifically excludes _relative URI references_, which do not start with a scheme component. Relative URI references are forbidden because SSSOM has no built-in mechanism to provide the base URI that would be needed to resolve relative URI references into non-relative ones.\",\n      \"examples\": [\n        {\n          \"value\": \"https://example.org/path/to/file.txt#L4\",\n          \"description\": \"A URI that is URL to a HTTP resource.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"urn:oasis:names:tc:entity:xmlns:xml:catalog\",\n          \"description\": \"A URI that is the URN of the namespace for the OASIS XML Catalogs specification.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"ldap://example.org/cn=Alice,dc=example,dc=org?mail\",\n          \"description\": \"A URI that is a LDAP query URL.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"mailto:alice@example.org\",\n          \"description\": \"A URI that is an email address.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"file.txt\",\n          \"description\": \"An _invalid_ example, as it a relative URI (path only, no scheme).\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"/path/to/file.txt\",\n          \"description\": \"An _invalid_ example; though it appears to be an _absolute path_, it is a _relative URI_ because of the absence of a scheme.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"//example.org/path/to/file.txt\",\n          \"description\": \"An _invalid_ example; though it includes an authority component (example.org), it has no scheme and is therefore a _relative URI_.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/448\"\n      ],\n      \"typeof\": \"uri\",\n      \"base\": \"URI\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#anyURI\",\n      \"repr\": \"str\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"string\",\n      \"definition_uri\": \"https://w3id.org/linkml/String\",\n      \"description\": \"A character string\",\n      \"notes\": [\n        \"In RDF serializations, a slot with range of string is treated as a literal or type xsd:string.   If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"string\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"exact_mappings\": [\n        \"schema:Text\"\n      ],\n      \"base\": \"str\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#string\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"integer\",\n      \"definition_uri\": \"https://w3id.org/linkml/Integer\",\n      \"description\": \"An integer\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"integer\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"exact_mappings\": [\n        \"schema:Integer\"\n      ],\n      \"base\": \"int\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#integer\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"boolean\",\n      \"definition_uri\": \"https://w3id.org/linkml/Boolean\",\n      \"description\": \"A binary (true or false) value\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"boolean\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"exact_mappings\": [\n        \"schema:Boolean\"\n      ],\n      \"base\": \"Bool\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#boolean\",\n      \"repr\": \"bool\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"float\",\n      \"definition_uri\": \"https://w3id.org/linkml/Float\",\n      \"description\": \"A real number that conforms to the xsd:float specification\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"float\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"exact_mappings\": [\n        \"schema:Float\"\n      ],\n      \"base\": \"float\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#float\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"double\",\n      \"definition_uri\": \"https://w3id.org/linkml/Double\",\n      \"description\": \"A real number that conforms to the xsd:double specification\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"double\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"close_mappings\": [\n        \"schema:Float\"\n      ],\n      \"base\": \"float\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#double\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"decimal\",\n      \"definition_uri\": \"https://w3id.org/linkml/Decimal\",\n      \"description\": \"A real number with arbitrary precision that conforms to the xsd:decimal specification\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"decimal\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"broad_mappings\": [\n        \"schema:Number\"\n      ],\n      \"base\": \"Decimal\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#decimal\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"time\",\n      \"definition_uri\": \"https://w3id.org/linkml/Time\",\n      \"description\": \"A time object represents a (local) time of day, independent of any particular day\",\n      \"notes\": [\n        \"URI is dateTime because OWL reasoners do not work with straight date or time\",\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"time\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"exact_mappings\": [\n        \"schema:Time\"\n      ],\n      \"base\": \"XSDTime\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#time\",\n      \"repr\": \"str\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"date\",\n      \"definition_uri\": \"https://w3id.org/linkml/Date\",\n      \"description\": \"a date (year, month and day) in an idealized calendar\",\n      \"notes\": [\n        \"URI is dateTime because OWL reasoners don't work with straight date or time\",\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"date\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"exact_mappings\": [\n        \"schema:Date\"\n      ],\n      \"base\": \"XSDDate\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#date\",\n      \"repr\": \"str\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"datetime\",\n      \"definition_uri\": \"https://w3id.org/linkml/Datetime\",\n      \"description\": \"The combination of a date and time\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"datetime\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"exact_mappings\": [\n        \"schema:DateTime\"\n      ],\n      \"base\": \"XSDDateTime\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#dateTime\",\n      \"repr\": \"str\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"date_or_datetime\",\n      \"definition_uri\": \"https://w3id.org/linkml/DateOrDatetime\",\n      \"description\": \"Either a date or a datetime\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"date_or_datetime\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"base\": \"str\",\n      \"uri\": \"https://w3id.org/linkml/DateOrDatetime\",\n      \"repr\": \"str\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"uriorcurie\",\n      \"definition_uri\": \"https://w3id.org/linkml/Uriorcurie\",\n      \"description\": \"a URI or a CURIE\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"uriorcurie\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"base\": \"URIorCURIE\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#anyURI\",\n      \"repr\": \"str\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"curie\",\n      \"definition_uri\": \"https://w3id.org/linkml/Curie\",\n      \"conforms_to\": \"https://www.w3.org/TR/curie/\",\n      \"description\": \"a compact URI\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"curie\\\".\"\n      ],\n      \"comments\": [\n        \"in RDF serializations this MUST be expanded to a URI\",\n        \"in non-RDF serializations MAY be serialized as the compact representation\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"base\": \"Curie\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#string\",\n      \"repr\": \"str\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"uri\",\n      \"definition_uri\": \"https://w3id.org/linkml/Uri\",\n      \"conforms_to\": \"https://www.ietf.org/rfc/rfc3987.txt\",\n      \"description\": \"a complete URI\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"uri\\\".\"\n      ],\n      \"comments\": [\n        \"in RDF serializations a slot with range of uri is treated as a literal or type xsd:anyURI unless it is an identifier or a reference to an identifier, in which case it is translated directly to a node\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"close_mappings\": [\n        \"schema:URL\"\n      ],\n      \"base\": \"URI\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#anyURI\",\n      \"repr\": \"str\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"ncname\",\n      \"definition_uri\": \"https://w3id.org/linkml/Ncname\",\n      \"description\": \"Prefix part of CURIE\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"ncname\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"base\": \"NCName\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#string\",\n      \"repr\": \"str\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"objectidentifier\",\n      \"definition_uri\": \"https://w3id.org/linkml/Objectidentifier\",\n      \"description\": \"A URI or CURIE that represents an object in the model.\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"objectidentifier\\\".\"\n      ],\n      \"comments\": [\n        \"Used for inheritance and type checking\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"base\": \"ElementIdentifier\",\n      \"uri\": \"http://www.w3.org/ns/shex#iri\",\n      \"repr\": \"str\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"nodeidentifier\",\n      \"definition_uri\": \"https://w3id.org/linkml/Nodeidentifier\",\n      \"description\": \"A URI, CURIE or BNODE that represents a node in a model.\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"nodeidentifier\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"base\": \"NodeIdentifier\",\n      \"uri\": \"http://www.w3.org/ns/shex#nonLiteral\",\n      \"repr\": \"str\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"jsonpointer\",\n      \"definition_uri\": \"https://w3id.org/linkml/Jsonpointer\",\n      \"conforms_to\": \"https://datatracker.ietf.org/doc/html/rfc6901\",\n      \"description\": \"A string encoding a JSON Pointer. The value of the string MUST conform to JSON Point syntax and SHOULD dereference to a valid object within the current instance document when encoded in tree form.\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"jsonpointer\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"base\": \"str\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#string\",\n      \"repr\": \"str\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"jsonpath\",\n      \"definition_uri\": \"https://w3id.org/linkml/Jsonpath\",\n      \"conforms_to\": \"https://www.ietf.org/archive/id/draft-goessner-dispatch-jsonpath-00.html\",\n      \"description\": \"A string encoding a JSON Path. The value of the string MUST conform to JSON Point syntax and SHOULD dereference to zero or more valid objects within the current instance document when encoded in tree form.\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"jsonpath\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"base\": \"str\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#string\",\n      \"repr\": \"str\",\n      \"@type\": \"TypeDefinition\"\n    },\n    {\n      \"name\": \"sparqlpath\",\n      \"definition_uri\": \"https://w3id.org/linkml/Sparqlpath\",\n      \"conforms_to\": \"https://www.w3.org/TR/sparql11-query/#propertypaths\",\n      \"description\": \"A string encoding a SPARQL Property Path. The value of the string MUST conform to SPARQL syntax and SHOULD dereference to zero or more valid objects within the current instance document when encoded as RDF.\",\n      \"notes\": [\n        \"If you are authoring schemas in LinkML YAML, the type is referenced with the lower case \\\"sparqlpath\\\".\"\n      ],\n      \"from_schema\": \"https://w3id.org/linkml/types\",\n      \"imported_from\": \"linkml:types\",\n      \"base\": \"str\",\n      \"uri\": \"http://www.w3.org/2001/XMLSchema#string\",\n      \"repr\": \"str\",\n      \"@type\": \"TypeDefinition\"\n    }\n  ],\n  \"enums\": [\n    {\n      \"name\": \"sssom_version_enum\",\n      \"definition_uri\": \"https://w3id.org/sssom/SssomVersionEnum\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"permissible_values\": [\n        {\n          \"text\": \"1.0\",\n          \"description\": \"SSSOM specification version 1.0\",\n          \"meaning\": \"sssom:version1.0\"\n        },\n        {\n          \"text\": \"1.1\",\n          \"description\": \"SSSOM specification version 1.1\",\n          \"meaning\": \"sssom:version1.1\"\n        }\n      ]\n    },\n    {\n      \"name\": \"entity_type_enum\",\n      \"definition_uri\": \"https://w3id.org/sssom/EntityTypeEnum\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"permissible_values\": [\n        {\n          \"text\": \"owl class\",\n          \"meaning\": \"owl:Class\"\n        },\n        {\n          \"text\": \"owl object property\",\n          \"meaning\": \"owl:ObjectProperty\"\n        },\n        {\n          \"text\": \"owl data property\",\n          \"meaning\": \"owl:DataProperty\"\n        },\n        {\n          \"text\": \"owl annotation property\",\n          \"meaning\": \"owl:AnnotationProperty\"\n        },\n        {\n          \"text\": \"owl named individual\",\n          \"meaning\": \"owl:NamedIndividual\"\n        },\n        {\n          \"text\": \"skos concept\",\n          \"meaning\": \"skos:Concept\"\n        },\n        {\n          \"text\": \"rdfs resource\",\n          \"meaning\": \"rdfs:Resource\"\n        },\n        {\n          \"text\": \"rdfs class\",\n          \"meaning\": \"rdfs:Class\"\n        },\n        {\n          \"text\": \"rdfs literal\",\n          \"description\": \"This value indicates that the entity being mapped is not a semantic entity with a distinct identifier, but is instead represented entirely by its literal label. This value MUST NOT be used in the predicate_type slot.\",\n          \"meaning\": \"rdfs:Literal\",\n          \"see_also\": [\n            \"https://mapping-commons.github.io/sssom/spec-model/#literal-mappings\",\n            \"https://github.com/mapping-commons/sssom/issues/234\",\n            \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/literals.sssom.tsv\"\n          ]\n        },\n        {\n          \"text\": \"rdfs datatype\",\n          \"meaning\": \"rdfs:Datatype\"\n        },\n        {\n          \"text\": \"rdf property\",\n          \"meaning\": \"rdf:Property\"\n        },\n        {\n          \"text\": \"composed entity expression\",\n          \"description\": \"This value indicates that the entity ID does not represent a single entity, but a composite involving several individual entities. This value MUST NOT be used in the predicate_type slot. This specifications does not prescribe how an ID representing a composite entity should be interpreted; this is left at the discretion of applications.\",\n          \"meaning\": \"sssom:ComposedEntityExpression\",\n          \"see_also\": [\n            \"https://github.com/mapping-commons/sssom/issues/402\",\n            \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/composite-entities.sssom.tsv\"\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"predicate_modifier_enum\",\n      \"definition_uri\": \"https://w3id.org/sssom/PredicateModifierEnum\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"permissible_values\": [\n        {\n          \"text\": \"Not\",\n          \"description\": \"Negating the mapping predicate. The meaning of the triple becomes subject_id is not a predicate_id match to object_id.\",\n          \"meaning\": \"sssom:NegatedPredicate\"\n        }\n      ]\n    },\n    {\n      \"name\": \"mapping_cardinality_enum\",\n      \"definition_uri\": \"https://w3id.org/sssom/MappingCardinalityEnum\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"permissible_values\": [\n        {\n          \"text\": \"1:1\",\n          \"description\": \"Indicates the mapping record is about a one-to-one mapping, that is, the subject and the object are only mapped to each other, exclusive of any other subject or object.\"\n        },\n        {\n          \"text\": \"1:n\",\n          \"description\": \"Indicates the mapping record is about a one-to-many mapping, that is, the same subject is mapped to several different objects.\"\n        },\n        {\n          \"text\": \"n:1\",\n          \"description\": \"Indicates the mapping record is about a many-to-one mapping, that is, several different subjects are mapped to the same object.\"\n        },\n        {\n          \"text\": \"n:n\",\n          \"description\": \"Indicates the mapping record is about a many-to-many mapping, that is, the subject is mapped to several different objects and the object is mapped to several different subjects.\"\n        },\n        {\n          \"text\": \"1:0\",\n          \"description\": \"Indicates that the subject has no match in the object vocabulary. This value MUST only be used when the object_id is sssom:NoTermFound.\"\n        },\n        {\n          \"text\": \"0:1\",\n          \"description\": \"Indicates that the object has no match in the subject vocabulary. This value MUST only be used when the subject_id is sssom:NoTermFound.\"\n        },\n        {\n          \"text\": \"0:0\",\n          \"description\": \"Indicates that there is no match between the subject vocabulary and the object vocabulary. This value MUST only be used when both the subject_id and the object_id are sssom:NoTermFound.\"\n        }\n      ]\n    }\n  ],\n  \"slots\": [\n    {\n      \"name\": \"prefix_name\",\n      \"definition_uri\": \"https://w3id.org/sssom/prefix_name\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/prefix_name\",\n      \"key\": true,\n      \"owner\": \"Prefix\",\n      \"domain_of\": [\n        \"Prefix\"\n      ],\n      \"range\": \"ncname\",\n      \"required\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"prefix_url\",\n      \"definition_uri\": \"https://w3id.org/sssom/prefix_url\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/prefix_url\",\n      \"owner\": \"Prefix\",\n      \"domain_of\": [\n        \"Prefix\"\n      ],\n      \"range\": \"uri\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"sssom_version\",\n      \"definition_uri\": \"https://w3id.org/sssom/sssom_version\",\n      \"instantiates\": [\n        \"sssom:Versionable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"added_in\",\n          \"value\": \"1.1\",\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"The version of the SSSOM specification a mapping set is compliant with.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/439\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/version.sssom.tsv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/sssom_version\",\n      \"owner\": \"MappingSet\",\n      \"domain_of\": [\n        \"MappingSet\"\n      ],\n      \"range\": \"sssom_version_enum\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"curie_map\",\n      \"definition_uri\": \"https://w3id.org/sssom/curie_map\",\n      \"description\": \"A dictionary that contains prefixes as keys and their URI expansions as values.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/225\",\n        \"https://github.com/mapping-commons/sssom/pull/349\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/curie_map.sssom.tsv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/curie_map\",\n      \"owner\": \"MappingSet\",\n      \"domain_of\": [\n        \"MappingSet\"\n      ],\n      \"range\": \"Prefix\",\n      \"multivalued\": true,\n      \"inlined\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mirror_from\",\n      \"definition_uri\": \"https://w3id.org/sssom/mirror_from\",\n      \"description\": \"A URL location from which to obtain a resource, such as a mapping set.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/mirror_from\",\n      \"owner\": \"MappingSetReference\",\n      \"domain_of\": [\n        \"MappingSetReference\"\n      ],\n      \"range\": \"NonRelativeURI\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"registry_confidence\",\n      \"definition_uri\": \"https://w3id.org/sssom/registry_confidence\",\n      \"description\": \"This value is set by the creator/maintainer of the mapping registry and reflects the confidence the mapping registry has in the correctness (i.e., precision) of mappings in the mapping set.\\nWhen not explicitly specified, confidence estimation algorithms should consider the registry confidence in a mapping set to be 1.0 by default.\",\n      \"examples\": [\n        {\n          \"value\": \"0.95\",\n          \"description\": \"A confidence score of 0.95, indicating 95% confidence.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://mapping-commons.github.io/sssom/confidence-model\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/registry_confidence\",\n      \"owner\": \"MappingSetReference\",\n      \"domain_of\": [\n        \"MappingSetReference\"\n      ],\n      \"range\": \"double\",\n      \"minimum_value\": 0.0,\n      \"maximum_value\": 1.0,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"last_updated\",\n      \"definition_uri\": \"https://w3id.org/sssom/last_updated\",\n      \"description\": \"The date this reference was last updated.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/last_updated\",\n      \"owner\": \"MappingSetReference\",\n      \"domain_of\": [\n        \"MappingSetReference\"\n      ],\n      \"range\": \"date\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"local_name\",\n      \"definition_uri\": \"https://w3id.org/sssom/local_name\",\n      \"description\": \"The local name assigned to file that corresponds to the downloaded mapping set.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/local_name\",\n      \"owner\": \"MappingSetReference\",\n      \"domain_of\": [\n        \"MappingSetReference\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_set_references\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_set_references\",\n      \"description\": \"A list of mapping set references.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/mapping_set_references\",\n      \"owner\": \"MappingRegistry\",\n      \"domain_of\": [\n        \"MappingRegistry\"\n      ],\n      \"range\": \"MappingSetReference\",\n      \"recommended\": true,\n      \"multivalued\": true,\n      \"inlined\": true,\n      \"inlined_as_list\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_registry_id\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_registry_id\",\n      \"description\": \"The unique identifier of a mapping registry.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/mapping_registry_id\",\n      \"owner\": \"MappingRegistry\",\n      \"domain_of\": [\n        \"MappingRegistry\"\n      ],\n      \"range\": \"EntityReference\",\n      \"required\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_registry_title\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_registry_title\",\n      \"description\": \"The title of a mapping registry.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/mapping_registry_title\",\n      \"owner\": \"MappingRegistry\",\n      \"domain_of\": [\n        \"MappingRegistry\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_registry_description\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_registry_description\",\n      \"description\": \"The description of a mapping registry.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/mapping_registry_description\",\n      \"owner\": \"MappingRegistry\",\n      \"domain_of\": [\n        \"MappingRegistry\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"imports\",\n      \"definition_uri\": \"https://w3id.org/sssom/imports\",\n      \"description\": \"A list of registries that should be imported into this one.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/imports\",\n      \"owner\": \"MappingRegistry\",\n      \"domain_of\": [\n        \"MappingRegistry\"\n      ],\n      \"range\": \"NonRelativeURI\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"documentation\",\n      \"definition_uri\": \"https://w3id.org/sssom/documentation\",\n      \"description\": \"A URL to the documentation of this mapping commons.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/documentation\",\n      \"owner\": \"MappingRegistry\",\n      \"domain_of\": [\n        \"MappingRegistry\"\n      ],\n      \"range\": \"NonRelativeURI\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"homepage\",\n      \"definition_uri\": \"https://w3id.org/sssom/homepage\",\n      \"description\": \"A URL to a homepage of this mapping commons.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/homepage\",\n      \"owner\": \"MappingRegistry\",\n      \"domain_of\": [\n        \"MappingRegistry\"\n      ],\n      \"range\": \"NonRelativeURI\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mappings\",\n      \"definition_uri\": \"https://w3id.org/sssom/mappings\",\n      \"description\": \"Contains a list of mapping objects.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/mappings\",\n      \"owner\": \"MappingSet\",\n      \"domain_of\": [\n        \"MappingSet\"\n      ],\n      \"range\": \"Mapping\",\n      \"recommended\": true,\n      \"multivalued\": true,\n      \"inlined\": true,\n      \"inlined_as_list\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"subject_id\",\n      \"definition_uri\": \"https://w3id.org/sssom/subject_id\",\n      \"description\": \"The ID of the subject of the mapping.\",\n      \"examples\": [\n        {\n          \"value\": \"HP:0009894\",\n          \"description\": \"The CURIE denoting the Human Phenotype Ontology concept of 'Thickened ears'\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"http://www.w3.org/2002/07/owl#annotatedSource\",\n        \"http://www.w3.org/2002/07/owl#annotatedSource\"\n      ],\n      \"slot_uri\": \"http://www.w3.org/2002/07/owl#annotatedSource\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"subject_label\",\n      \"definition_uri\": \"https://w3id.org/sssom/subject_label\",\n      \"description\": \"The label of subject of the mapping.\",\n      \"examples\": [\n        {\n          \"value\": \"Thickened ears\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/subject_label\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"recommended\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"subject_category\",\n      \"definition_uri\": \"https://w3id.org/sssom/subject_category\",\n      \"description\": \"The conceptual category to which the subject belongs to. This can be a string denoting the category or a term from a controlled vocabulary. This slot is deliberately underspecified. Conceptual categories can range from those that are found in general upper ontologies such as BFO (e.g. process, temporal region, etc) to those that serve as upper ontologies in specific domains, such as COB or BioLink (e.g. gene, disease, chemical entity). The purpose of this optional field is documentation for human reviewers - when a category is known and documented clearly, the cost of interpreting and evaluating the mapping decreases.\",\n      \"examples\": [\n        {\n          \"value\": \"UBERON:0001062\",\n          \"description\": \"The CURIE of the Uberon term for \\\"anatomical entity\\\".\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"anatomical entity\",\n          \"description\": \"A string, rather than ID, describing the \\\"anatomical entity\\\" category. This is possible, but less preferred than using an ID.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"biolink:Gene\",\n          \"description\": \"The CURIE of the biolink class for genes.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/13\",\n        \"https://github.com/mapping-commons/sssom/issues/256\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/subject_category\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"subject_type\",\n      \"definition_uri\": \"https://w3id.org/sssom/subject_type\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"The type of entity that is being mapped.\",\n      \"examples\": [\n        {\n          \"value\": \"owl:Class\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/subject_type\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"entity_type_enum\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"predicate_id\",\n      \"definition_uri\": \"https://w3id.org/sssom/predicate_id\",\n      \"description\": \"The ID of the predicate or relation that relates the subject and object of this match.\",\n      \"examples\": [\n        {\n          \"value\": \"owl:sameAs\",\n          \"description\": \"The subject and the object are instances (owl individuals), and the two instances are the same.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"owl:equivalentClass\",\n          \"description\": \"The subject and the object are classes (owl class), and the two classes are the same.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"owl:equivalentProperty\",\n          \"description\": \"The subject and the object are properties (owl object, data, annotation properties), and the two properties are the same.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"rdfs:subClassOf\",\n          \"description\": \"The subject and the object are classes (owl class), and the subject is a subclass of the object.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"rdfs:subPropertyOf\",\n          \"description\": \"The subject and the object are properties (owl object, data, annotation properties), and the subject is a subproperty of the object.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"skos:relatedMatch\",\n          \"description\": \"The subject and the object are associated in some unspecified way.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"skos:closeMatch\",\n          \"description\": \"The subject and the object are sufficiently similar that they can be used interchangeably in some information retrieval applications.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"skos:exactMatch\",\n          \"description\": \"The subject and the object can, with a high degree of confidence, be used interchangeably across a wide range of information retrieval applications.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"skos:narrowMatch\",\n          \"description\": \"From the SKOS primer: A triple skos:narrower (and skos:narrowMatch) asserts that , the object of the triple, is a narrower concept than , the subject of the triple.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"skos:broadMatch\",\n          \"description\": \"From the SKOS primer: A triple skos:broader (and skos:broadMatch) asserts that , the object of the triple, is a broader concept than , the subject of the triple.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"oboInOwl:hasDbXref\",\n          \"description\": \"Two terms are related in some way. The meaning is frequently consistent across a single set of mappings. Note this property is often overloaded even where the terms are of a different nature (e.g. interpro2go).\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"rdfs:seeAlso\",\n          \"description\": \"The subject and the object are associated in some unspecified way. The object IRI often resolves to a resource on the web that provides additional information.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"http://www.w3.org/2002/07/owl#annotatedProperty\",\n        \"http://www.w3.org/2002/07/owl#annotatedProperty\"\n      ],\n      \"slot_uri\": \"http://www.w3.org/2002/07/owl#annotatedProperty\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"required\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"predicate_modifier\",\n      \"definition_uri\": \"https://w3id.org/sssom/predicate_modifier\",\n      \"description\": \"A modifier for negating the predicate. See https://github.com/mapping-commons/sssom/issues/40 for discussion\",\n      \"examples\": [\n        {\n          \"value\": \"Not\",\n          \"description\": \"Negates the predicate, see documentation of predicate_modifier_enum\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/107\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/predicate_modifier\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"predicate_modifier_enum\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"predicate_label\",\n      \"definition_uri\": \"https://w3id.org/sssom/predicate_label\",\n      \"description\": \"The label of the predicate/relation of the mapping.\",\n      \"examples\": [\n        {\n          \"value\": \"has cross-reference\",\n          \"description\": \"The label of the oboInOwl:hasDbXref property to represent cross-references.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/predicate_label\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"predicate_type\",\n      \"definition_uri\": \"https://w3id.org/sssom/predicate_type\",\n      \"instantiates\": [\n        \"sssom:Propagatable\",\n        \"sssom:Versionable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        },\n        {\n          \"tag\": \"added_in\",\n          \"value\": \"1.1\",\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"The type of the predicate used to map the subject and object entities.\",\n      \"examples\": [\n        {\n          \"value\": \"owl:AnnotationProperty\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"owl:ObjectProperty\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/143\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/predicate-types.sssom.tsv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/predicate_type\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"entity_type_enum\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"object_id\",\n      \"definition_uri\": \"https://w3id.org/sssom/object_id\",\n      \"description\": \"The ID of the object of the mapping.\",\n      \"examples\": [\n        {\n          \"value\": \"HP:0009894\",\n          \"description\": \"The CURIE denoting the Human Phenotype Ontology concept of 'Thickened ears'.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"http://www.w3.org/2002/07/owl#annotatedTarget\",\n        \"http://www.w3.org/2002/07/owl#annotatedTarget\"\n      ],\n      \"slot_uri\": \"http://www.w3.org/2002/07/owl#annotatedTarget\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"object_label\",\n      \"definition_uri\": \"https://w3id.org/sssom/object_label\",\n      \"description\": \"The label of object of the mapping.\",\n      \"examples\": [\n        {\n          \"value\": \"Thickened ears\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/object_label\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"recommended\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"object_category\",\n      \"definition_uri\": \"https://w3id.org/sssom/object_category\",\n      \"description\": \"The conceptual category to which the subject belongs to. This can be a string denoting the category or a term from a controlled vocabulary. This slot is deliberately underspecified. Conceptual categories can range from those that are found in general upper ontologies such as BFO (e.g. process, temporal region, etc) to those that serve as upper ontologies in specific domains, such as COB or BioLink (e.g. gene, disease, chemical entity). The purpose of this optional field is documentation for human reviewers - when a category is known and documented clearly, the cost of interpreting and evaluating the mapping decreases.\",\n      \"examples\": [\n        {\n          \"value\": \"UBERON:0001062\",\n          \"description\": \"The CURIE of the Uberon term for \\\"anatomical entity\\\".\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"anatomical entity\",\n          \"description\": \"A string, rather than ID, describing the \\\"anatomical entity\\\" category. This is possible, but less preferred than using an ID.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"biolink:Gene\",\n          \"description\": \"The CURIE of the biolink class for genes.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/13\",\n        \"https://github.com/mapping-commons/sssom/issues/256\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/object_category\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_justification\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_justification\",\n      \"description\": \"A mapping justification is an action (or the written representation of that action) of showing a mapping to be right or reasonable.\",\n      \"examples\": [\n        {\n          \"value\": \"semapv:LexicalMatching\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"semapv:ManualMappingCuration\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://mapping-commons.github.io/semantic-mapping-vocabulary/\",\n        \"https://www.ebi.ac.uk/ols4/ontologies/semapv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/mapping_justification\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"required\": true,\n      \"pattern\": \"^semapv:(MappingReview|ManualMappingCuration|LogicalReasoning|LexicalMatching|CompositeMatching|UnspecifiedMatching|SemanticSimilarityThresholdMatching|LexicalSimilarityThresholdMatching|MappingChaining|MappingInversion|StructuralMatching|InstanceBasedMatching|BackgroundKnowledgeBasedMatching)$\",\n      \"any_of\": [\n        {\n          \"equals_string\": \"semapv:LexicalMatching\",\n          \"@type\": \"AnonymousSlotExpression\"\n        },\n        {\n          \"equals_string\": \"semapv:LogicalReasoning\",\n          \"@type\": \"AnonymousSlotExpression\"\n        },\n        {\n          \"equals_string\": \"semapv:CompositeMatching\",\n          \"@type\": \"AnonymousSlotExpression\"\n        },\n        {\n          \"equals_string\": \"semapv:UnspecifiedMatching\",\n          \"@type\": \"AnonymousSlotExpression\"\n        },\n        {\n          \"equals_string\": \"semapv:SemanticSimilarityThresholdMatching\",\n          \"@type\": \"AnonymousSlotExpression\"\n        },\n        {\n          \"equals_string\": \"semapv:LexicalSimilarityThresholdMatching\",\n          \"@type\": \"AnonymousSlotExpression\"\n        },\n        {\n          \"equals_string\": \"semapv:MappingChaining\",\n          \"@type\": \"AnonymousSlotExpression\"\n        },\n        {\n          \"equals_string\": \"semapv:MappingReview\",\n          \"@type\": \"AnonymousSlotExpression\"\n        },\n        {\n          \"equals_string\": \"semapv:ManualMappingCuration\",\n          \"@type\": \"AnonymousSlotExpression\"\n        },\n        {\n          \"equals_string\": \"semapv:MappingInversion\",\n          \"@type\": \"AnonymousSlotExpression\"\n        },\n        {\n          \"equals_string\": \"semapv:StructuralMatching\",\n          \"@type\": \"AnonymousSlotExpression\"\n        },\n        {\n          \"equals_string\": \"semapv:InstanceBasedMatching\",\n          \"@type\": \"AnonymousSlotExpression\"\n        },\n        {\n          \"equals_string\": \"semapv:BackgroundKnowledgeBasedMatching\",\n          \"@type\": \"AnonymousSlotExpression\"\n        }\n      ],\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"object_type\",\n      \"definition_uri\": \"https://w3id.org/sssom/object_type\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"The type of entity that is being mapped.\",\n      \"examples\": [\n        {\n          \"value\": \"owl:Class\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/object_type\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"entity_type_enum\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_set_id\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_set_id\",\n      \"description\": \"A globally unique identifier for the mapping set (not each individual mapping). Should ideally be resolvable.\",\n      \"examples\": [\n        {\n          \"value\": \"http://purl.obolibrary.org/obo/mondo/mappings/mondo_exactmatch_ncit.sssom.tsv\",\n          \"description\": \"A persistent URI pointing to the latest version of the Mondo - NCIT mapping in the Mondo namespace.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/mapping_set_id\",\n      \"owner\": \"MappingSetReference\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"MappingSetReference\"\n      ],\n      \"range\": \"NonRelativeURI\",\n      \"required\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_set_version\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_set_version\",\n      \"description\": \"A version string for the mapping.\",\n      \"examples\": [\n        {\n          \"value\": \"2020-01-01\",\n          \"description\": \"A date-based version that indicates that the mapping was published on the 1st January in 2021.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"1.2.1\",\n          \"description\": \"(A semantic version tag that indicates that this is the 1st major, 2nd minor version, patch 1 (https://semver.org/).)\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"http://www.w3.org/2002/07/owl#versionInfo\"\n      ],\n      \"slot_uri\": \"http://www.w3.org/2002/07/owl#versionInfo\",\n      \"owner\": \"MappingSet\",\n      \"domain_of\": [\n        \"MappingSet\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_set_group\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_set_group\",\n      \"description\": \"Set by the owners of the mapping registry. A way to group related mapping sets for example for UI purposes.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/mapping_set_group\",\n      \"owner\": \"MappingSetReference\",\n      \"domain_of\": [\n        \"MappingSetReference\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_set_title\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_set_title\",\n      \"description\": \"The display name of a mapping set.\",\n      \"examples\": [\n        {\n          \"value\": \"The Mondo-OMIM mappings by Monarch Initiative.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"http://purl.org/dc/terms/title\"\n      ],\n      \"slot_uri\": \"http://purl.org/dc/terms/title\",\n      \"owner\": \"MappingSet\",\n      \"domain_of\": [\n        \"MappingSet\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_set_description\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_set_description\",\n      \"description\": \"A description of the mapping set.\",\n      \"examples\": [\n        {\n          \"value\": \"This mapping set was produced to integrate human and mouse phenotype data at the IMPC. It is primarily used for making mouse phenotypes searchable by human synonyms at https://mousephenotype.org/.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"http://purl.org/dc/terms/description\"\n      ],\n      \"slot_uri\": \"http://purl.org/dc/terms/description\",\n      \"owner\": \"MappingSet\",\n      \"domain_of\": [\n        \"MappingSet\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_set_confidence\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_set_confidence\",\n      \"instantiates\": [\n        \"sssom:Versionable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"added_in\",\n          \"value\": \"1.1\",\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"Mapping-set level confidence is assigned by the creator of the mapping set to indicate their overall confidence in the correctness (i.e., precision) of mappings in the mapping set. Mapping set confidence is intended to be used in cases were the creator wants to express an overall confidence into the agent that curated the individual mappings, for example a lexical matching tool, or a group of students.\\nWhen not explicitly specified, confidence estimation algorithms should consider the mapping set confidence to be 1.0 by default.\",\n      \"examples\": [\n        {\n          \"value\": \"0.95\",\n          \"description\": \"A confidence score of 0.95, indicating 95% confidence that the mappings in the mapping set are correct.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://mapping-commons.github.io/sssom/confidence-model\",\n        \"https://github.com/mapping-commons/sssom/issues/438\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/mapping_set_confidence.sssom.tsv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/mapping_set_confidence\",\n      \"owner\": \"MappingSet\",\n      \"domain_of\": [\n        \"MappingSet\"\n      ],\n      \"range\": \"double\",\n      \"minimum_value\": 0.0,\n      \"maximum_value\": 1.0,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"creator_id\",\n      \"definition_uri\": \"https://w3id.org/sssom/creator_id\",\n      \"description\": \"Identifies the persons or groups responsible for the creation of the mapping. The creator is the agent that put the mapping in its published form, which may be different from the author, which is a person that was actively involved in the assertion of the mapping. Recommended to be a list of ORCIDs or otherwise identifying URIs.\",\n      \"examples\": [\n        {\n          \"value\": \"orcid:0000-0002-7356-1779|orcid:0000-0002-6601-2165\",\n          \"description\": \"The ORCID of the (multiple) creators of the mapping. Note that this is how the example would look like specifically in the SSSOM/TSV format, where multivalued slots such as `creator_id` are represented as single strings containing `|`-separated values.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"orcid:0000-0002-7356-1779\",\n          \"description\": \"The ORCID of the creator of the mapping.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"http://purl.org/dc/terms/creator\"\n      ],\n      \"slot_uri\": \"http://purl.org/dc/terms/creator\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"creator_label\",\n      \"definition_uri\": \"https://w3id.org/sssom/creator_label\",\n      \"description\": \"A string representing the creator of this mapping. This should only be used in the absence of a proper semantic identifier (which would be stored in creator_id) for that creator. It is not expected that there should be any link between creator_id and creator_label; in particular, creator_label is not intended to provide a human-friendly version of an identifier in creator_id.\",\n      \"examples\": [\n        {\n          \"value\": \"Nicolas Matentzoglu|Chris Mungall\",\n          \"description\": \"The human-readable names of the (multiple) creators of the mapping. Note that this is how the example would look like specifically in the SSSOM/TSV format, where multivalued slots such as `creator_label` are represented as single strings containing `|`-separated values.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"Nicolas Matentzoglu\",\n          \"description\": \"The human-readable name of the creator of the mapping.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/creator_label\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"author_id\",\n      \"definition_uri\": \"https://w3id.org/sssom/author_id\",\n      \"description\": \"Identifies the persons or groups responsible for asserting the mappings. Recommended to be a list of ORCIDs or otherwise identifying URIs.\",\n      \"examples\": [\n        {\n          \"value\": \"orcid:0000-0002-7356-1779|orcid:0000-0002-6601-2165\",\n          \"description\": \"The ORCID of the (multiple) authors of the mapping. Note that this is how the example would look like specifically in the SSSOM/TSV format, where multivalued slots such as `author_id` are represented as single strings containing `|`-separated values.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"orcid:0000-0002-7356-1779\",\n          \"description\": \"The ORCID of the author of the mapping.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"http://purl.org/pav/authoredBy\"\n      ],\n      \"slot_uri\": \"http://purl.org/pav/authoredBy\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"author_label\",\n      \"definition_uri\": \"https://w3id.org/sssom/author_label\",\n      \"description\": \"A string representing the author of this mapping. This should only be used in the absence of a proper semantic identifier (which would be stored in author_id) for that author. It is not expected that there should be any link between author_id and author_label; in particular, author_label is not intended to provide a human-friendly version of an identifier in author_id.\",\n      \"examples\": [\n        {\n          \"value\": \"Nicolas Matentzoglu|Chris Mungall\",\n          \"description\": \"The human-readable names of the (multiple) authors of the mapping. Note that this is how the example would look like specifically in the SSSOM/TSV format, where multivalued slots such as `author_label` are represented as single strings containing `|`-separated values.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"Nicolas Matentzoglu\",\n          \"description\": \"The human-readable name of the author of the mapping.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/author_label\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"reviewer_id\",\n      \"definition_uri\": \"https://w3id.org/sssom/reviewer_id\",\n      \"description\": \"Identifies the persons or groups that reviewed and confirmed the mapping. Recommended to be a list of ORCIDs or otherwise identifying URIs.\",\n      \"examples\": [\n        {\n          \"value\": \"orcid:0000-0002-7356-1779|orcid:0000-0002-6601-2165\",\n          \"description\": \"The ORCID of the (multiple) reviewers of the mapping. Note that this is how the example would look like specifically in the SSSOM/TSV format, where multivalued slots such as `reviewer_id` are represented as single strings containing `|`-separated values.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"orcid:0000-0002-7356-1779\",\n          \"description\": \"The ORCID of the reviewer of the mapping.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/reviewer_id\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"reviewer_label\",\n      \"definition_uri\": \"https://w3id.org/sssom/reviewer_label\",\n      \"description\": \"A string representing the reviewer of this mapping. This should only be used in the absence of a proper semantic identifier (which would be stored in reviewer_id) for that reviewer. It is not expected that there should be any link between reviewer_id and reviewer_label; in particular, reviewer_label is not intended to provide a human-friendly version of an identifier in reviewer_id.\",\n      \"examples\": [\n        {\n          \"value\": \"Nicolas Matentzoglu|Chris Mungall\",\n          \"description\": \"The human-readable names of the (multiple) reviewers of the mapping. Note that this is how the example would look like specifically in the SSSOM/TSV format, where multivalued slots such as `reviewer_label` are represented as single strings containing `|`-separated values.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"Nicolas Matentzoglu\",\n          \"description\": \"The human-readable name of the reviewer of the mapping.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/reviewer_label\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"license\",\n      \"definition_uri\": \"https://w3id.org/sssom/license\",\n      \"description\": \"A url to the license of the mapping. In absence of a license we assume no license.\",\n      \"examples\": [\n        {\n          \"value\": \"https://creativecommons.org/licenses/by/4.0/\",\n          \"description\": \"The URI of the Creative Commons Attribution 4.0 International license.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"http://purl.org/dc/terms/license\"\n      ],\n      \"slot_uri\": \"http://purl.org/dc/terms/license\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"NonRelativeURI\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"subject_source\",\n      \"definition_uri\": \"https://w3id.org/sssom/subject_source\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"URI of vocabulary or identifier source for the subject.\",\n      \"examples\": [\n        {\n          \"value\": \"obo:mondo.owl\",\n          \"description\": \"A persistent OBO CURIE pointing to the latest version of the Mondo ontology.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"wikidata:Q7876491\",\n          \"description\": \"A Wikidata identifier for the Uberon ontology resource.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/subject_source\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"subject_source_version\",\n      \"definition_uri\": \"https://w3id.org/sssom/subject_source_version\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"Version IRI or version string of the source of the subject term.\",\n      \"examples\": [\n        {\n          \"value\": \"http://purl.obolibrary.org/obo/mondo/releases/2021-01-30/mondo.owl\",\n          \"description\": \"A persistent Version IRI pointing to the Mondo version '2021-01-30'\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/subject_source_version\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"object_source\",\n      \"definition_uri\": \"https://w3id.org/sssom/object_source\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"URI of vocabulary or identifier source for the object.\",\n      \"examples\": [\n        {\n          \"value\": \"obo:mondo.owl\",\n          \"description\": \"A persistent OBO CURIE pointing to the latest version of the Mondo ontology.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"wikidata:Q7876491\",\n          \"description\": \"A Wikidata identifier for the Uberon ontology resource.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/object_source\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"object_source_version\",\n      \"definition_uri\": \"https://w3id.org/sssom/object_source_version\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"Version IRI or version string of the source of the object term.\",\n      \"examples\": [\n        {\n          \"value\": \"http://purl.obolibrary.org/obo/mondo/releases/2021-01-30/mondo.owl\",\n          \"description\": \"A persistent Version IRI pointing to the Mondo version '2021-01-30'\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/object_source_version\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_provider\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_provider\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"URL pointing to the source that provided the mapping, for example an ontology that already contains the mappings, or a database from which it was derived.\",\n      \"examples\": [\n        {\n          \"value\": \"https://www.ohdsi.org/\",\n          \"description\": \"A URL pointing to the Observational Health Data Sciences and Informatics initiative.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"https://monarchinitiative.org/\",\n          \"description\": \"A URL pointing to the Monarch Initiative Resource.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/mapping_provider\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"NonRelativeURI\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_set_source\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_set_source\",\n      \"description\": \"A mapping set or set of mapping set that was used to derive the mapping set.\",\n      \"examples\": [\n        {\n          \"value\": \"http://purl.obolibrary.org/obo/mondo/mappings/2022-05-20/mondo_exactmatch_ncit.sssom.tsv\",\n          \"description\": \"A persistent, ideally versioned, link to the mapping set from which the current mapping set is derived.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"http://www.w3.org/ns/prov#wasDerivedFrom\"\n      ],\n      \"slot_uri\": \"http://www.w3.org/ns/prov#wasDerivedFrom\",\n      \"owner\": \"MappingSet\",\n      \"domain_of\": [\n        \"MappingSet\"\n      ],\n      \"range\": \"NonRelativeURI\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_source\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_source\",\n      \"description\": \"The mapping set this mapping was originally defined in. mapping_source is used for example when merging multiple mapping sets or deriving one mapping set from another.\",\n      \"examples\": [\n        {\n          \"value\": \"MONDO_MAPPINGS:mondo_exactmatch_ncit.sssom.tsv\",\n          \"description\": \"A reference to the mapping set that originally contained this mapping.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/mapping_source\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_cardinality\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_cardinality\",\n      \"description\": \"A value indicating whether the subject (respectively object) of this mapping record is present in other records involving a different object (respectively subject), within the subset of records defined by the cardinality_scope slot (or within the entire mapping set if cardinality_scope is undefined). Note that this is a convenience field, whose values can always be derived from the mapping set.\",\n      \"examples\": [\n        {\n          \"value\": \"1:1\",\n          \"description\": \"A one-to-one mapping. There are no other records in which the same subject is mapped to a different object, and no other records in which the same object is mapped to a different subject.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"1:n\",\n          \"description\": \"A one-to-many mapping. There are other records in which the same subject is mapped to at least one different object than the object present in this record; there are no other records in which the object is mapped to a different subject.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/cardinality.sssom.tsv\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/cardinality-with-unmapped-entities.sssom.tsv\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/cardinality-scope-empty.sssom.tsv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/mapping_cardinality\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"mapping_cardinality_enum\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"cardinality_scope\",\n      \"definition_uri\": \"https://w3id.org/sssom/cardinality_scope\",\n      \"instantiates\": [\n        \"sssom:Propagatable\",\n        \"sssom:Versionable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        },\n        {\n          \"tag\": \"added_in\",\n          \"value\": \"1.1\",\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"A list of mapping slots that define the scope for the value found in the mapping_cardinality slot. Mappings are considered to belong to the same scope if they have the same value for all slots listed in the scope. If no scope is defined, the default scope is empty, meaning that all mappings belong to a single scope that is identical to the entire mapping set. The behaviour if a value in the list does not correspond to a valid slot name is undefined.\",\n      \"examples\": [\n        {\n          \"value\": \"predicate_id\",\n          \"description\": \"Indicates that mapping_cardinality is computed relatively to all mappings that have the same predicate.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"predicate_id|object_source\",\n          \"description\": \"Indicates that mapping_cardinality is computed relatively to all mappings that have the same predicate and the same object source. Note that this is how the example would look like specifically in the SSSOM/TSV format, where multivalued slots like `cardinality_scope` are represented as a single string containing `|`-separated values.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/467\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/cardinality-scope-predicate.sssom.tsv\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/cardinality-scope-predicate+object_source.sssom.tsv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/cardinality_scope\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_tool\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_tool\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"A reference to the tool or algorithm that was used to generate the mapping. Should be a URL pointing to more info about it, but can be free text. Consider using the mapping_tool_id slot for a more standardised reference.\",\n      \"examples\": [\n        {\n          \"value\": \"https://github.com/AgreementMakerLight/AML-Project\",\n          \"description\": \"A URL pointing to the AgreementMakerLight project.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"AgreementMakerLight\",\n          \"description\": \"A string (name) denoting the AgreementMakerLight project.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/mapping_tool\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_tool_id\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_tool_id\",\n      \"instantiates\": [\n        \"sssom:Propagatable\",\n        \"sssom:Versionable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        },\n        {\n          \"tag\": \"added_in\",\n          \"value\": \"1.1\",\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"The ID (entity reference) of the tool or algorithm that was used to generate the mapping.\",\n      \"examples\": [\n        {\n          \"value\": \"wikidata:Q58057366\",\n          \"description\": \"A wikidata PURL identifying the AgreementMakerLight project.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/mapping_tool_id.sssom.tsv\",\n        \"https://github.com/mapping-commons/sssom/issues/449\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/mapping_tool_id\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_tool_version\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_tool_version\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"Version string that denotes the version of the mapping tool used.\",\n      \"examples\": [\n        {\n          \"value\": \"v3.2\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/mapping_tool_version\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_date\",\n      \"definition_uri\": \"https://w3id.org/sssom/mapping_date\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"The date the mapping was asserted. This is different from the date the mapping was published or compiled in a SSSOM file.\",\n      \"examples\": [\n        {\n          \"value\": \"2021-01-01\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"http://purl.org/dc/terms/created\"\n      ],\n      \"slot_uri\": \"http://purl.org/dc/terms/created\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"date\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"publication_date\",\n      \"definition_uri\": \"https://w3id.org/sssom/publication_date\",\n      \"description\": \"The date the mapping was published. This is different from the date the mapping was asserted.\",\n      \"examples\": [\n        {\n          \"value\": \"2021-01-01\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"http://purl.org/dc/terms/issued\"\n      ],\n      \"slot_uri\": \"http://purl.org/dc/terms/issued\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"date\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"review_date\",\n      \"definition_uri\": \"https://w3id.org/sssom/review_date\",\n      \"instantiates\": [\n        \"sssom:Versionable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"added_in\",\n          \"value\": \"1.1\",\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"The date the mapping was reviewed. This is different from the date the mapping was asserted and published. If this field is used in a mapping, reviewer_id and/or reviewer_label MUST also be be set.\",\n      \"examples\": [\n        {\n          \"value\": \"2021-01-01\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/511\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/review_date.sssom.tsv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/review_date\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"date\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"confidence\",\n      \"definition_uri\": \"https://w3id.org/sssom/confidence\",\n      \"description\": \"A value assigned by the creator of the mapping to denote the creator's confidence or estimated probability that the mapping record is correct. A value of 1.0 means the creator has full confidence in the correctness of the mapping record, while a value of 0.0 means the creator is fully unsure whether the mapping record is correct or not.\\nWhen not explicitly specified, confidence estimation algorithms should consider the mapping confidence to be 1.0 by default.\",\n      \"examples\": [\n        {\n          \"value\": \"0.95\",\n          \"description\": \"A confidence score of 0.95, indicating 95% confidence.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://mapping-commons.github.io/sssom/confidence-model\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/confidence\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"double\",\n      \"minimum_value\": 0.0,\n      \"maximum_value\": 1.0,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"reviewer_agreement\",\n      \"definition_uri\": \"https://w3id.org/sssom/reviewer_agreement\",\n      \"instantiates\": [\n        \"sssom:Versionable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"added_in\",\n          \"value\": \"1.1\",\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"A value assigned by the reviewer of the mapping to denote their confidence that the mapping record is correct. A value of 1.0 means the reviewer fully agrees with the mapping record. A value of -1.0 means the reviewer fully disagrees with the mapping record. A value of 0.0 means the reviewer is not sure whether the mapping record is correct or not.\\nWhen not explicitly specified, confidence estimation algorithms should consider the reviewer agreement to be 1.0 by default.\",\n      \"examples\": [\n        {\n          \"value\": \"1.0\",\n          \"description\": \"A reviewer agreement of 1.0 denotes that the reviewer considers the mapping record to be correct with full confidence\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"-1.0\",\n          \"description\": \"A reviewer agreement of -1.0 denotes that the reviewer considers the mapping record to be incorrect with full confidence\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"0.0\",\n          \"description\": \"A reviewer agreement of 0.0 denotes that the reviewer is not sure whether the mapping record is correct or not.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://mapping-commons.github.io/sssom/confidence-model\",\n        \"https://github.com/mapping-commons/sssom/issues/510\",\n        \"https://github.com/mapping-commons/sssom/pull/519\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/reviewer_agreement\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"double\",\n      \"minimum_value\": -1.0,\n      \"maximum_value\": 1.0,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"subject_match_field\",\n      \"definition_uri\": \"https://w3id.org/sssom/subject_match_field\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"A list of properties, annotations or attributes related to the subject that was used to establish the match. This property is recommended for use in conjunction with  mapping justifications related to lexical matching, such as `semapv:LexicalMatching`.  For additional information see the 'See Also' section.\",\n      \"examples\": [\n        {\n          \"value\": \"rdfs:label\",\n          \"description\": \"The RDFS label property (rdfs:label) was used to match the subject.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"skos:prefLabel\",\n          \"description\": \"The SKOS preferred label property (skos:prefLabel) was used to match the subject.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://mapping-commons.github.io/sssom/mapping-justifications/#lexical-matching\",\n        \"https://github.com/mapping-commons/sssom/issues/413\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/subject_match_field\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"object_match_field\",\n      \"definition_uri\": \"https://w3id.org/sssom/object_match_field\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"A list of properties, annotations or attributes related to the object that was used to establish the match. This property is recommended for use in conjunction with  mapping justifications related to lexical matching, such as `semapv:LexicalMatching`.  For additional information see the 'See Also' section.\",\n      \"examples\": [\n        {\n          \"value\": \"rdfs:label\",\n          \"description\": \"The RDFS label property (rdfs:label) was used to match the object.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"skos:prefLabel\",\n          \"description\": \"The SKOS preferred label property (skos:prefLabel) was used to match the object.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://mapping-commons.github.io/sssom/mapping-justifications/#lexical-matching\",\n        \"https://github.com/mapping-commons/sssom/issues/413\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/object_match_field\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"match_string\",\n      \"definition_uri\": \"https://w3id.org/sssom/match_string\",\n      \"description\": \"String that is shared by subj/obj. It is recommended to indicate the fields for the match using the object and subject_match_field slots.\",\n      \"examples\": [\n        {\n          \"value\": \"gala\",\n          \"description\": \"The 'gala' string was matched for both subject and object.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/match_string\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"subject_preprocessing\",\n      \"definition_uri\": \"https://w3id.org/sssom/subject_preprocessing\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"Method of preprocessing applied to the fields of the subject. If different preprocessing steps were performed on different fields, it is recommended to store the match in separate rows.\",\n      \"examples\": [\n        {\n          \"value\": \"semapv:Stemming\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"semapv:StopWordRemoval\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/subject_preprocessing\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"object_preprocessing\",\n      \"definition_uri\": \"https://w3id.org/sssom/object_preprocessing\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"Method of preprocessing applied to the fields of the object. If different preprocessing steps were performed on different fields, it is recommended to store the match in separate rows.\",\n      \"examples\": [\n        {\n          \"value\": \"semapv:Stemming\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"semapv:StopWordRemoval\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/object_preprocessing\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"curation_rule\",\n      \"definition_uri\": \"https://w3id.org/sssom/curation_rule\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"A curation rule is a (potentially) complex condition executed by an agent that led to the establishment of a mapping. Curation rules often involve complex domain-specific considerations, which are hard to capture in an automated fashion. The curation rule is captured as a resource rather than a string, which enables higher levels of transparency and sharing across mapping sets. The URI representation of the curation rule is expected to be a resolvable identifier which provides details about the nature of the curation rule.\",\n      \"examples\": [\n        {\n          \"value\": \"DISEASE_MAPPING_COMMONS_RULES:MPR2\",\n          \"description\": \"A reference to the Disease Mapping Commons rule with the ID MPR2.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/166\",\n        \"https://github.com/mapping-commons/sssom/pull/258\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/curation_rule.sssom.tsv\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/curation_rule-propagated.sssom.tsv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/curation_rule\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"curation_rule_text\",\n      \"definition_uri\": \"https://w3id.org/sssom/curation_rule_text\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"A curation rule is a (potentially) complex condition executed by an agent that led to the establishment of a mapping. Curation rules often involve complex domain-specific considerations, which are hard to capture in an automated fashion. The curation rule should be captured as a resource (entity reference) rather than a string (see curation_rule element), which enables higher levels of transparency and sharing across mapping sets. The textual representation of curation rule is intended to be used in cases where the creation of a resource is not practical from the perspective of the mapping_provider.\",\n      \"examples\": [\n        {\n          \"value\": \"The two phenotypes inhere in homologous structures and exhibit the same phenotypic quality.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"The two diseases are used synonymous in the medical literature.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/166\",\n        \"https://github.com/mapping-commons/sssom/pull/258\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/curation_rule_text.sssom.tsv\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/curation_rule_text-propagated.sssom.tsv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/curation_rule_text\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"similarity_score\",\n      \"definition_uri\": \"https://w3id.org/sssom/similarity_score\",\n      \"description\": \"A score between 0 and 1 to denote the similarity between two entities, where 1 denotes equivalence, and 0 denotes disjointness. The score is meant to be used in conjunction with the similarity_measure field, to document, for example, the lexical or semantic match of a matching algorithm.\",\n      \"examples\": [\n        {\n          \"value\": \"0.95\",\n          \"description\": \"A similarity score of 0.95, indicating 95% similarity.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/385\",\n        \"https://github.com/mapping-commons/sssom/pull/386\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/similarity_score.sssom.tsv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/similarity_score\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"double\",\n      \"minimum_value\": 0.0,\n      \"maximum_value\": 1.0,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"similarity_measure\",\n      \"definition_uri\": \"https://w3id.org/sssom/similarity_measure\",\n      \"instantiates\": [\n        \"sssom:Propagatable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"propagated\",\n          \"value\": true,\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"The measure used for computing a similarity score. This field is meant to be used in conjunction with the similarity_score field, to document, for example, the lexical or semantic match of a matching algorithm. To make processing this field as unambiguous as possible, we recommend using wikidata CURIEs, but the type of this field is deliberately unspecified.\",\n      \"examples\": [\n        {\n          \"value\": \"https://www.wikidata.org/entity/Q865360\",\n          \"description\": \"the Wikidata IRI for the Jaccard index measure).\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"wikidata:Q865360\",\n          \"description\": \"the Wikidata CURIE for the Jaccard index measure).\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"Levenshtein distance\",\n          \"description\": \"a score to measure the distance between two character sequences).\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/385\",\n        \"https://github.com/mapping-commons/sssom/pull/386\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/similarity_score.sssom.tsv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/similarity_measure\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"issue_tracker_item\",\n      \"definition_uri\": \"https://w3id.org/sssom/issue_tracker_item\",\n      \"description\": \"The issue tracker item discussing this mapping.\",\n      \"examples\": [\n        {\n          \"value\": \"SSSOM_GITHUB_ISSUE:166\",\n          \"description\": \"A URL resolving to an issue discussing a new SSSOM element request\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/78\",\n        \"https://github.com/mapping-commons/sssom/pull/259\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/issue_tracker_item.sssom.tsv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/issue_tracker_item\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"issue_tracker\",\n      \"definition_uri\": \"https://w3id.org/sssom/issue_tracker\",\n      \"description\": \"A URL location of the issue tracker for this entity.\",\n      \"examples\": [\n        {\n          \"value\": \"https://github.com/mapping-commons/mh_mapping_initiative/issues\",\n          \"description\": \"A URL resolving to the issue tracker of the Mouse-Human mapping initiative\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/78\",\n        \"https://github.com/mapping-commons/sssom/pull/259\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/issue_tracker.sssom.tsv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/issue_tracker\",\n      \"owner\": \"MappingRegistry\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"MappingRegistry\"\n      ],\n      \"range\": \"NonRelativeURI\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"see_also\",\n      \"definition_uri\": \"https://w3id.org/sssom/see_also\",\n      \"description\": \"A URL specific for the mapping instance. E.g. for kboom we have a per-mapping image that shows surrounding axioms that drive probability. Could also be a github issue URL that discussed a complicated alignment\",\n      \"examples\": [\n        {\n          \"value\": \"https://github.com/mapping-commons/mh_mapping_initiative/pull/41\",\n          \"description\": \"A URL pointing to the pull request that introduced the mapping.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/422\"\n      ],\n      \"mappings\": [\n        \"http://www.w3.org/2000/01/rdf-schema#seeAlso\"\n      ],\n      \"slot_uri\": \"http://www.w3.org/2000/01/rdf-schema#seeAlso\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"NonRelativeURI\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"other\",\n      \"definition_uri\": \"https://w3id.org/sssom/other\",\n      \"description\": \"Pipe separated list of key value pairs for properties not part of the SSSOM spec. Can be used to encode additional provenance data. NOTE. This field is not recommended for general use, and should be used sparingly. See https://github.com/mapping-commons/sssom/blob/master/examples/schema/extension-slots.sssom.tsv for an alternative approach based on extension slots.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/other\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"comment\",\n      \"definition_uri\": \"https://w3id.org/sssom/comment\",\n      \"description\": \"Free text field containing either curator notes or text generated by tool providing additional informative information.\",\n      \"examples\": [\n        {\n          \"value\": \"This mapping is weird in that the hierarchical position of the two terms is very different.\",\n          \"description\": \"A comment explaining a mapping authors reservation on a mapping.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"http://www.w3.org/2000/01/rdf-schema#comment\"\n      ],\n      \"slot_uri\": \"http://www.w3.org/2000/01/rdf-schema#comment\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"MappingSet\",\n        \"Mapping\"\n      ],\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"extension_definitions\",\n      \"definition_uri\": \"https://w3id.org/sssom/extension_definitions\",\n      \"description\": \"A list that defines the extension slots used in the mapping set.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/328\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/extension-slots.sssom.tsv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/extension_definitions\",\n      \"owner\": \"MappingSet\",\n      \"domain_of\": [\n        \"MappingSet\"\n      ],\n      \"range\": \"ExtensionDefinition\",\n      \"multivalued\": true,\n      \"inlined\": true,\n      \"inlined_as_list\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"record_id\",\n      \"definition_uri\": \"https://w3id.org/sssom/record_id\",\n      \"instantiates\": [\n        \"sssom:Versionable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"added_in\",\n          \"value\": \"1.1\",\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"A unique identifier for a mapping record, that is for an instance of the Mapping class (in the SSSOM/TSV serialisation, this corresponds to an individual row after propagation is applied). This slot is intended to uniquely identify one such record within a mapping set and may for example act as the resource identifier for the record when it is serialised into RDF. This slot MUST NOT be used to \\u201cgroup\\u201d several records together to indicate that they pertain to a single mapping (for example, that they represent different versions of the same mapping), by assigning the same ID to several records. When it is used, every record within a set MUST have a unique, non-empty value. The identifier MUST be a URI; beyond that, its format is unconstrained and the identifier MUST be treated as an opaque string.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/359\",\n        \"https://github.com/mapping-commons/blob/master/examples/schema/record-ids.sssom.tsv\"\n      ],\n      \"slot_uri\": \"https://w3id.org/sssom/record_id\",\n      \"owner\": \"Mapping\",\n      \"domain_of\": [\n        \"Mapping\"\n      ],\n      \"range\": \"EntityReference\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"extensionDefinition__slot_name\",\n      \"description\": \"The name of the extension slot.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/slot_name\",\n      \"alias\": \"slot_name\",\n      \"owner\": \"ExtensionDefinition\",\n      \"domain_of\": [\n        \"ExtensionDefinition\"\n      ],\n      \"range\": \"ncname\",\n      \"required\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"extensionDefinition__property\",\n      \"description\": \"The property associated with the extension slot. It is intended to provide a non-ambiguous meaning to the slot (contrary to the slot_name, which for brevity reasons may be ambiguous).\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/property\",\n      \"alias\": \"property\",\n      \"owner\": \"ExtensionDefinition\",\n      \"domain_of\": [\n        \"ExtensionDefinition\"\n      ],\n      \"range\": \"uriorcurie\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"extensionDefinition__type_hint\",\n      \"description\": \"Expected type of the values of the extension slot.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/type_hint\",\n      \"alias\": \"type_hint\",\n      \"owner\": \"ExtensionDefinition\",\n      \"domain_of\": [\n        \"ExtensionDefinition\"\n      ],\n      \"range\": \"uriorcurie\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"propagatable__propagated\",\n      \"description\": \"Indicates whether a slot can be propagated from a mapping down to individual mappings.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/propagated\",\n      \"alias\": \"propagated\",\n      \"owner\": \"Propagatable\",\n      \"domain_of\": [\n        \"Propagatable\"\n      ],\n      \"range\": \"boolean\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"versionable__added_in\",\n      \"description\": \"The version of the specification in which the slot was added. If not specified, the slot must be assumed to have been added in version 1.0.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slot_uri\": \"https://w3id.org/sssom/added_in\",\n      \"alias\": \"added_in\",\n      \"owner\": \"Versionable\",\n      \"domain_of\": [\n        \"Versionable\"\n      ],\n      \"range\": \"sssom_version_enum\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_set_license\",\n      \"definition_uri\": \"https://w3id.org/sssom/license\",\n      \"description\": \"A url to the license of the mapping. In absence of a license we assume no license.\",\n      \"examples\": [\n        {\n          \"value\": \"https://creativecommons.org/licenses/by/4.0/\",\n          \"description\": \"The URI of the Creative Commons Attribution 4.0 International license.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"http://purl.org/dc/terms/license\"\n      ],\n      \"is_a\": \"license\",\n      \"domain\": \"MappingSet\",\n      \"slot_uri\": \"http://purl.org/dc/terms/license\",\n      \"alias\": \"license\",\n      \"owner\": \"MappingSet\",\n      \"domain_of\": [\n        \"MappingSet\"\n      ],\n      \"is_usage_slot\": true,\n      \"usage_slot_name\": \"license\",\n      \"range\": \"NonRelativeURI\",\n      \"required\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_set_similarity_measure\",\n      \"definition_uri\": \"https://w3id.org/sssom/similarity_measure\",\n      \"instantiates\": [\n        \"sssom:Versionable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"added_in\",\n          \"value\": \"1.1\",\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"The measure used for computing a similarity score. This field is meant to be used in conjunction with the similarity_score field, to document, for example, the lexical or semantic match of a matching algorithm. To make processing this field as unambiguous as possible, we recommend using wikidata CURIEs, but the type of this field is deliberately unspecified.\",\n      \"examples\": [\n        {\n          \"value\": \"https://www.wikidata.org/entity/Q865360\",\n          \"description\": \"the Wikidata IRI for the Jaccard index measure).\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"wikidata:Q865360\",\n          \"description\": \"the Wikidata CURIE for the Jaccard index measure).\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"Levenshtein distance\",\n          \"description\": \"a score to measure the distance between two character sequences).\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/385\",\n        \"https://github.com/mapping-commons/sssom/pull/386\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/similarity_score.sssom.tsv\"\n      ],\n      \"is_a\": \"similarity_measure\",\n      \"domain\": \"MappingSet\",\n      \"slot_uri\": \"https://w3id.org/sssom/similarity_measure\",\n      \"alias\": \"similarity_measure\",\n      \"owner\": \"MappingSet\",\n      \"domain_of\": [\n        \"MappingSet\"\n      ],\n      \"is_usage_slot\": true,\n      \"usage_slot_name\": \"similarity_measure\",\n      \"range\": \"string\",\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_set_curation_rule\",\n      \"definition_uri\": \"https://w3id.org/sssom/curation_rule\",\n      \"instantiates\": [\n        \"sssom:Versionable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"added_in\",\n          \"value\": \"1.1\",\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"A curation rule is a (potentially) complex condition executed by an agent that led to the establishment of a mapping. Curation rules often involve complex domain-specific considerations, which are hard to capture in an automated fashion. The curation rule is captured as a resource rather than a string, which enables higher levels of transparency and sharing across mapping sets. The URI representation of the curation rule is expected to be a resolvable identifier which provides details about the nature of the curation rule.\",\n      \"examples\": [\n        {\n          \"value\": \"DISEASE_MAPPING_COMMONS_RULES:MPR2\",\n          \"description\": \"A reference to the Disease Mapping Commons rule with the ID MPR2.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/166\",\n        \"https://github.com/mapping-commons/sssom/pull/258\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/curation_rule.sssom.tsv\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/curation_rule-propagated.sssom.tsv\"\n      ],\n      \"is_a\": \"curation_rule\",\n      \"domain\": \"MappingSet\",\n      \"slot_uri\": \"https://w3id.org/sssom/curation_rule\",\n      \"alias\": \"curation_rule\",\n      \"owner\": \"MappingSet\",\n      \"domain_of\": [\n        \"MappingSet\"\n      ],\n      \"is_usage_slot\": true,\n      \"usage_slot_name\": \"curation_rule\",\n      \"range\": \"EntityReference\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    },\n    {\n      \"name\": \"mapping_set_curation_rule_text\",\n      \"definition_uri\": \"https://w3id.org/sssom/curation_rule_text\",\n      \"instantiates\": [\n        \"sssom:Versionable\"\n      ],\n      \"annotations\": [\n        {\n          \"tag\": \"added_in\",\n          \"value\": \"1.1\",\n          \"@type\": \"Annotation\"\n        }\n      ],\n      \"description\": \"A curation rule is a (potentially) complex condition executed by an agent that led to the establishment of a mapping. Curation rules often involve complex domain-specific considerations, which are hard to capture in an automated fashion. The curation rule should be captured as a resource (entity reference) rather than a string (see curation_rule element), which enables higher levels of transparency and sharing across mapping sets. The textual representation of curation rule is intended to be used in cases where the creation of a resource is not practical from the perspective of the mapping_provider.\",\n      \"examples\": [\n        {\n          \"value\": \"The two phenotypes inhere in homologous structures and exhibit the same phenotypic quality.\",\n          \"@type\": \"Example\"\n        },\n        {\n          \"value\": \"The two diseases are used synonymous in the medical literature.\",\n          \"@type\": \"Example\"\n        }\n      ],\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/166\",\n        \"https://github.com/mapping-commons/sssom/pull/258\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/curation_rule_text.sssom.tsv\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/curation_rule_text-propagated.sssom.tsv\"\n      ],\n      \"is_a\": \"curation_rule_text\",\n      \"domain\": \"MappingSet\",\n      \"slot_uri\": \"https://w3id.org/sssom/curation_rule_text\",\n      \"alias\": \"curation_rule_text\",\n      \"owner\": \"MappingSet\",\n      \"domain_of\": [\n        \"MappingSet\"\n      ],\n      \"is_usage_slot\": true,\n      \"usage_slot_name\": \"curation_rule_text\",\n      \"range\": \"string\",\n      \"multivalued\": true,\n      \"@type\": \"SlotDefinition\"\n    }\n  ],\n  \"classes\": [\n    {\n      \"name\": \"MappingSet\",\n      \"definition_uri\": \"https://w3id.org/sssom/MappingSet\",\n      \"description\": \"Represents a set of mappings.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slots\": [\n        \"sssom_version\",\n        \"curie_map\",\n        \"mappings\",\n        \"mapping_set_id\",\n        \"mapping_set_version\",\n        \"mapping_set_source\",\n        \"mapping_set_title\",\n        \"mapping_set_description\",\n        \"mapping_set_confidence\",\n        \"creator_id\",\n        \"creator_label\",\n        \"mapping_set_license\",\n        \"subject_type\",\n        \"subject_source\",\n        \"subject_source_version\",\n        \"object_type\",\n        \"object_source\",\n        \"object_source_version\",\n        \"predicate_type\",\n        \"mapping_provider\",\n        \"cardinality_scope\",\n        \"mapping_tool\",\n        \"mapping_tool_id\",\n        \"mapping_tool_version\",\n        \"mapping_date\",\n        \"publication_date\",\n        \"subject_match_field\",\n        \"object_match_field\",\n        \"subject_preprocessing\",\n        \"object_preprocessing\",\n        \"mapping_set_similarity_measure\",\n        \"mapping_set_curation_rule\",\n        \"mapping_set_curation_rule_text\",\n        \"see_also\",\n        \"issue_tracker\",\n        \"other\",\n        \"comment\",\n        \"extension_definitions\"\n      ],\n      \"slot_usage\": {},\n      \"class_uri\": \"https://w3id.org/sssom/MappingSet\",\n      \"@type\": \"ClassDefinition\"\n    },\n    {\n      \"name\": \"Mapping\",\n      \"definition_uri\": \"https://w3id.org/sssom/Mapping\",\n      \"description\": \"Represents an individual mapping between a pair of entities.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"owl:Axiom\"\n      ],\n      \"slots\": [\n        \"record_id\",\n        \"subject_id\",\n        \"subject_label\",\n        \"subject_category\",\n        \"predicate_id\",\n        \"predicate_label\",\n        \"predicate_modifier\",\n        \"object_id\",\n        \"object_label\",\n        \"object_category\",\n        \"mapping_justification\",\n        \"author_id\",\n        \"author_label\",\n        \"reviewer_id\",\n        \"reviewer_label\",\n        \"creator_id\",\n        \"creator_label\",\n        \"license\",\n        \"subject_type\",\n        \"subject_source\",\n        \"subject_source_version\",\n        \"object_type\",\n        \"object_source\",\n        \"object_source_version\",\n        \"predicate_type\",\n        \"mapping_provider\",\n        \"mapping_source\",\n        \"mapping_cardinality\",\n        \"cardinality_scope\",\n        \"mapping_tool\",\n        \"mapping_tool_id\",\n        \"mapping_tool_version\",\n        \"mapping_date\",\n        \"publication_date\",\n        \"review_date\",\n        \"confidence\",\n        \"reviewer_agreement\",\n        \"curation_rule\",\n        \"curation_rule_text\",\n        \"subject_match_field\",\n        \"object_match_field\",\n        \"match_string\",\n        \"subject_preprocessing\",\n        \"object_preprocessing\",\n        \"similarity_score\",\n        \"similarity_measure\",\n        \"see_also\",\n        \"issue_tracker_item\",\n        \"other\",\n        \"comment\"\n      ],\n      \"slot_usage\": {},\n      \"class_uri\": \"http://www.w3.org/2002/07/owl#Axiom\",\n      \"unique_keys\": [\n        {\n          \"unique_key_name\": \"record_identifier\",\n          \"unique_key_slots\": [\n            \"record_id\"\n          ],\n          \"description\": \"Each mapping within a mapping set MAY be identified by a unique, opaque record identifier. This slot MUST be used consistently, in that either all mappings in the set have a such a record identifier, or none of them have one. The behaviour when a set contains both mappings with a record identifier and mappings without a record identifier is unspecified. The behaviour when two mappings have the same record identifier is unspecified.\",\n          \"@type\": \"UniqueKey\"\n        }\n      ],\n      \"rules\": [\n        {\n          \"preconditions\": {\n            \"slot_conditions\": [\n              {\n                \"name\": \"subject_type\",\n                \"equals_string\": \"rdfs literal\",\n                \"@type\": \"SlotDefinition\"\n              }\n            ],\n            \"@type\": \"AnonymousClassExpression\"\n          },\n          \"postconditions\": {\n            \"slot_conditions\": [\n              {\n                \"name\": \"subject_label\",\n                \"required\": true,\n                \"@type\": \"SlotDefinition\"\n              }\n            ],\n            \"@type\": \"AnonymousClassExpression\"\n          },\n          \"@type\": \"ClassRule\"\n        },\n        {\n          \"preconditions\": {\n            \"slot_conditions\": [\n              {\n                \"name\": \"subject_type\",\n                \"none_of\": [\n                  {\n                    \"equals_string\": \"rdfs literal\",\n                    \"@type\": \"AnonymousSlotExpression\"\n                  }\n                ],\n                \"@type\": \"SlotDefinition\"\n              }\n            ],\n            \"@type\": \"AnonymousClassExpression\"\n          },\n          \"postconditions\": {\n            \"slot_conditions\": [\n              {\n                \"name\": \"subject_id\",\n                \"required\": true,\n                \"@type\": \"SlotDefinition\"\n              }\n            ],\n            \"@type\": \"AnonymousClassExpression\"\n          },\n          \"@type\": \"ClassRule\"\n        },\n        {\n          \"preconditions\": {\n            \"slot_conditions\": [\n              {\n                \"name\": \"object_type\",\n                \"equals_string\": \"rdfs literal\",\n                \"@type\": \"SlotDefinition\"\n              }\n            ],\n            \"@type\": \"AnonymousClassExpression\"\n          },\n          \"postconditions\": {\n            \"slot_conditions\": [\n              {\n                \"name\": \"object_label\",\n                \"required\": true,\n                \"@type\": \"SlotDefinition\"\n              }\n            ],\n            \"@type\": \"AnonymousClassExpression\"\n          },\n          \"@type\": \"ClassRule\"\n        },\n        {\n          \"preconditions\": {\n            \"slot_conditions\": [\n              {\n                \"name\": \"object_type\",\n                \"none_of\": [\n                  {\n                    \"equals_string\": \"rdfs literal\",\n                    \"@type\": \"AnonymousSlotExpression\"\n                  }\n                ],\n                \"@type\": \"SlotDefinition\"\n              }\n            ],\n            \"@type\": \"AnonymousClassExpression\"\n          },\n          \"postconditions\": {\n            \"slot_conditions\": [\n              {\n                \"name\": \"object_id\",\n                \"required\": true,\n                \"@type\": \"SlotDefinition\"\n              }\n            ],\n            \"@type\": \"AnonymousClassExpression\"\n          },\n          \"@type\": \"ClassRule\"\n        },\n        {\n          \"preconditions\": {\n            \"slot_conditions\": [\n              {\n                \"name\": \"review_date\",\n                \"required\": true,\n                \"@type\": \"SlotDefinition\"\n              }\n            ],\n            \"@type\": \"AnonymousClassExpression\"\n          },\n          \"postconditions\": {\n            \"any_of\": [\n              {\n                \"slot_conditions\": [\n                  {\n                    \"name\": \"reviewer_id\",\n                    \"required\": true,\n                    \"@type\": \"SlotDefinition\"\n                  }\n                ],\n                \"@type\": \"AnonymousClassExpression\"\n              },\n              {\n                \"slot_conditions\": [\n                  {\n                    \"name\": \"reviewer_label\",\n                    \"required\": true,\n                    \"@type\": \"SlotDefinition\"\n                  }\n                ],\n                \"@type\": \"AnonymousClassExpression\"\n              }\n            ],\n            \"@type\": \"AnonymousClassExpression\"\n          },\n          \"description\": \"If a review date is provided, then at at least one of reviewer_id or reviewer_label must also be provided\",\n          \"@type\": \"ClassRule\"\n        },\n        {\n          \"preconditions\": {\n            \"slot_conditions\": [\n              {\n                \"name\": \"reviewer_agreement\",\n                \"required\": true,\n                \"@type\": \"SlotDefinition\"\n              }\n            ],\n            \"@type\": \"AnonymousClassExpression\"\n          },\n          \"postconditions\": {\n            \"any_of\": [\n              {\n                \"slot_conditions\": [\n                  {\n                    \"name\": \"reviewer_id\",\n                    \"required\": true,\n                    \"@type\": \"SlotDefinition\"\n                  }\n                ],\n                \"@type\": \"AnonymousClassExpression\"\n              },\n              {\n                \"slot_conditions\": [\n                  {\n                    \"name\": \"reviewer_label\",\n                    \"required\": true,\n                    \"@type\": \"SlotDefinition\"\n                  }\n                ],\n                \"@type\": \"AnonymousClassExpression\"\n              }\n            ],\n            \"@type\": \"AnonymousClassExpression\"\n          },\n          \"description\": \"If a reviewer agreement value is provided, then at at least one of reviewer_id or reviewer_label must also be provided\",\n          \"@type\": \"ClassRule\"\n        }\n      ],\n      \"@type\": \"ClassDefinition\"\n    },\n    {\n      \"name\": \"MappingRegistry\",\n      \"definition_uri\": \"https://w3id.org/sssom/MappingRegistry\",\n      \"description\": \"A registry for managing mapping sets. It holds a set of mapping set references, and can import other registries.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slots\": [\n        \"mapping_registry_id\",\n        \"mapping_registry_title\",\n        \"mapping_registry_description\",\n        \"imports\",\n        \"mapping_set_references\",\n        \"documentation\",\n        \"homepage\",\n        \"issue_tracker\"\n      ],\n      \"slot_usage\": {},\n      \"class_uri\": \"https://w3id.org/sssom/MappingRegistry\",\n      \"@type\": \"ClassDefinition\"\n    },\n    {\n      \"name\": \"MappingSetReference\",\n      \"definition_uri\": \"https://w3id.org/sssom/MappingSetReference\",\n      \"description\": \"A reference to a mapping set. It allows to augment mapping set metadata from the perspective of the registry, for example, providing confidence, or a local filename or a grouping.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slots\": [\n        \"mapping_set_id\",\n        \"mirror_from\",\n        \"registry_confidence\",\n        \"mapping_set_group\",\n        \"last_updated\",\n        \"local_name\"\n      ],\n      \"slot_usage\": {},\n      \"class_uri\": \"https://w3id.org/sssom/MappingSetReference\",\n      \"@type\": \"ClassDefinition\"\n    },\n    {\n      \"name\": \"Prefix\",\n      \"definition_uri\": \"https://w3id.org/sssom/Prefix\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slots\": [\n        \"prefix_name\",\n        \"prefix_url\"\n      ],\n      \"slot_usage\": {},\n      \"class_uri\": \"https://w3id.org/sssom/Prefix\",\n      \"@type\": \"ClassDefinition\"\n    },\n    {\n      \"name\": \"ExtensionDefinition\",\n      \"definition_uri\": \"https://w3id.org/sssom/ExtensionDefinition\",\n      \"description\": \"A definition of an extension (non-standard) slot.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"slots\": [\n        \"extensionDefinition__slot_name\",\n        \"extensionDefinition__property\",\n        \"extensionDefinition__type_hint\"\n      ],\n      \"slot_usage\": {},\n      \"attributes\": [\n        {\n          \"name\": \"slot_name\",\n          \"description\": \"The name of the extension slot.\",\n          \"range\": \"ncname\",\n          \"required\": true,\n          \"@type\": \"SlotDefinition\"\n        },\n        {\n          \"name\": \"property\",\n          \"description\": \"The property associated with the extension slot. It is intended to provide a non-ambiguous meaning to the slot (contrary to the slot_name, which for brevity reasons may be ambiguous).\",\n          \"range\": \"uriorcurie\",\n          \"@type\": \"SlotDefinition\"\n        },\n        {\n          \"name\": \"type_hint\",\n          \"description\": \"Expected type of the values of the extension slot.\",\n          \"range\": \"uriorcurie\",\n          \"@type\": \"SlotDefinition\"\n        }\n      ],\n      \"class_uri\": \"https://w3id.org/sssom/ExtensionDefinition\",\n      \"@type\": \"ClassDefinition\"\n    },\n    {\n      \"name\": \"Propagatable\",\n      \"definition_uri\": \"https://w3id.org/sssom/Propagatable\",\n      \"description\": \"Metamodel extension class to describe slots whose value can be propagated down from the MappingSet class to the Mapping class.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/305\"\n      ],\n      \"mappings\": [\n        \"sssom:Propagatable\"\n      ],\n      \"slots\": [\n        \"propagatable__propagated\"\n      ],\n      \"slot_usage\": {},\n      \"attributes\": [\n        {\n          \"name\": \"propagated\",\n          \"description\": \"Indicates whether a slot can be propagated from a mapping down to individual mappings.\",\n          \"range\": \"boolean\",\n          \"@type\": \"SlotDefinition\"\n        }\n      ],\n      \"class_uri\": \"https://w3id.org/sssom/Propagatable\",\n      \"@type\": \"ClassDefinition\"\n    },\n    {\n      \"name\": \"Versionable\",\n      \"definition_uri\": \"https://w3id.org/sssom/Versionable\",\n      \"description\": \"Metamodel extension class to manage slots that may not exist in all versions of the model.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"mappings\": [\n        \"sssom:Versionable\"\n      ],\n      \"slots\": [\n        \"versionable__added_in\"\n      ],\n      \"slot_usage\": {},\n      \"attributes\": [\n        {\n          \"name\": \"added_in\",\n          \"description\": \"The version of the specification in which the slot was added. If not specified, the slot must be assumed to have been added in version 1.0.\",\n          \"range\": \"sssom_version_enum\",\n          \"@type\": \"SlotDefinition\"\n        }\n      ],\n      \"class_uri\": \"https://w3id.org/sssom/Versionable\",\n      \"@type\": \"ClassDefinition\"\n    },\n    {\n      \"name\": \"NoTermFound\",\n      \"definition_uri\": \"https://w3id.org/sssom/NoTermFound\",\n      \"description\": \"sssom:NoTermFound can be used in place of a subject_id or object_id when the corresponding entity could not be found. It SHOULD be used in conjunction with a corresponding subject_source or object_source to signify where the term was not found.\",\n      \"from_schema\": \"https://w3id.org/sssom/schema/\",\n      \"see_also\": [\n        \"https://github.com/mapping-commons/sssom/issues/28\",\n        \"https://github.com/mapping-commons/sssom/blob/master/examples/schema/no_term_found.sssom.tsv\"\n      ],\n      \"mappings\": [\n        \"sssom:NoTermFound\"\n      ],\n      \"slot_usage\": {},\n      \"class_uri\": \"https://w3id.org/sssom/NoTermFound\",\n      \"@type\": \"ClassDefinition\"\n    }\n  ],\n  \"metamodel_version\": \"1.7.0\",\n  \"source_file\": \"sssom_schema.yaml\",\n  \"source_file_date\": \"2026-04-04T08:06:51\",\n  \"source_file_size\": 58930,\n  \"generation_date\": \"2026-04-08T14:02:56\",\n  \"@type\": \"SchemaDefinition\",\n  \"@context\": [\n    \"project/jsonld/sssom_schema.context.jsonld\",\n    \"https://w3id.org/linkml/types.context.jsonld\",\n    {\n      \"@base\": \"https://w3id.org/sssom/\"\n    }\n  ]\n}\n"
  },
  {
    "path": "src/sssom_schema/datamodel/__init__.py",
    "content": ""
  },
  {
    "path": "src/sssom_schema/datamodel/sssom_schema.py",
    "content": "# Auto generated from sssom_schema.yaml by pythongen.py version: 0.0.1\n# Generation date: 2026-04-14T16:00:32\n# Schema: sssom\n#\n# id: https://w3id.org/sssom/schema/\n# description: Datamodel for Simple Standard for Sharing Ontological Mappings (SSSOM)\n# license: https://creativecommons.org/publicdomain/zero/1.0/\n\nimport dataclasses\nimport re\nfrom dataclasses import dataclass\nfrom datetime import (\n    date,\n    datetime,\n    time\n)\nfrom typing import (\n    Any,\n    ClassVar,\n    Dict,\n    List,\n    Optional,\n    Union\n)\n\nfrom jsonasobj2 import (\n    JsonObj,\n    as_dict\n)\nfrom linkml_runtime.linkml_model.meta import (\n    EnumDefinition,\n    PermissibleValue,\n    PvFormulaOptions\n)\nfrom linkml_runtime.utils.curienamespace import CurieNamespace\nfrom linkml_runtime.utils.enumerations import EnumDefinitionImpl\nfrom linkml_runtime.utils.formatutils import (\n    camelcase,\n    sfx,\n    underscore\n)\nfrom linkml_runtime.utils.metamodelcore import (\n    bnode,\n    empty_dict,\n    empty_list\n)\nfrom linkml_runtime.utils.slot import Slot\nfrom linkml_runtime.utils.yamlutils import (\n    YAMLRoot,\n    extended_float,\n    extended_int,\n    extended_str\n)\nfrom rdflib import (\n    Namespace,\n    URIRef\n)\n\nfrom linkml_runtime.linkml_model.types import Boolean, Date, Double, Ncname, String, Uri, Uriorcurie\nfrom linkml_runtime.utils.metamodelcore import Bool, NCName, URI, URIorCURIE, XSDDate\n\nmetamodel_version = \"1.7.0\"\nversion = None\n\n# Namespaces\nDCTERMS = CurieNamespace('dcterms', 'http://purl.org/dc/terms/')\nLINKML = CurieNamespace('linkml', 'https://w3id.org/linkml/')\nOBOINOWL = CurieNamespace('oboInOwl', 'http://www.geneontology.org/formats/oboInOwl#')\nOWL = CurieNamespace('owl', 'http://www.w3.org/2002/07/owl#')\nPAV = CurieNamespace('pav', 'http://purl.org/pav/')\nPROV = CurieNamespace('prov', 'http://www.w3.org/ns/prov#')\nRDF = CurieNamespace('rdf', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#')\nRDFS = CurieNamespace('rdfs', 'http://www.w3.org/2000/01/rdf-schema#')\nSEMAPV = CurieNamespace('semapv', 'https://w3id.org/semapv/vocab/')\nSKOS = CurieNamespace('skos', 'http://www.w3.org/2004/02/skos/core#')\nSSSOM = CurieNamespace('sssom', 'https://w3id.org/sssom/')\nXSD = CurieNamespace('xsd', 'http://www.w3.org/2001/XMLSchema#')\nDEFAULT_ = SSSOM\n\n\n# Types\nclass EntityReference(Uriorcurie):\n    \"\"\" A reference to an entity involved in the mapping.\n \"\"\"\n    type_class_uri = RDFS[\"Resource\"]\n    type_class_curie = \"rdfs:Resource\"\n    type_name = \"EntityReference\"\n    type_model_uri = SSSOM.EntityReference\n\n\nclass NonRelativeURI(Uri):\n    \"\"\" A URI as per RFC 3986, that is a string that matches the production of the \"URI\" rule defined in Appendix A of that RFC. Contrary to the underlying LinkML type, this specifically excludes _relative URI references_, which do not start with a scheme component. Relative URI references are forbidden because SSSOM has no built-in mechanism to provide the base URI that would be needed to resolve relative URI references into non-relative ones. \"\"\"\n    type_class_uri = XSD[\"anyURI\"]\n    type_class_curie = \"xsd:anyURI\"\n    type_name = \"NonRelativeURI\"\n    type_model_uri = SSSOM.NonRelativeURI\n\n\n# Class references\nclass PrefixPrefixName(NCName):\n    pass\n\n\n@dataclass(repr=False)\nclass MappingSet(YAMLRoot):\n    \"\"\"\n    Represents a set of mappings.\n    \"\"\"\n    _inherited_slots: ClassVar[list[str]] = []\n\n    class_class_uri: ClassVar[URIRef] = SSSOM[\"MappingSet\"]\n    class_class_curie: ClassVar[str] = \"sssom:MappingSet\"\n    class_name: ClassVar[str] = \"mapping set\"\n    class_model_uri: ClassVar[URIRef] = SSSOM.MappingSet\n\n    mapping_set_id: Union[str, NonRelativeURI] = None\n    license: Union[str, NonRelativeURI] = None\n    sssom_version: Optional[Union[str, \"SssomVersionEnum\"]] = None\n    curie_map: Optional[Union[dict[Union[str, PrefixPrefixName], Union[dict, \"Prefix\"]], list[Union[dict, \"Prefix\"]]]] = empty_dict()\n    mappings: Optional[Union[Union[dict, \"Mapping\"], list[Union[dict, \"Mapping\"]]]] = empty_list()\n    mapping_set_version: Optional[str] = None\n    mapping_set_source: Optional[Union[Union[str, NonRelativeURI], list[Union[str, NonRelativeURI]]]] = empty_list()\n    mapping_set_title: Optional[str] = None\n    mapping_set_description: Optional[str] = None\n    mapping_set_confidence: Optional[float] = None\n    creator_id: Optional[Union[Union[str, EntityReference], list[Union[str, EntityReference]]]] = empty_list()\n    creator_label: Optional[Union[str, list[str]]] = empty_list()\n    subject_type: Optional[Union[str, \"EntityTypeEnum\"]] = None\n    subject_source: Optional[Union[str, EntityReference]] = None\n    subject_source_version: Optional[str] = None\n    object_type: Optional[Union[str, \"EntityTypeEnum\"]] = None\n    object_source: Optional[Union[str, EntityReference]] = None\n    object_source_version: Optional[str] = None\n    predicate_type: Optional[Union[str, \"EntityTypeEnum\"]] = None\n    mapping_provider: Optional[Union[str, NonRelativeURI]] = None\n    cardinality_scope: Optional[Union[str, list[str]]] = empty_list()\n    mapping_tool: Optional[str] = None\n    mapping_tool_id: Optional[Union[str, EntityReference]] = None\n    mapping_tool_version: Optional[str] = None\n    mapping_date: Optional[Union[str, XSDDate]] = None\n    publication_date: Optional[Union[str, XSDDate]] = None\n    subject_match_field: Optional[Union[Union[str, EntityReference], list[Union[str, EntityReference]]]] = empty_list()\n    object_match_field: Optional[Union[Union[str, EntityReference], list[Union[str, EntityReference]]]] = empty_list()\n    subject_preprocessing: Optional[Union[Union[str, EntityReference], list[Union[str, EntityReference]]]] = empty_list()\n    object_preprocessing: Optional[Union[Union[str, EntityReference], list[Union[str, EntityReference]]]] = empty_list()\n    similarity_measure: Optional[str] = None\n    curation_rule: Optional[Union[Union[str, EntityReference], list[Union[str, EntityReference]]]] = empty_list()\n    curation_rule_text: Optional[Union[str, list[str]]] = empty_list()\n    see_also: Optional[Union[Union[str, NonRelativeURI], list[Union[str, NonRelativeURI]]]] = empty_list()\n    issue_tracker: Optional[Union[str, NonRelativeURI]] = None\n    other: Optional[str] = None\n    comment: Optional[str] = None\n    extension_definitions: Optional[Union[Union[dict, \"ExtensionDefinition\"], list[Union[dict, \"ExtensionDefinition\"]]]] = empty_list()\n\n    def __post_init__(self, *_: str, **kwargs: Any):\n        if self._is_empty(self.mapping_set_id):\n            self.MissingRequiredField(\"mapping_set_id\")\n        if not isinstance(self.mapping_set_id, NonRelativeURI):\n            self.mapping_set_id = NonRelativeURI(self.mapping_set_id)\n\n        if self._is_empty(self.license):\n            self.MissingRequiredField(\"license\")\n        if not isinstance(self.license, NonRelativeURI):\n            self.license = NonRelativeURI(self.license)\n\n        if self.sssom_version is not None and not isinstance(self.sssom_version, SssomVersionEnum):\n            self.sssom_version = SssomVersionEnum(self.sssom_version)\n\n        self._normalize_inlined_as_dict(slot_name=\"curie_map\", slot_type=Prefix, key_name=\"prefix_name\", keyed=True)\n\n        self._normalize_inlined_as_list(slot_name=\"mappings\", slot_type=Mapping, key_name=\"predicate_id\", keyed=False)\n\n        if self.mapping_set_version is not None and not isinstance(self.mapping_set_version, str):\n            self.mapping_set_version = str(self.mapping_set_version)\n\n        if not isinstance(self.mapping_set_source, list):\n            self.mapping_set_source = [self.mapping_set_source] if self.mapping_set_source is not None else []\n        self.mapping_set_source = [v if isinstance(v, NonRelativeURI) else NonRelativeURI(v) for v in self.mapping_set_source]\n\n        if self.mapping_set_title is not None and not isinstance(self.mapping_set_title, str):\n            self.mapping_set_title = str(self.mapping_set_title)\n\n        if self.mapping_set_description is not None and not isinstance(self.mapping_set_description, str):\n            self.mapping_set_description = str(self.mapping_set_description)\n\n        if self.mapping_set_confidence is not None and not isinstance(self.mapping_set_confidence, float):\n            self.mapping_set_confidence = float(self.mapping_set_confidence)\n\n        if not isinstance(self.creator_id, list):\n            self.creator_id = [self.creator_id] if self.creator_id is not None else []\n        self.creator_id = [v if isinstance(v, EntityReference) else EntityReference(v) for v in self.creator_id]\n\n        if not isinstance(self.creator_label, list):\n            self.creator_label = [self.creator_label] if self.creator_label is not None else []\n        self.creator_label = [v if isinstance(v, str) else str(v) for v in self.creator_label]\n\n        if self.subject_type is not None and not isinstance(self.subject_type, EntityTypeEnum):\n            self.subject_type = EntityTypeEnum(self.subject_type)\n\n        if self.subject_source is not None and not isinstance(self.subject_source, EntityReference):\n            self.subject_source = EntityReference(self.subject_source)\n\n        if self.subject_source_version is not None and not isinstance(self.subject_source_version, str):\n            self.subject_source_version = str(self.subject_source_version)\n\n        if self.object_type is not None and not isinstance(self.object_type, EntityTypeEnum):\n            self.object_type = EntityTypeEnum(self.object_type)\n\n        if self.object_source is not None and not isinstance(self.object_source, EntityReference):\n            self.object_source = EntityReference(self.object_source)\n\n        if self.object_source_version is not None and not isinstance(self.object_source_version, str):\n            self.object_source_version = str(self.object_source_version)\n\n        if self.predicate_type is not None and not isinstance(self.predicate_type, EntityTypeEnum):\n            self.predicate_type = EntityTypeEnum(self.predicate_type)\n\n        if self.mapping_provider is not None and not isinstance(self.mapping_provider, NonRelativeURI):\n            self.mapping_provider = NonRelativeURI(self.mapping_provider)\n\n        if not isinstance(self.cardinality_scope, list):\n            self.cardinality_scope = [self.cardinality_scope] if self.cardinality_scope is not None else []\n        self.cardinality_scope = [v if isinstance(v, str) else str(v) for v in self.cardinality_scope]\n\n        if self.mapping_tool is not None and not isinstance(self.mapping_tool, str):\n            self.mapping_tool = str(self.mapping_tool)\n\n        if self.mapping_tool_id is not None and not isinstance(self.mapping_tool_id, EntityReference):\n            self.mapping_tool_id = EntityReference(self.mapping_tool_id)\n\n        if self.mapping_tool_version is not None and not isinstance(self.mapping_tool_version, str):\n            self.mapping_tool_version = str(self.mapping_tool_version)\n\n        if self.mapping_date is not None and not isinstance(self.mapping_date, XSDDate):\n            self.mapping_date = XSDDate(self.mapping_date)\n\n        if self.publication_date is not None and not isinstance(self.publication_date, XSDDate):\n            self.publication_date = XSDDate(self.publication_date)\n\n        if not isinstance(self.subject_match_field, list):\n            self.subject_match_field = [self.subject_match_field] if self.subject_match_field is not None else []\n        self.subject_match_field = [v if isinstance(v, EntityReference) else EntityReference(v) for v in self.subject_match_field]\n\n        if not isinstance(self.object_match_field, list):\n            self.object_match_field = [self.object_match_field] if self.object_match_field is not None else []\n        self.object_match_field = [v if isinstance(v, EntityReference) else EntityReference(v) for v in self.object_match_field]\n\n        if not isinstance(self.subject_preprocessing, list):\n            self.subject_preprocessing = [self.subject_preprocessing] if self.subject_preprocessing is not None else []\n        self.subject_preprocessing = [v if isinstance(v, EntityReference) else EntityReference(v) for v in self.subject_preprocessing]\n\n        if not isinstance(self.object_preprocessing, list):\n            self.object_preprocessing = [self.object_preprocessing] if self.object_preprocessing is not None else []\n        self.object_preprocessing = [v if isinstance(v, EntityReference) else EntityReference(v) for v in self.object_preprocessing]\n\n        if self.similarity_measure is not None and not isinstance(self.similarity_measure, str):\n            self.similarity_measure = str(self.similarity_measure)\n\n        if not isinstance(self.curation_rule, list):\n            self.curation_rule = [self.curation_rule] if self.curation_rule is not None else []\n        self.curation_rule = [v if isinstance(v, EntityReference) else EntityReference(v) for v in self.curation_rule]\n\n        if not isinstance(self.curation_rule_text, list):\n            self.curation_rule_text = [self.curation_rule_text] if self.curation_rule_text is not None else []\n        self.curation_rule_text = [v if isinstance(v, str) else str(v) for v in self.curation_rule_text]\n\n        if not isinstance(self.see_also, list):\n            self.see_also = [self.see_also] if self.see_also is not None else []\n        self.see_also = [v if isinstance(v, NonRelativeURI) else NonRelativeURI(v) for v in self.see_also]\n\n        if self.issue_tracker is not None and not isinstance(self.issue_tracker, NonRelativeURI):\n            self.issue_tracker = NonRelativeURI(self.issue_tracker)\n\n        if self.other is not None and not isinstance(self.other, str):\n            self.other = str(self.other)\n\n        if self.comment is not None and not isinstance(self.comment, str):\n            self.comment = str(self.comment)\n\n        self._normalize_inlined_as_list(slot_name=\"extension_definitions\", slot_type=ExtensionDefinition, key_name=\"slot_name\", keyed=False)\n\n        super().__post_init__(**kwargs)\n\n\n@dataclass(repr=False)\nclass Mapping(YAMLRoot):\n    \"\"\"\n    Represents an individual mapping between a pair of entities.\n    \"\"\"\n    _inherited_slots: ClassVar[list[str]] = []\n\n    class_class_uri: ClassVar[URIRef] = OWL[\"Axiom\"]\n    class_class_curie: ClassVar[str] = \"owl:Axiom\"\n    class_name: ClassVar[str] = \"mapping\"\n    class_model_uri: ClassVar[URIRef] = SSSOM.Mapping\n\n    predicate_id: Union[str, EntityReference] = None\n    mapping_justification: Union[str, EntityReference] = None\n    record_id: Optional[Union[str, EntityReference]] = None\n    subject_id: Optional[Union[str, EntityReference]] = None\n    subject_label: Optional[str] = None\n    subject_category: Optional[str] = None\n    predicate_label: Optional[str] = None\n    predicate_modifier: Optional[Union[str, \"PredicateModifierEnum\"]] = None\n    object_id: Optional[Union[str, EntityReference]] = None\n    object_label: Optional[str] = None\n    object_category: Optional[str] = None\n    author_id: Optional[Union[Union[str, EntityReference], list[Union[str, EntityReference]]]] = empty_list()\n    author_label: Optional[Union[str, list[str]]] = empty_list()\n    reviewer_id: Optional[Union[Union[str, EntityReference], list[Union[str, EntityReference]]]] = empty_list()\n    reviewer_label: Optional[Union[str, list[str]]] = empty_list()\n    creator_id: Optional[Union[Union[str, EntityReference], list[Union[str, EntityReference]]]] = empty_list()\n    creator_label: Optional[Union[str, list[str]]] = empty_list()\n    license: Optional[Union[str, NonRelativeURI]] = None\n    subject_type: Optional[Union[str, \"EntityTypeEnum\"]] = None\n    subject_source: Optional[Union[str, EntityReference]] = None\n    subject_source_version: Optional[str] = None\n    object_type: Optional[Union[str, \"EntityTypeEnum\"]] = None\n    object_source: Optional[Union[str, EntityReference]] = None\n    object_source_version: Optional[str] = None\n    predicate_type: Optional[Union[str, \"EntityTypeEnum\"]] = None\n    mapping_provider: Optional[Union[str, NonRelativeURI]] = None\n    mapping_source: Optional[Union[str, EntityReference]] = None\n    mapping_cardinality: Optional[Union[str, \"MappingCardinalityEnum\"]] = None\n    cardinality_scope: Optional[Union[str, list[str]]] = empty_list()\n    mapping_tool: Optional[str] = None\n    mapping_tool_id: Optional[Union[str, EntityReference]] = None\n    mapping_tool_version: Optional[str] = None\n    mapping_date: Optional[Union[str, XSDDate]] = None\n    publication_date: Optional[Union[str, XSDDate]] = None\n    review_date: Optional[Union[str, XSDDate]] = None\n    confidence: Optional[float] = None\n    reviewer_agreement: Optional[float] = None\n    curation_rule: Optional[Union[Union[str, EntityReference], list[Union[str, EntityReference]]]] = empty_list()\n    curation_rule_text: Optional[Union[str, list[str]]] = empty_list()\n    subject_match_field: Optional[Union[Union[str, EntityReference], list[Union[str, EntityReference]]]] = empty_list()\n    object_match_field: Optional[Union[Union[str, EntityReference], list[Union[str, EntityReference]]]] = empty_list()\n    match_string: Optional[Union[str, list[str]]] = empty_list()\n    subject_preprocessing: Optional[Union[Union[str, EntityReference], list[Union[str, EntityReference]]]] = empty_list()\n    object_preprocessing: Optional[Union[Union[str, EntityReference], list[Union[str, EntityReference]]]] = empty_list()\n    similarity_score: Optional[float] = None\n    similarity_measure: Optional[str] = None\n    see_also: Optional[Union[Union[str, NonRelativeURI], list[Union[str, NonRelativeURI]]]] = empty_list()\n    issue_tracker_item: Optional[Union[str, EntityReference]] = None\n    other: Optional[str] = None\n    comment: Optional[str] = None\n\n    def __post_init__(self, *_: str, **kwargs: Any):\n        if self._is_empty(self.predicate_id):\n            self.MissingRequiredField(\"predicate_id\")\n        if not isinstance(self.predicate_id, EntityReference):\n            self.predicate_id = EntityReference(self.predicate_id)\n\n        if self._is_empty(self.mapping_justification):\n            self.MissingRequiredField(\"mapping_justification\")\n        if not isinstance(self.mapping_justification, EntityReference):\n            self.mapping_justification = EntityReference(self.mapping_justification)\n\n        if self.record_id is not None and not isinstance(self.record_id, EntityReference):\n            self.record_id = EntityReference(self.record_id)\n\n        if self.subject_id is not None and not isinstance(self.subject_id, EntityReference):\n            self.subject_id = EntityReference(self.subject_id)\n\n        if self.subject_label is not None and not isinstance(self.subject_label, str):\n            self.subject_label = str(self.subject_label)\n\n        if self.subject_category is not None and not isinstance(self.subject_category, str):\n            self.subject_category = str(self.subject_category)\n\n        if self.predicate_label is not None and not isinstance(self.predicate_label, str):\n            self.predicate_label = str(self.predicate_label)\n\n        if self.predicate_modifier is not None and not isinstance(self.predicate_modifier, PredicateModifierEnum):\n            self.predicate_modifier = PredicateModifierEnum(self.predicate_modifier)\n\n        if self.object_id is not None and not isinstance(self.object_id, EntityReference):\n            self.object_id = EntityReference(self.object_id)\n\n        if self.object_label is not None and not isinstance(self.object_label, str):\n            self.object_label = str(self.object_label)\n\n        if self.object_category is not None and not isinstance(self.object_category, str):\n            self.object_category = str(self.object_category)\n\n        if not isinstance(self.author_id, list):\n            self.author_id = [self.author_id] if self.author_id is not None else []\n        self.author_id = [v if isinstance(v, EntityReference) else EntityReference(v) for v in self.author_id]\n\n        if not isinstance(self.author_label, list):\n            self.author_label = [self.author_label] if self.author_label is not None else []\n        self.author_label = [v if isinstance(v, str) else str(v) for v in self.author_label]\n\n        if not isinstance(self.reviewer_id, list):\n            self.reviewer_id = [self.reviewer_id] if self.reviewer_id is not None else []\n        self.reviewer_id = [v if isinstance(v, EntityReference) else EntityReference(v) for v in self.reviewer_id]\n\n        if not isinstance(self.reviewer_label, list):\n            self.reviewer_label = [self.reviewer_label] if self.reviewer_label is not None else []\n        self.reviewer_label = [v if isinstance(v, str) else str(v) for v in self.reviewer_label]\n\n        if not isinstance(self.creator_id, list):\n            self.creator_id = [self.creator_id] if self.creator_id is not None else []\n        self.creator_id = [v if isinstance(v, EntityReference) else EntityReference(v) for v in self.creator_id]\n\n        if not isinstance(self.creator_label, list):\n            self.creator_label = [self.creator_label] if self.creator_label is not None else []\n        self.creator_label = [v if isinstance(v, str) else str(v) for v in self.creator_label]\n\n        if self.license is not None and not isinstance(self.license, NonRelativeURI):\n            self.license = NonRelativeURI(self.license)\n\n        if self.subject_type is not None and not isinstance(self.subject_type, EntityTypeEnum):\n            self.subject_type = EntityTypeEnum(self.subject_type)\n\n        if self.subject_source is not None and not isinstance(self.subject_source, EntityReference):\n            self.subject_source = EntityReference(self.subject_source)\n\n        if self.subject_source_version is not None and not isinstance(self.subject_source_version, str):\n            self.subject_source_version = str(self.subject_source_version)\n\n        if self.object_type is not None and not isinstance(self.object_type, EntityTypeEnum):\n            self.object_type = EntityTypeEnum(self.object_type)\n\n        if self.object_source is not None and not isinstance(self.object_source, EntityReference):\n            self.object_source = EntityReference(self.object_source)\n\n        if self.object_source_version is not None and not isinstance(self.object_source_version, str):\n            self.object_source_version = str(self.object_source_version)\n\n        if self.predicate_type is not None and not isinstance(self.predicate_type, EntityTypeEnum):\n            self.predicate_type = EntityTypeEnum(self.predicate_type)\n\n        if self.mapping_provider is not None and not isinstance(self.mapping_provider, NonRelativeURI):\n            self.mapping_provider = NonRelativeURI(self.mapping_provider)\n\n        if self.mapping_source is not None and not isinstance(self.mapping_source, EntityReference):\n            self.mapping_source = EntityReference(self.mapping_source)\n\n        if self.mapping_cardinality is not None and not isinstance(self.mapping_cardinality, MappingCardinalityEnum):\n            self.mapping_cardinality = MappingCardinalityEnum(self.mapping_cardinality)\n\n        if not isinstance(self.cardinality_scope, list):\n            self.cardinality_scope = [self.cardinality_scope] if self.cardinality_scope is not None else []\n        self.cardinality_scope = [v if isinstance(v, str) else str(v) for v in self.cardinality_scope]\n\n        if self.mapping_tool is not None and not isinstance(self.mapping_tool, str):\n            self.mapping_tool = str(self.mapping_tool)\n\n        if self.mapping_tool_id is not None and not isinstance(self.mapping_tool_id, EntityReference):\n            self.mapping_tool_id = EntityReference(self.mapping_tool_id)\n\n        if self.mapping_tool_version is not None and not isinstance(self.mapping_tool_version, str):\n            self.mapping_tool_version = str(self.mapping_tool_version)\n\n        if self.mapping_date is not None and not isinstance(self.mapping_date, XSDDate):\n            self.mapping_date = XSDDate(self.mapping_date)\n\n        if self.publication_date is not None and not isinstance(self.publication_date, XSDDate):\n            self.publication_date = XSDDate(self.publication_date)\n\n        if self.review_date is not None and not isinstance(self.review_date, XSDDate):\n            self.review_date = XSDDate(self.review_date)\n\n        if self.confidence is not None and not isinstance(self.confidence, float):\n            self.confidence = float(self.confidence)\n\n        if self.reviewer_agreement is not None and not isinstance(self.reviewer_agreement, float):\n            self.reviewer_agreement = float(self.reviewer_agreement)\n\n        if not isinstance(self.curation_rule, list):\n            self.curation_rule = [self.curation_rule] if self.curation_rule is not None else []\n        self.curation_rule = [v if isinstance(v, EntityReference) else EntityReference(v) for v in self.curation_rule]\n\n        if not isinstance(self.curation_rule_text, list):\n            self.curation_rule_text = [self.curation_rule_text] if self.curation_rule_text is not None else []\n        self.curation_rule_text = [v if isinstance(v, str) else str(v) for v in self.curation_rule_text]\n\n        if not isinstance(self.subject_match_field, list):\n            self.subject_match_field = [self.subject_match_field] if self.subject_match_field is not None else []\n        self.subject_match_field = [v if isinstance(v, EntityReference) else EntityReference(v) for v in self.subject_match_field]\n\n        if not isinstance(self.object_match_field, list):\n            self.object_match_field = [self.object_match_field] if self.object_match_field is not None else []\n        self.object_match_field = [v if isinstance(v, EntityReference) else EntityReference(v) for v in self.object_match_field]\n\n        if not isinstance(self.match_string, list):\n            self.match_string = [self.match_string] if self.match_string is not None else []\n        self.match_string = [v if isinstance(v, str) else str(v) for v in self.match_string]\n\n        if not isinstance(self.subject_preprocessing, list):\n            self.subject_preprocessing = [self.subject_preprocessing] if self.subject_preprocessing is not None else []\n        self.subject_preprocessing = [v if isinstance(v, EntityReference) else EntityReference(v) for v in self.subject_preprocessing]\n\n        if not isinstance(self.object_preprocessing, list):\n            self.object_preprocessing = [self.object_preprocessing] if self.object_preprocessing is not None else []\n        self.object_preprocessing = [v if isinstance(v, EntityReference) else EntityReference(v) for v in self.object_preprocessing]\n\n        if self.similarity_score is not None and not isinstance(self.similarity_score, float):\n            self.similarity_score = float(self.similarity_score)\n\n        if self.similarity_measure is not None and not isinstance(self.similarity_measure, str):\n            self.similarity_measure = str(self.similarity_measure)\n\n        if not isinstance(self.see_also, list):\n            self.see_also = [self.see_also] if self.see_also is not None else []\n        self.see_also = [v if isinstance(v, NonRelativeURI) else NonRelativeURI(v) for v in self.see_also]\n\n        if self.issue_tracker_item is not None and not isinstance(self.issue_tracker_item, EntityReference):\n            self.issue_tracker_item = EntityReference(self.issue_tracker_item)\n\n        if self.other is not None and not isinstance(self.other, str):\n            self.other = str(self.other)\n\n        if self.comment is not None and not isinstance(self.comment, str):\n            self.comment = str(self.comment)\n\n        super().__post_init__(**kwargs)\n\n\n@dataclass(repr=False)\nclass MappingRegistry(YAMLRoot):\n    \"\"\"\n    A registry for managing mapping sets. It holds a set of mapping set references, and can import other registries.\n    \"\"\"\n    _inherited_slots: ClassVar[list[str]] = []\n\n    class_class_uri: ClassVar[URIRef] = SSSOM[\"MappingRegistry\"]\n    class_class_curie: ClassVar[str] = \"sssom:MappingRegistry\"\n    class_name: ClassVar[str] = \"mapping registry\"\n    class_model_uri: ClassVar[URIRef] = SSSOM.MappingRegistry\n\n    mapping_registry_id: Union[str, EntityReference] = None\n    mapping_registry_title: Optional[str] = None\n    mapping_registry_description: Optional[str] = None\n    imports: Optional[Union[Union[str, NonRelativeURI], list[Union[str, NonRelativeURI]]]] = empty_list()\n    mapping_set_references: Optional[Union[Union[dict, \"MappingSetReference\"], list[Union[dict, \"MappingSetReference\"]]]] = empty_list()\n    documentation: Optional[Union[str, NonRelativeURI]] = None\n    homepage: Optional[Union[str, NonRelativeURI]] = None\n    issue_tracker: Optional[Union[str, NonRelativeURI]] = None\n\n    def __post_init__(self, *_: str, **kwargs: Any):\n        if self._is_empty(self.mapping_registry_id):\n            self.MissingRequiredField(\"mapping_registry_id\")\n        if not isinstance(self.mapping_registry_id, EntityReference):\n            self.mapping_registry_id = EntityReference(self.mapping_registry_id)\n\n        if self.mapping_registry_title is not None and not isinstance(self.mapping_registry_title, str):\n            self.mapping_registry_title = str(self.mapping_registry_title)\n\n        if self.mapping_registry_description is not None and not isinstance(self.mapping_registry_description, str):\n            self.mapping_registry_description = str(self.mapping_registry_description)\n\n        if not isinstance(self.imports, list):\n            self.imports = [self.imports] if self.imports is not None else []\n        self.imports = [v if isinstance(v, NonRelativeURI) else NonRelativeURI(v) for v in self.imports]\n\n        self._normalize_inlined_as_list(slot_name=\"mapping_set_references\", slot_type=MappingSetReference, key_name=\"mapping_set_id\", keyed=False)\n\n        if self.documentation is not None and not isinstance(self.documentation, NonRelativeURI):\n            self.documentation = NonRelativeURI(self.documentation)\n\n        if self.homepage is not None and not isinstance(self.homepage, NonRelativeURI):\n            self.homepage = NonRelativeURI(self.homepage)\n\n        if self.issue_tracker is not None and not isinstance(self.issue_tracker, NonRelativeURI):\n            self.issue_tracker = NonRelativeURI(self.issue_tracker)\n\n        super().__post_init__(**kwargs)\n\n\n@dataclass(repr=False)\nclass MappingSetReference(YAMLRoot):\n    \"\"\"\n    A reference to a mapping set. It allows to augment mapping set metadata from the perspective of the registry, for\n    example, providing confidence, or a local filename or a grouping.\n    \"\"\"\n    _inherited_slots: ClassVar[list[str]] = []\n\n    class_class_uri: ClassVar[URIRef] = SSSOM[\"MappingSetReference\"]\n    class_class_curie: ClassVar[str] = \"sssom:MappingSetReference\"\n    class_name: ClassVar[str] = \"mapping set reference\"\n    class_model_uri: ClassVar[URIRef] = SSSOM.MappingSetReference\n\n    mapping_set_id: Union[str, NonRelativeURI] = None\n    mirror_from: Optional[Union[str, NonRelativeURI]] = None\n    registry_confidence: Optional[float] = None\n    mapping_set_group: Optional[str] = None\n    last_updated: Optional[Union[str, XSDDate]] = None\n    local_name: Optional[str] = None\n\n    def __post_init__(self, *_: str, **kwargs: Any):\n        if self._is_empty(self.mapping_set_id):\n            self.MissingRequiredField(\"mapping_set_id\")\n        if not isinstance(self.mapping_set_id, NonRelativeURI):\n            self.mapping_set_id = NonRelativeURI(self.mapping_set_id)\n\n        if self.mirror_from is not None and not isinstance(self.mirror_from, NonRelativeURI):\n            self.mirror_from = NonRelativeURI(self.mirror_from)\n\n        if self.registry_confidence is not None and not isinstance(self.registry_confidence, float):\n            self.registry_confidence = float(self.registry_confidence)\n\n        if self.mapping_set_group is not None and not isinstance(self.mapping_set_group, str):\n            self.mapping_set_group = str(self.mapping_set_group)\n\n        if self.last_updated is not None and not isinstance(self.last_updated, XSDDate):\n            self.last_updated = XSDDate(self.last_updated)\n\n        if self.local_name is not None and not isinstance(self.local_name, str):\n            self.local_name = str(self.local_name)\n\n        super().__post_init__(**kwargs)\n\n\n@dataclass(repr=False)\nclass Prefix(YAMLRoot):\n    _inherited_slots: ClassVar[list[str]] = []\n\n    class_class_uri: ClassVar[URIRef] = SSSOM[\"Prefix\"]\n    class_class_curie: ClassVar[str] = \"sssom:Prefix\"\n    class_name: ClassVar[str] = \"prefix\"\n    class_model_uri: ClassVar[URIRef] = SSSOM.Prefix\n\n    prefix_name: Union[str, PrefixPrefixName] = None\n    prefix_url: Optional[Union[str, URI]] = None\n\n    def __post_init__(self, *_: str, **kwargs: Any):\n        if self._is_empty(self.prefix_name):\n            self.MissingRequiredField(\"prefix_name\")\n        if not isinstance(self.prefix_name, PrefixPrefixName):\n            self.prefix_name = PrefixPrefixName(self.prefix_name)\n\n        if self.prefix_url is not None and not isinstance(self.prefix_url, URI):\n            self.prefix_url = URI(self.prefix_url)\n\n        super().__post_init__(**kwargs)\n\n\n@dataclass(repr=False)\nclass ExtensionDefinition(YAMLRoot):\n    \"\"\"\n    A definition of an extension (non-standard) slot.\n    \"\"\"\n    _inherited_slots: ClassVar[list[str]] = []\n\n    class_class_uri: ClassVar[URIRef] = SSSOM[\"ExtensionDefinition\"]\n    class_class_curie: ClassVar[str] = \"sssom:ExtensionDefinition\"\n    class_name: ClassVar[str] = \"extension definition\"\n    class_model_uri: ClassVar[URIRef] = SSSOM.ExtensionDefinition\n\n    slot_name: Union[str, NCName] = None\n    property: Optional[Union[str, URIorCURIE]] = None\n    type_hint: Optional[Union[str, URIorCURIE]] = None\n\n    def __post_init__(self, *_: str, **kwargs: Any):\n        if self._is_empty(self.slot_name):\n            self.MissingRequiredField(\"slot_name\")\n        if not isinstance(self.slot_name, NCName):\n            self.slot_name = NCName(self.slot_name)\n\n        if self.property is not None and not isinstance(self.property, URIorCURIE):\n            self.property = URIorCURIE(self.property)\n\n        if self.type_hint is not None and not isinstance(self.type_hint, URIorCURIE):\n            self.type_hint = URIorCURIE(self.type_hint)\n\n        super().__post_init__(**kwargs)\n\n\n@dataclass(repr=False)\nclass Propagatable(YAMLRoot):\n    \"\"\"\n    Metamodel extension class to describe slots whose value can be propagated down from the MappingSet class to the\n    Mapping class.\n    \"\"\"\n    _inherited_slots: ClassVar[list[str]] = []\n\n    class_class_uri: ClassVar[URIRef] = SSSOM[\"Propagatable\"]\n    class_class_curie: ClassVar[str] = \"sssom:Propagatable\"\n    class_name: ClassVar[str] = \"Propagatable\"\n    class_model_uri: ClassVar[URIRef] = SSSOM.Propagatable\n\n    propagated: Optional[Union[bool, Bool]] = None\n\n    def __post_init__(self, *_: str, **kwargs: Any):\n        if self.propagated is not None and not isinstance(self.propagated, Bool):\n            self.propagated = Bool(self.propagated)\n\n        super().__post_init__(**kwargs)\n\n\n@dataclass(repr=False)\nclass Versionable(YAMLRoot):\n    \"\"\"\n    Metamodel extension class to manage slots that may not exist in all versions of the model.\n    \"\"\"\n    _inherited_slots: ClassVar[list[str]] = []\n\n    class_class_uri: ClassVar[URIRef] = SSSOM[\"Versionable\"]\n    class_class_curie: ClassVar[str] = \"sssom:Versionable\"\n    class_name: ClassVar[str] = \"Versionable\"\n    class_model_uri: ClassVar[URIRef] = SSSOM.Versionable\n\n    added_in: Optional[Union[str, \"SssomVersionEnum\"]] = None\n\n    def __post_init__(self, *_: str, **kwargs: Any):\n        if self.added_in is not None and not isinstance(self.added_in, SssomVersionEnum):\n            self.added_in = SssomVersionEnum(self.added_in)\n\n        super().__post_init__(**kwargs)\n\n\nclass NoTermFound(YAMLRoot):\n    \"\"\"\n    sssom:NoTermFound can be used in place of a subject_id or object_id when the corresponding entity could not be\n    found. It SHOULD be used in conjunction with a corresponding subject_source or object_source to signify where the\n    term was not found.\n    \"\"\"\n    _inherited_slots: ClassVar[list[str]] = []\n\n    class_class_uri: ClassVar[URIRef] = SSSOM[\"NoTermFound\"]\n    class_class_curie: ClassVar[str] = \"sssom:NoTermFound\"\n    class_name: ClassVar[str] = \"NoTermFound\"\n    class_model_uri: ClassVar[URIRef] = SSSOM.NoTermFound\n\n\n# Enumerations\nclass SssomVersionEnum(EnumDefinitionImpl):\n\n    _defn = EnumDefinition(\n        name=\"SssomVersionEnum\",\n    )\n\n    @classmethod\n    def _addvals(cls):\n        setattr(cls, \"1.0\",\n            PermissibleValue(\n                text=\"1.0\",\n                description=\"SSSOM specification version 1.0\",\n                meaning=SSSOM[\"version1.0\"]))\n        setattr(cls, \"1.1\",\n            PermissibleValue(\n                text=\"1.1\",\n                description=\"SSSOM specification version 1.1\",\n                meaning=SSSOM[\"version1.1\"]))\n\nclass EntityTypeEnum(EnumDefinitionImpl):\n\n    _defn = EnumDefinition(\n        name=\"EntityTypeEnum\",\n    )\n\n    @classmethod\n    def _addvals(cls):\n        setattr(cls, \"owl class\",\n            PermissibleValue(\n                text=\"owl class\",\n                meaning=OWL[\"Class\"]))\n        setattr(cls, \"owl object property\",\n            PermissibleValue(\n                text=\"owl object property\",\n                meaning=OWL[\"ObjectProperty\"]))\n        setattr(cls, \"owl data property\",\n            PermissibleValue(\n                text=\"owl data property\",\n                meaning=OWL[\"DataProperty\"]))\n        setattr(cls, \"owl annotation property\",\n            PermissibleValue(\n                text=\"owl annotation property\",\n                meaning=OWL[\"AnnotationProperty\"]))\n        setattr(cls, \"owl named individual\",\n            PermissibleValue(\n                text=\"owl named individual\",\n                meaning=OWL[\"NamedIndividual\"]))\n        setattr(cls, \"skos concept\",\n            PermissibleValue(\n                text=\"skos concept\",\n                meaning=SKOS[\"Concept\"]))\n        setattr(cls, \"rdfs resource\",\n            PermissibleValue(\n                text=\"rdfs resource\",\n                meaning=RDFS[\"Resource\"]))\n        setattr(cls, \"rdfs class\",\n            PermissibleValue(\n                text=\"rdfs class\",\n                meaning=RDFS[\"Class\"]))\n        setattr(cls, \"rdfs literal\",\n            PermissibleValue(\n                text=\"rdfs literal\",\n                description=\"\"\"This value indicates that the entity being mapped is not a semantic entity with a distinct identifier, but is instead represented entirely by its literal label. This value MUST NOT be used in the predicate_type slot.\"\"\",\n                meaning=RDFS[\"Literal\"]))\n        setattr(cls, \"rdfs datatype\",\n            PermissibleValue(\n                text=\"rdfs datatype\",\n                meaning=RDFS[\"Datatype\"]))\n        setattr(cls, \"rdf property\",\n            PermissibleValue(\n                text=\"rdf property\",\n                meaning=RDF[\"Property\"]))\n        setattr(cls, \"composed entity expression\",\n            PermissibleValue(\n                text=\"composed entity expression\",\n                description=\"\"\"This value indicates that the entity ID does not represent a single entity, but a composite involving several individual entities. This value MUST NOT be used in the predicate_type slot. This specifications does not prescribe how an ID representing a composite entity should be interpreted; this is left at the discretion of applications.\"\"\",\n                meaning=SSSOM[\"ComposedEntityExpression\"]))\n\nclass PredicateModifierEnum(EnumDefinitionImpl):\n\n    Not = PermissibleValue(\n        text=\"Not\",\n        description=\"\"\"Negating the mapping predicate. The meaning of the triple becomes subject_id is not a predicate_id match to object_id.\"\"\",\n        meaning=SSSOM[\"NegatedPredicate\"])\n\n    _defn = EnumDefinition(\n        name=\"PredicateModifierEnum\",\n    )\n\nclass MappingCardinalityEnum(EnumDefinitionImpl):\n\n    _defn = EnumDefinition(\n        name=\"MappingCardinalityEnum\",\n    )\n\n    @classmethod\n    def _addvals(cls):\n        setattr(cls, \"1:1\",\n            PermissibleValue(\n                text=\"1:1\",\n                description=\"\"\"Indicates the mapping record is about a one-to-one mapping, that is, the subject and the object are only mapped to each other, exclusive of any other subject or object.\"\"\"))\n        setattr(cls, \"1:n\",\n            PermissibleValue(\n                text=\"1:n\",\n                description=\"\"\"Indicates the mapping record is about a one-to-many mapping, that is, the same subject is mapped to several different objects.\"\"\"))\n        setattr(cls, \"n:1\",\n            PermissibleValue(\n                text=\"n:1\",\n                description=\"\"\"Indicates the mapping record is about a many-to-one mapping, that is, several different subjects are mapped to the same object.\"\"\"))\n        setattr(cls, \"n:n\",\n            PermissibleValue(\n                text=\"n:n\",\n                description=\"\"\"Indicates the mapping record is about a many-to-many mapping, that is, the subject is mapped to several different objects and the object is mapped to several different subjects.\"\"\"))\n        setattr(cls, \"1:0\",\n            PermissibleValue(\n                text=\"1:0\",\n                description=\"\"\"Indicates that the subject has no match in the object vocabulary. This value MUST only be used when the object_id is sssom:NoTermFound.\"\"\"))\n        setattr(cls, \"0:1\",\n            PermissibleValue(\n                text=\"0:1\",\n                description=\"\"\"Indicates that the object has no match in the subject vocabulary. This value MUST only be used when the subject_id is sssom:NoTermFound.\"\"\"))\n        setattr(cls, \"0:0\",\n            PermissibleValue(\n                text=\"0:0\",\n                description=\"\"\"Indicates that there is no match between the subject vocabulary and the object vocabulary. This value MUST only be used when both the subject_id and the object_id are sssom:NoTermFound.\"\"\"))\n\n# Slots\nclass slots:\n    pass\n\nslots.prefix_name = Slot(uri=SSSOM.prefix_name, name=\"prefix_name\", curie=SSSOM.curie('prefix_name'),\n                   model_uri=SSSOM.prefix_name, domain=None, range=URIRef)\n\nslots.prefix_url = Slot(uri=SSSOM.prefix_url, name=\"prefix_url\", curie=SSSOM.curie('prefix_url'),\n                   model_uri=SSSOM.prefix_url, domain=None, range=Optional[Union[str, URI]])\n\nslots.sssom_version = Slot(uri=SSSOM.sssom_version, name=\"sssom_version\", curie=SSSOM.curie('sssom_version'),\n                   model_uri=SSSOM.sssom_version, domain=None, range=Optional[Union[str, \"SssomVersionEnum\"]])\n\nslots.curie_map = Slot(uri=SSSOM.curie_map, name=\"curie_map\", curie=SSSOM.curie('curie_map'),\n                   model_uri=SSSOM.curie_map, domain=None, range=Optional[Union[dict[Union[str, PrefixPrefixName], Union[dict, Prefix]], list[Union[dict, Prefix]]]])\n\nslots.mirror_from = Slot(uri=SSSOM.mirror_from, name=\"mirror_from\", curie=SSSOM.curie('mirror_from'),\n                   model_uri=SSSOM.mirror_from, domain=None, range=Optional[Union[str, NonRelativeURI]])\n\nslots.registry_confidence = Slot(uri=SSSOM.registry_confidence, name=\"registry_confidence\", curie=SSSOM.curie('registry_confidence'),\n                   model_uri=SSSOM.registry_confidence, domain=None, range=Optional[float])\n\nslots.last_updated = Slot(uri=SSSOM.last_updated, name=\"last_updated\", curie=SSSOM.curie('last_updated'),\n                   model_uri=SSSOM.last_updated, domain=None, range=Optional[Union[str, XSDDate]])\n\nslots.local_name = Slot(uri=SSSOM.local_name, name=\"local_name\", curie=SSSOM.curie('local_name'),\n                   model_uri=SSSOM.local_name, domain=None, range=Optional[str])\n\nslots.mapping_set_references = Slot(uri=SSSOM.mapping_set_references, name=\"mapping_set_references\", curie=SSSOM.curie('mapping_set_references'),\n                   model_uri=SSSOM.mapping_set_references, domain=None, range=Optional[Union[Union[dict, MappingSetReference], list[Union[dict, MappingSetReference]]]])\n\nslots.mapping_registry_id = Slot(uri=SSSOM.mapping_registry_id, name=\"mapping_registry_id\", curie=SSSOM.curie('mapping_registry_id'),\n                   model_uri=SSSOM.mapping_registry_id, domain=None, range=Union[str, EntityReference])\n\nslots.mapping_registry_title = Slot(uri=SSSOM.mapping_registry_title, name=\"mapping_registry_title\", curie=SSSOM.curie('mapping_registry_title'),\n                   model_uri=SSSOM.mapping_registry_title, domain=None, range=Optional[str])\n\nslots.mapping_registry_description = Slot(uri=SSSOM.mapping_registry_description, name=\"mapping_registry_description\", curie=SSSOM.curie('mapping_registry_description'),\n                   model_uri=SSSOM.mapping_registry_description, domain=None, range=Optional[str])\n\nslots.imports = Slot(uri=SSSOM.imports, name=\"imports\", curie=SSSOM.curie('imports'),\n                   model_uri=SSSOM.imports, domain=None, range=Optional[Union[Union[str, NonRelativeURI], list[Union[str, NonRelativeURI]]]])\n\nslots.documentation = Slot(uri=SSSOM.documentation, name=\"documentation\", curie=SSSOM.curie('documentation'),\n                   model_uri=SSSOM.documentation, domain=None, range=Optional[Union[str, NonRelativeURI]])\n\nslots.homepage = Slot(uri=SSSOM.homepage, name=\"homepage\", curie=SSSOM.curie('homepage'),\n                   model_uri=SSSOM.homepage, domain=None, range=Optional[Union[str, NonRelativeURI]])\n\nslots.mappings = Slot(uri=SSSOM.mappings, name=\"mappings\", curie=SSSOM.curie('mappings'),\n                   model_uri=SSSOM.mappings, domain=None, range=Optional[Union[Union[dict, Mapping], list[Union[dict, Mapping]]]])\n\nslots.subject_id = Slot(uri=OWL.annotatedSource, name=\"subject_id\", curie=OWL.curie('annotatedSource'),\n                   model_uri=SSSOM.subject_id, domain=None, range=Optional[Union[str, EntityReference]])\n\nslots.subject_label = Slot(uri=SSSOM.subject_label, name=\"subject_label\", curie=SSSOM.curie('subject_label'),\n                   model_uri=SSSOM.subject_label, domain=None, range=Optional[str])\n\nslots.subject_category = Slot(uri=SSSOM.subject_category, name=\"subject_category\", curie=SSSOM.curie('subject_category'),\n                   model_uri=SSSOM.subject_category, domain=None, range=Optional[str])\n\nslots.subject_type = Slot(uri=SSSOM.subject_type, name=\"subject_type\", curie=SSSOM.curie('subject_type'),\n                   model_uri=SSSOM.subject_type, domain=None, range=Optional[Union[str, \"EntityTypeEnum\"]])\n\nslots.predicate_id = Slot(uri=OWL.annotatedProperty, name=\"predicate_id\", curie=OWL.curie('annotatedProperty'),\n                   model_uri=SSSOM.predicate_id, domain=None, range=Union[str, EntityReference])\n\nslots.predicate_modifier = Slot(uri=SSSOM.predicate_modifier, name=\"predicate_modifier\", curie=SSSOM.curie('predicate_modifier'),\n                   model_uri=SSSOM.predicate_modifier, domain=None, range=Optional[Union[str, \"PredicateModifierEnum\"]])\n\nslots.predicate_label = Slot(uri=SSSOM.predicate_label, name=\"predicate_label\", curie=SSSOM.curie('predicate_label'),\n                   model_uri=SSSOM.predicate_label, domain=None, range=Optional[str])\n\nslots.predicate_type = Slot(uri=SSSOM.predicate_type, name=\"predicate_type\", curie=SSSOM.curie('predicate_type'),\n                   model_uri=SSSOM.predicate_type, domain=None, range=Optional[Union[str, \"EntityTypeEnum\"]])\n\nslots.object_id = Slot(uri=OWL.annotatedTarget, name=\"object_id\", curie=OWL.curie('annotatedTarget'),\n                   model_uri=SSSOM.object_id, domain=None, range=Optional[Union[str, EntityReference]])\n\nslots.object_label = Slot(uri=SSSOM.object_label, name=\"object_label\", curie=SSSOM.curie('object_label'),\n                   model_uri=SSSOM.object_label, domain=None, range=Optional[str])\n\nslots.object_category = Slot(uri=SSSOM.object_category, name=\"object_category\", curie=SSSOM.curie('object_category'),\n                   model_uri=SSSOM.object_category, domain=None, range=Optional[str])\n\nslots.mapping_justification = Slot(uri=SSSOM.mapping_justification, name=\"mapping_justification\", curie=SSSOM.curie('mapping_justification'),\n                   model_uri=SSSOM.mapping_justification, domain=None, range=Union[str, EntityReference],\n                   pattern=re.compile(r'^semapv:(MappingReview|ManualMappingCuration|LogicalReasoning|LexicalMatching|CompositeMatching|UnspecifiedMatching|SemanticSimilarityThresholdMatching|LexicalSimilarityThresholdMatching|MappingChaining|MappingInversion|StructuralMatching|InstanceBasedMatching|BackgroundKnowledgeBasedMatching)$'))\n\nslots.object_type = Slot(uri=SSSOM.object_type, name=\"object_type\", curie=SSSOM.curie('object_type'),\n                   model_uri=SSSOM.object_type, domain=None, range=Optional[Union[str, \"EntityTypeEnum\"]])\n\nslots.mapping_set_id = Slot(uri=SSSOM.mapping_set_id, name=\"mapping_set_id\", curie=SSSOM.curie('mapping_set_id'),\n                   model_uri=SSSOM.mapping_set_id, domain=None, range=Union[str, NonRelativeURI])\n\nslots.mapping_set_version = Slot(uri=OWL.versionInfo, name=\"mapping_set_version\", curie=OWL.curie('versionInfo'),\n                   model_uri=SSSOM.mapping_set_version, domain=None, range=Optional[str])\n\nslots.mapping_set_group = Slot(uri=SSSOM.mapping_set_group, name=\"mapping_set_group\", curie=SSSOM.curie('mapping_set_group'),\n                   model_uri=SSSOM.mapping_set_group, domain=None, range=Optional[str])\n\nslots.mapping_set_title = Slot(uri=DCTERMS.title, name=\"mapping_set_title\", curie=DCTERMS.curie('title'),\n                   model_uri=SSSOM.mapping_set_title, domain=None, range=Optional[str])\n\nslots.mapping_set_description = Slot(uri=DCTERMS.description, name=\"mapping_set_description\", curie=DCTERMS.curie('description'),\n                   model_uri=SSSOM.mapping_set_description, domain=None, range=Optional[str])\n\nslots.mapping_set_confidence = Slot(uri=SSSOM.mapping_set_confidence, name=\"mapping_set_confidence\", curie=SSSOM.curie('mapping_set_confidence'),\n                   model_uri=SSSOM.mapping_set_confidence, domain=None, range=Optional[float])\n\nslots.creator_id = Slot(uri=DCTERMS.creator, name=\"creator_id\", curie=DCTERMS.curie('creator'),\n                   model_uri=SSSOM.creator_id, domain=None, range=Optional[Union[Union[str, EntityReference], list[Union[str, EntityReference]]]])\n\nslots.creator_label = Slot(uri=SSSOM.creator_label, name=\"creator_label\", curie=SSSOM.curie('creator_label'),\n                   model_uri=SSSOM.creator_label, domain=None, range=Optional[Union[str, list[str]]])\n\nslots.author_id = Slot(uri=PAV.authoredBy, name=\"author_id\", curie=PAV.curie('authoredBy'),\n                   model_uri=SSSOM.author_id, domain=None, range=Optional[Union[Union[str, EntityReference], list[Union[str, EntityReference]]]])\n\nslots.author_label = Slot(uri=SSSOM.author_label, name=\"author_label\", curie=SSSOM.curie('author_label'),\n                   model_uri=SSSOM.author_label, domain=None, range=Optional[Union[str, list[str]]])\n\nslots.reviewer_id = Slot(uri=SSSOM.reviewer_id, name=\"reviewer_id\", curie=SSSOM.curie('reviewer_id'),\n                   model_uri=SSSOM.reviewer_id, domain=None, range=Optional[Union[Union[str, EntityReference], list[Union[str, EntityReference]]]])\n\nslots.reviewer_label = Slot(uri=SSSOM.reviewer_label, name=\"reviewer_label\", curie=SSSOM.curie('reviewer_label'),\n                   model_uri=SSSOM.reviewer_label, domain=None, range=Optional[Union[str, list[str]]])\n\nslots.license = Slot(uri=DCTERMS.license, name=\"license\", curie=DCTERMS.curie('license'),\n                   model_uri=SSSOM.license, domain=None, range=Optional[Union[str, NonRelativeURI]])\n\nslots.subject_source = Slot(uri=SSSOM.subject_source, name=\"subject_source\", curie=SSSOM.curie('subject_source'),\n                   model_uri=SSSOM.subject_source, domain=None, range=Optional[Union[str, EntityReference]])\n\nslots.subject_source_version = Slot(uri=SSSOM.subject_source_version, name=\"subject_source_version\", curie=SSSOM.curie('subject_source_version'),\n                   model_uri=SSSOM.subject_source_version, domain=None, range=Optional[str])\n\nslots.object_source = Slot(uri=SSSOM.object_source, name=\"object_source\", curie=SSSOM.curie('object_source'),\n                   model_uri=SSSOM.object_source, domain=None, range=Optional[Union[str, EntityReference]])\n\nslots.object_source_version = Slot(uri=SSSOM.object_source_version, name=\"object_source_version\", curie=SSSOM.curie('object_source_version'),\n                   model_uri=SSSOM.object_source_version, domain=None, range=Optional[str])\n\nslots.mapping_provider = Slot(uri=SSSOM.mapping_provider, name=\"mapping_provider\", curie=SSSOM.curie('mapping_provider'),\n                   model_uri=SSSOM.mapping_provider, domain=None, range=Optional[Union[str, NonRelativeURI]])\n\nslots.mapping_set_source = Slot(uri=PROV.wasDerivedFrom, name=\"mapping_set_source\", curie=PROV.curie('wasDerivedFrom'),\n                   model_uri=SSSOM.mapping_set_source, domain=None, range=Optional[Union[Union[str, NonRelativeURI], list[Union[str, NonRelativeURI]]]])\n\nslots.mapping_source = Slot(uri=SSSOM.mapping_source, name=\"mapping_source\", curie=SSSOM.curie('mapping_source'),\n                   model_uri=SSSOM.mapping_source, domain=None, range=Optional[Union[str, EntityReference]])\n\nslots.mapping_cardinality = Slot(uri=SSSOM.mapping_cardinality, name=\"mapping_cardinality\", curie=SSSOM.curie('mapping_cardinality'),\n                   model_uri=SSSOM.mapping_cardinality, domain=None, range=Optional[Union[str, \"MappingCardinalityEnum\"]])\n\nslots.cardinality_scope = Slot(uri=SSSOM.cardinality_scope, name=\"cardinality_scope\", curie=SSSOM.curie('cardinality_scope'),\n                   model_uri=SSSOM.cardinality_scope, domain=None, range=Optional[Union[str, list[str]]])\n\nslots.mapping_tool = Slot(uri=SSSOM.mapping_tool, name=\"mapping_tool\", curie=SSSOM.curie('mapping_tool'),\n                   model_uri=SSSOM.mapping_tool, domain=None, range=Optional[str])\n\nslots.mapping_tool_id = Slot(uri=SSSOM.mapping_tool_id, name=\"mapping_tool_id\", curie=SSSOM.curie('mapping_tool_id'),\n                   model_uri=SSSOM.mapping_tool_id, domain=None, range=Optional[Union[str, EntityReference]])\n\nslots.mapping_tool_version = Slot(uri=SSSOM.mapping_tool_version, name=\"mapping_tool_version\", curie=SSSOM.curie('mapping_tool_version'),\n                   model_uri=SSSOM.mapping_tool_version, domain=None, range=Optional[str])\n\nslots.mapping_date = Slot(uri=DCTERMS.created, name=\"mapping_date\", curie=DCTERMS.curie('created'),\n                   model_uri=SSSOM.mapping_date, domain=None, range=Optional[Union[str, XSDDate]])\n\nslots.publication_date = Slot(uri=DCTERMS.issued, name=\"publication_date\", curie=DCTERMS.curie('issued'),\n                   model_uri=SSSOM.publication_date, domain=None, range=Optional[Union[str, XSDDate]])\n\nslots.review_date = Slot(uri=SSSOM.review_date, name=\"review_date\", curie=SSSOM.curie('review_date'),\n                   model_uri=SSSOM.review_date, domain=None, range=Optional[Union[str, XSDDate]])\n\nslots.confidence = Slot(uri=SSSOM.confidence, name=\"confidence\", curie=SSSOM.curie('confidence'),\n                   model_uri=SSSOM.confidence, domain=None, range=Optional[float])\n\nslots.reviewer_agreement = Slot(uri=SSSOM.reviewer_agreement, name=\"reviewer_agreement\", curie=SSSOM.curie('reviewer_agreement'),\n                   model_uri=SSSOM.reviewer_agreement, domain=None, range=Optional[float])\n\nslots.subject_match_field = Slot(uri=SSSOM.subject_match_field, name=\"subject_match_field\", curie=SSSOM.curie('subject_match_field'),\n                   model_uri=SSSOM.subject_match_field, domain=None, range=Optional[Union[Union[str, EntityReference], list[Union[str, EntityReference]]]])\n\nslots.object_match_field = Slot(uri=SSSOM.object_match_field, name=\"object_match_field\", curie=SSSOM.curie('object_match_field'),\n                   model_uri=SSSOM.object_match_field, domain=None, range=Optional[Union[Union[str, EntityReference], list[Union[str, EntityReference]]]])\n\nslots.match_string = Slot(uri=SSSOM.match_string, name=\"match_string\", curie=SSSOM.curie('match_string'),\n                   model_uri=SSSOM.match_string, domain=None, range=Optional[Union[str, list[str]]])\n\nslots.subject_preprocessing = Slot(uri=SSSOM.subject_preprocessing, name=\"subject_preprocessing\", curie=SSSOM.curie('subject_preprocessing'),\n                   model_uri=SSSOM.subject_preprocessing, domain=None, range=Optional[Union[Union[str, EntityReference], list[Union[str, EntityReference]]]])\n\nslots.object_preprocessing = Slot(uri=SSSOM.object_preprocessing, name=\"object_preprocessing\", curie=SSSOM.curie('object_preprocessing'),\n                   model_uri=SSSOM.object_preprocessing, domain=None, range=Optional[Union[Union[str, EntityReference], list[Union[str, EntityReference]]]])\n\nslots.curation_rule = Slot(uri=SSSOM.curation_rule, name=\"curation_rule\", curie=SSSOM.curie('curation_rule'),\n                   model_uri=SSSOM.curation_rule, domain=None, range=Optional[Union[Union[str, EntityReference], list[Union[str, EntityReference]]]])\n\nslots.curation_rule_text = Slot(uri=SSSOM.curation_rule_text, name=\"curation_rule_text\", curie=SSSOM.curie('curation_rule_text'),\n                   model_uri=SSSOM.curation_rule_text, domain=None, range=Optional[Union[str, list[str]]])\n\nslots.similarity_score = Slot(uri=SSSOM.similarity_score, name=\"similarity_score\", curie=SSSOM.curie('similarity_score'),\n                   model_uri=SSSOM.similarity_score, domain=None, range=Optional[float])\n\nslots.similarity_measure = Slot(uri=SSSOM.similarity_measure, name=\"similarity_measure\", curie=SSSOM.curie('similarity_measure'),\n                   model_uri=SSSOM.similarity_measure, domain=None, range=Optional[str])\n\nslots.issue_tracker_item = Slot(uri=SSSOM.issue_tracker_item, name=\"issue_tracker_item\", curie=SSSOM.curie('issue_tracker_item'),\n                   model_uri=SSSOM.issue_tracker_item, domain=None, range=Optional[Union[str, EntityReference]])\n\nslots.issue_tracker = Slot(uri=SSSOM.issue_tracker, name=\"issue_tracker\", curie=SSSOM.curie('issue_tracker'),\n                   model_uri=SSSOM.issue_tracker, domain=None, range=Optional[Union[str, NonRelativeURI]])\n\nslots.see_also = Slot(uri=RDFS.seeAlso, name=\"see_also\", curie=RDFS.curie('seeAlso'),\n                   model_uri=SSSOM.see_also, domain=None, range=Optional[Union[Union[str, NonRelativeURI], list[Union[str, NonRelativeURI]]]])\n\nslots.other = Slot(uri=SSSOM.other, name=\"other\", curie=SSSOM.curie('other'),\n                   model_uri=SSSOM.other, domain=None, range=Optional[str])\n\nslots.comment = Slot(uri=RDFS.comment, name=\"comment\", curie=RDFS.curie('comment'),\n                   model_uri=SSSOM.comment, domain=None, range=Optional[str])\n\nslots.extension_definitions = Slot(uri=SSSOM.extension_definitions, name=\"extension_definitions\", curie=SSSOM.curie('extension_definitions'),\n                   model_uri=SSSOM.extension_definitions, domain=None, range=Optional[Union[Union[dict, ExtensionDefinition], list[Union[dict, ExtensionDefinition]]]])\n\nslots.record_id = Slot(uri=SSSOM.record_id, name=\"record_id\", curie=SSSOM.curie('record_id'),\n                   model_uri=SSSOM.record_id, domain=None, range=Optional[Union[str, EntityReference]])\n\nslots.extensionDefinition__slot_name = Slot(uri=SSSOM.slot_name, name=\"extensionDefinition__slot_name\", curie=SSSOM.curie('slot_name'),\n                   model_uri=SSSOM.extensionDefinition__slot_name, domain=None, range=Union[str, NCName])\n\nslots.extensionDefinition__property = Slot(uri=SSSOM.property, name=\"extensionDefinition__property\", curie=SSSOM.curie('property'),\n                   model_uri=SSSOM.extensionDefinition__property, domain=None, range=Optional[Union[str, URIorCURIE]])\n\nslots.extensionDefinition__type_hint = Slot(uri=SSSOM.type_hint, name=\"extensionDefinition__type_hint\", curie=SSSOM.curie('type_hint'),\n                   model_uri=SSSOM.extensionDefinition__type_hint, domain=None, range=Optional[Union[str, URIorCURIE]])\n\nslots.propagatable__propagated = Slot(uri=SSSOM.propagated, name=\"propagatable__propagated\", curie=SSSOM.curie('propagated'),\n                   model_uri=SSSOM.propagatable__propagated, domain=None, range=Optional[Union[bool, Bool]])\n\nslots.versionable__added_in = Slot(uri=SSSOM.added_in, name=\"versionable__added_in\", curie=SSSOM.curie('added_in'),\n                   model_uri=SSSOM.versionable__added_in, domain=None, range=Optional[Union[str, \"SssomVersionEnum\"]])\n\nslots.mapping_set_license = Slot(uri=DCTERMS.license, name=\"mapping set_license\", curie=DCTERMS.curie('license'),\n                   model_uri=SSSOM.mapping_set_license, domain=MappingSet, range=Union[str, NonRelativeURI])\n\nslots.mapping_set_similarity_measure = Slot(uri=SSSOM.similarity_measure, name=\"mapping set_similarity_measure\", curie=SSSOM.curie('similarity_measure'),\n                   model_uri=SSSOM.mapping_set_similarity_measure, domain=MappingSet, range=Optional[str])\n\nslots.mapping_set_curation_rule = Slot(uri=SSSOM.curation_rule, name=\"mapping set_curation_rule\", curie=SSSOM.curie('curation_rule'),\n                   model_uri=SSSOM.mapping_set_curation_rule, domain=MappingSet, range=Optional[Union[Union[str, EntityReference], list[Union[str, EntityReference]]]])\n\nslots.mapping_set_curation_rule_text = Slot(uri=SSSOM.curation_rule_text, name=\"mapping set_curation_rule_text\", curie=SSSOM.curie('curation_rule_text'),\n                   model_uri=SSSOM.mapping_set_curation_rule_text, domain=MappingSet, range=Optional[Union[str, list[str]]])\n"
  },
  {
    "path": "src/sssom_schema/schema/sssom_schema.yaml",
    "content": "id: https://w3id.org/sssom/schema/\nname: sssom\ndescription:\n  Datamodel for Simple Standard for Sharing Ontological Mappings (SSSOM)\nimports:\n  - linkml:types\nprefixes:\n  dcterms: http://purl.org/dc/terms/\n  linkml: https://w3id.org/linkml/\n  sssom: https://w3id.org/sssom/\n  rdfs: http://www.w3.org/2000/01/rdf-schema#\n  rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns#\n  oboInOwl: http://www.geneontology.org/formats/oboInOwl#\n  pav: http://purl.org/pav/\n  prov: http://www.w3.org/ns/prov#\n  skos: http://www.w3.org/2004/02/skos/core#\n  xsd: http://www.w3.org/2001/XMLSchema#\n  semapv: https://w3id.org/semapv/vocab/\nsee_also:\n  - https://github.com/mapping-commons/sssom\n  - https://mapping-commons.github.io/sssom/home/\ndefault_curi_maps:\n  - semweb_context\n  - obo_context\ndefault_prefix: sssom\ndefault_range: string\n\nenums:\n  sssom_version_enum:\n    permissible_values:\n      \"1.0\":\n        meaning: sssom:version1.0\n        description: SSSOM specification version 1.0\n      \"1.1\":\n        meaning: sssom:version1.1\n        description: SSSOM specification version 1.1\n  entity_type_enum:\n    permissible_values:\n      owl class:\n        meaning: owl:Class\n      owl object property:\n        meaning: owl:ObjectProperty\n      owl data property:\n        meaning: owl:DataProperty\n      owl annotation property:\n        meaning: owl:AnnotationProperty\n      owl named individual:\n        meaning: owl:NamedIndividual\n      skos concept:\n        meaning: skos:Concept\n      rdfs resource:\n        meaning: rdfs:Resource\n      rdfs class:\n        meaning: rdfs:Class\n      rdfs literal:\n        meaning: rdfs:Literal\n        description:\n          This value indicates that the entity being mapped is not a semantic\n          entity with a distinct identifier, but is instead represented entirely\n          by its literal label. This value MUST NOT be used in the\n          predicate_type slot.\n        see_also:\n          - https://mapping-commons.github.io/sssom/spec-model/#literal-mappings\n          - https://github.com/mapping-commons/sssom/issues/234\n          - https://github.com/mapping-commons/sssom/blob/master/examples/schema/literals.sssom.tsv\n      rdfs datatype:\n        meaning: rdfs:Datatype\n      rdf property:\n        meaning: rdf:Property\n      composed entity expression:\n        meaning: sssom:ComposedEntityExpression\n        description:\n          This value indicates that the entity ID does not represent a single\n          entity, but a composite involving several individual entities. This\n          value MUST NOT be used in the predicate_type slot. This specifications\n          does not prescribe how an ID representing a composite entity should be\n          interpreted; this is left at the discretion of applications.\n        see_also:\n          - https://github.com/mapping-commons/sssom/issues/402\n          - https://github.com/mapping-commons/sssom/blob/master/examples/schema/composite-entities.sssom.tsv\n\n  predicate_modifier_enum:\n    permissible_values:\n      Not:\n        description:\n          Negating the mapping predicate. The meaning of the triple becomes\n          subject_id is not a predicate_id match to object_id.\n        meaning: sssom:NegatedPredicate\n  mapping_cardinality_enum:\n    permissible_values:\n      \"1:1\":\n        description:\n          Indicates the mapping record is about a one-to-one mapping, that is,\n          the subject and the object are only mapped to each other, exclusive of\n          any other subject or object.\n      \"1:n\":\n        description:\n          Indicates the mapping record is about a one-to-many mapping, that is,\n          the same subject is mapped to several different objects.\n      \"n:1\":\n        description:\n          Indicates the mapping record is about a many-to-one mapping, that is,\n          several different subjects are mapped to the same object.\n      \"n:n\":\n        description:\n          Indicates the mapping record is about a many-to-many mapping, that is,\n          the subject is mapped to several different objects and the object is\n          mapped to several different subjects.\n      \"1:0\":\n        description:\n          Indicates that the subject has no match in the object vocabulary. This\n          value MUST only be used when the object_id is sssom:NoTermFound.\n      \"0:1\":\n        description:\n          Indicates that the object has no match in the subject vocabulary. This\n          value MUST only be used when the subject_id is sssom:NoTermFound.\n      \"0:0\":\n        description:\n          Indicates that there is no match between the subject vocabulary and\n          the object vocabulary. This value MUST only be used when both the\n          subject_id and the object_id are sssom:NoTermFound.\n\ntypes:\n  EntityReference:\n    typeof: uriorcurie\n    description: |\n      A reference to an entity involved in the mapping.\n    base: str\n    uri: rdfs:Resource\n    see_also:\n      - https://mapping-commons.github.io/sssom/spec/#tsv\n  NonRelativeURI:\n    typeof: uri\n    base: URI\n    uri: xsd:anyURI\n    description: >-\n      A URI as per RFC 3986, that is a string that matches the production of the\n      \"URI\" rule defined in Appendix A of that RFC. Contrary to the underlying\n      LinkML type, this specifically excludes _relative URI references_, which\n      do not start with a scheme component. Relative URI references are\n      forbidden because SSSOM has no built-in mechanism to provide the base URI\n      that would be needed to resolve relative URI references into non-relative\n      ones.\n    see_also:\n      - https://github.com/mapping-commons/sssom/issues/448\n    examples:\n      - value: https://example.org/path/to/file.txt#L4\n        description: A URI that is URL to a HTTP resource.\n      - value: urn:oasis:names:tc:entity:xmlns:xml:catalog\n        description: >-\n          A URI that is the URN of the namespace for the OASIS XML Catalogs\n          specification.\n      - value: ldap://example.org/cn=Alice,dc=example,dc=org?mail\n        description: A URI that is a LDAP query URL.\n      - value: mailto:alice@example.org\n        description: A URI that is an email address.\n      - value: file.txt\n        description:\n          An _invalid_ example, as it a relative URI (path only, no scheme).\n      - value: /path/to/file.txt\n        description: >-\n          An _invalid_ example; though it appears to be an _absolute path_, it\n          is a _relative URI_ because of the absence of a scheme.\n      - value: //example.org/path/to/file.txt\n        description: >-\n          An _invalid_ example; though it includes an authority component\n          (example.org), it has no scheme and is therefore a _relative URI_.\n\nslots:\n  prefix_name:\n    key: true\n    range: ncname\n  prefix_url:\n    range: uri\n  sssom_version:\n    description:\n      The version of the SSSOM specification a mapping set is compliant with.\n    range: sssom_version_enum\n    instantiates:\n      - sssom:Versionable\n    annotations:\n      added_in: \"1.1\"\n    see_also:\n      - https://github.com/mapping-commons/sssom/issues/439\n      - https://github.com/mapping-commons/sssom/blob/master/examples/schema/version.sssom.tsv\n  curie_map:\n    description:\n      A dictionary that contains prefixes as keys and their URI expansions as\n      values.\n    range: prefix\n    multivalued: true\n    inlined: true\n    see_also:\n      - https://github.com/mapping-commons/sssom/issues/225\n      - https://github.com/mapping-commons/sssom/pull/349\n      - https://github.com/mapping-commons/sssom/blob/master/examples/schema/curie_map.sssom.tsv\n  mirror_from:\n    description:\n      A URL location from which to obtain a resource, such as a mapping set.\n    range: NonRelativeURI\n  registry_confidence:\n    description: This value is set by the creator/maintainer of the mapping\n      registry and reflects the confidence the mapping registry has in the\n      correctness (i.e., precision) of mappings in the mapping set.\n\n      When not explicitly specified, confidence estimation algorithms should\n      consider the registry confidence in a mapping set to be 1.0 by default.\n    range: double\n    minimum_value: 0.0\n    maximum_value: 1.0\n    see_also:\n      - https://mapping-commons.github.io/sssom/confidence-model\n    examples:\n      - value: \"0.95\"\n        description: A confidence score of 0.95, indicating 95% confidence.\n  last_updated:\n    description: The date this reference was last updated.\n    range: date\n  local_name:\n    description:\n      The local name assigned to file that corresponds to the downloaded mapping\n      set.\n    range: string\n  mapping_set_references:\n    description: A list of mapping set references.\n    range: mapping set reference\n    multivalued: true\n    recommended: true\n  mapping_registry_id:\n    description: The unique identifier of a mapping registry.\n    range: EntityReference\n    required: true\n  mapping_registry_title:\n    description: The title of a mapping registry.\n    range: string\n  mapping_registry_description:\n    description: The description of a mapping registry.\n    range: string\n  imports:\n    description: A list of registries that should be imported into this one.\n    multivalued: true\n    range: NonRelativeURI\n  documentation:\n    description: A URL to the documentation of this mapping commons.\n    range: NonRelativeURI\n  homepage:\n    description: A URL to a homepage of this mapping commons.\n    range: NonRelativeURI\n  mappings:\n    description: Contains a list of mapping objects.\n    range: mapping\n    multivalued: true\n    inlined_as_list: true\n    recommended: true\n  subject_id:\n    description: The ID of the subject of the mapping.\n    range: EntityReference\n    mappings:\n      - owl:annotatedSource\n    slot_uri: owl:annotatedSource\n    examples:\n      - value: HP:0009894\n        description:\n          The CURIE denoting the Human Phenotype Ontology concept of 'Thickened\n          ears'\n  subject_label:\n    description: The label of subject of the mapping.\n    range: string\n    examples:\n      - value: Thickened ears\n    recommended: true\n  subject_category:\n    description:\n      The conceptual category to which the subject belongs to. This can be a\n      string denoting the category or a term from a controlled vocabulary. This\n      slot is deliberately underspecified. Conceptual categories can range from\n      those that are found in general upper ontologies such as BFO (e.g.\n      process, temporal region, etc) to those that serve as upper ontologies in\n      specific domains, such as COB or BioLink (e.g. gene, disease, chemical\n      entity). The purpose of this optional field is documentation for human\n      reviewers - when a category is known and documented clearly, the cost of\n      interpreting and evaluating the mapping decreases.\n    range: string\n    see_also:\n      - https://github.com/mapping-commons/sssom/issues/13\n      - https://github.com/mapping-commons/sssom/issues/256\n    examples:\n      - value: UBERON:0001062\n        description: The CURIE of the Uberon term for \"anatomical entity\".\n      - value: anatomical entity\n        description:\n          A string, rather than ID, describing the \"anatomical entity\" category.\n          This is possible, but less preferred than using an ID.\n      - value: biolink:Gene\n        description: The CURIE of the biolink class for genes.\n  subject_type:\n    description: The type of entity that is being mapped.\n    range: entity_type_enum\n    instantiates:\n      - sssom:Propagatable\n    annotations:\n      propagated: true\n    examples:\n      - value: owl:Class\n  predicate_id:\n    description:\n      The ID of the predicate or relation that relates the subject and object of\n      this match.\n    mappings:\n      - owl:annotatedProperty\n    range: EntityReference\n    required: true\n    slot_uri: owl:annotatedProperty\n    examples:\n      - value: owl:sameAs\n        description:\n          The subject and the object are instances (owl individuals), and the\n          two instances are the same.\n      - value: owl:equivalentClass\n        description:\n          The subject and the object are classes (owl class), and the two\n          classes are the same.\n      - value: owl:equivalentProperty\n        description:\n          The subject and the object are properties (owl object, data,\n          annotation properties), and the two properties are the same.\n      - value: rdfs:subClassOf\n        description:\n          The subject and the object are classes (owl class), and the subject is\n          a subclass of the object.\n      - value: rdfs:subPropertyOf\n        description:\n          The subject and the object are properties (owl object, data,\n          annotation properties), and the subject is a subproperty of the\n          object.\n      - value: skos:relatedMatch\n        description:\n          The subject and the object are associated in some unspecified way.\n      - value: skos:closeMatch\n        description:\n          The subject and the object are sufficiently similar that they can be\n          used interchangeably in some information retrieval applications.\n      - value: skos:exactMatch\n        description:\n          The subject and the object can, with a high degree of confidence, be\n          used interchangeably across a wide range of information retrieval\n          applications.\n      - value: skos:narrowMatch\n        description:\n          \"From the SKOS primer: A triple skos:narrower (and skos:narrowMatch)\n          asserts that , the object of the triple, is a narrower concept than ,\n          the subject of the triple.\"\n      - value: skos:broadMatch\n        description:\n          \"From the SKOS primer: A triple skos:broader (and skos:broadMatch)\n          asserts that , the object of the triple, is a broader concept than ,\n          the subject of the triple.\"\n      - value: oboInOwl:hasDbXref\n        description:\n          Two terms are related in some way. The meaning is frequently\n          consistent across a single set of mappings. Note this property is\n          often overloaded even where the terms are of a different nature (e.g.\n          interpro2go).\n      - value: rdfs:seeAlso\n        description:\n          The subject and the object are associated in some unspecified way. The\n          object IRI often resolves to a resource on the web that provides\n          additional information.\n  predicate_modifier:\n    description:\n      A modifier for negating the predicate. See\n      https://github.com/mapping-commons/sssom/issues/40 for discussion\n    range: predicate_modifier_enum\n    see_also:\n      - https://github.com/mapping-commons/sssom/issues/107\n    examples:\n      - value: Not\n        description:\n          Negates the predicate, see documentation of predicate_modifier_enum\n  predicate_label:\n    description: The label of the predicate/relation of the mapping.\n    range: string\n    examples:\n      - value: has cross-reference\n        description:\n          The label of the oboInOwl:hasDbXref property to represent\n          cross-references.\n  predicate_type:\n    description:\n      The type of the predicate used to map the subject and object entities.\n    range: entity_type_enum\n    see_also:\n      - https://github.com/mapping-commons/sssom/issues/143\n      - https://github.com/mapping-commons/sssom/blob/master/examples/schema/predicate-types.sssom.tsv\n    instantiates:\n      - sssom:Propagatable\n      - sssom:Versionable\n    annotations:\n      propagated: true\n      added_in: \"1.1\"\n    examples:\n      - value: owl:AnnotationProperty\n      - value: owl:ObjectProperty\n  object_id:\n    description: The ID of the object of the mapping.\n    mappings:\n      - owl:annotatedTarget\n    range: EntityReference\n    slot_uri: owl:annotatedTarget\n    examples:\n      - value: HP:0009894\n        description:\n          The CURIE denoting the Human Phenotype Ontology concept of 'Thickened\n          ears'.\n  object_label:\n    description: The label of object of the mapping.\n    range: string\n    examples:\n      - value: Thickened ears\n    recommended: true\n  object_category:\n    description:\n      The conceptual category to which the subject belongs to. This can be a\n      string denoting the category or a term from a controlled vocabulary. This\n      slot is deliberately underspecified. Conceptual categories can range from\n      those that are found in general upper ontologies such as BFO (e.g.\n      process, temporal region, etc) to those that serve as upper ontologies in\n      specific domains, such as COB or BioLink (e.g. gene, disease, chemical\n      entity). The purpose of this optional field is documentation for human\n      reviewers - when a category is known and documented clearly, the cost of\n      interpreting and evaluating the mapping decreases.\n    range: string\n    see_also:\n      - https://github.com/mapping-commons/sssom/issues/13\n      - https://github.com/mapping-commons/sssom/issues/256\n    examples:\n      - value: UBERON:0001062\n        description: The CURIE of the Uberon term for \"anatomical entity\".\n      - value: anatomical entity\n        description:\n          A string, rather than ID, describing the \"anatomical entity\" category.\n          This is possible, but less preferred than using an ID.\n      - value: biolink:Gene\n        description: The CURIE of the biolink class for genes.\n  mapping_justification:\n    description:\n      A mapping justification is an action (or the written representation of\n      that action) of showing a mapping to be right or reasonable.\n    range: EntityReference\n    pattern: \"^semapv:(MappingReview|ManualMappingCuration|LogicalReasoning|LexicalMatching|CompositeMatching|UnspecifiedMatching|SemanticSimilarityThresholdMatching|LexicalSimilarityThresholdMatching|MappingChaining|MappingInversion|StructuralMatching|InstanceBasedMatching|BackgroundKnowledgeBasedMatching)$\"\n    required: true\n    any_of:\n      - equals_string: semapv:LexicalMatching\n      - equals_string: semapv:LogicalReasoning\n      - equals_string: semapv:CompositeMatching\n      - equals_string: semapv:UnspecifiedMatching\n      - equals_string: semapv:SemanticSimilarityThresholdMatching\n      - equals_string: semapv:LexicalSimilarityThresholdMatching\n      - equals_string: semapv:MappingChaining\n      - equals_string: semapv:MappingReview\n      - equals_string: semapv:ManualMappingCuration\n      - equals_string: semapv:MappingInversion\n      - equals_string: semapv:StructuralMatching\n      - equals_string: semapv:InstanceBasedMatching\n      - equals_string: semapv:BackgroundKnowledgeBasedMatching\n    examples:\n      - value: semapv:LexicalMatching\n      - value: semapv:ManualMappingCuration\n    see_also:\n      - https://mapping-commons.github.io/semantic-mapping-vocabulary/\n      - https://www.ebi.ac.uk/ols4/ontologies/semapv\n  object_type:\n    description: The type of entity that is being mapped.\n    range: entity_type_enum\n    instantiates:\n      - sssom:Propagatable\n    annotations:\n      propagated: true\n    examples:\n      - value: owl:Class\n  mapping_set_id:\n    description:\n      A globally unique identifier for the mapping set (not each individual\n      mapping). Should ideally be resolvable.\n    required: true\n    range: NonRelativeURI\n    examples:\n      - value: http://purl.obolibrary.org/obo/mondo/mappings/mondo_exactmatch_ncit.sssom.tsv\n        description:\n          A persistent URI pointing to the latest version of the Mondo - NCIT\n          mapping in the Mondo namespace.\n  mapping_set_version:\n    description: A version string for the mapping.\n    range: string\n    slot_uri: owl:versionInfo\n    examples:\n      - value: \"2020-01-01\"\n        description:\n          A date-based version that indicates that the mapping was published on\n          the 1st January in 2021.\n      - value: \"1.2.1\"\n        description:\n          \"(A semantic version tag that indicates that this is the 1st major,\n          2nd minor version, patch 1 (https://semver.org/).)\"\n  mapping_set_group:\n    description:\n      Set by the owners of the mapping registry. A way to group related mapping\n      sets for example for UI purposes.\n    range: string\n  mapping_set_title:\n    description: The display name of a mapping set.\n    range: string\n    slot_uri: dcterms:title\n    examples:\n      - value: \"The Mondo-OMIM mappings by Monarch Initiative.\"\n  mapping_set_description:\n    description: A description of the mapping set.\n    range: string\n    slot_uri: dcterms:description\n    examples:\n      - value:\n          \"This mapping set was produced to integrate human and mouse phenotype\n          data at the IMPC. It is primarily used for making mouse phenotypes\n          searchable by human synonyms at https://mousephenotype.org/.\"\n  mapping_set_confidence:\n    instantiates:\n      - sssom:Versionable\n    annotations:\n      added_in: \"1.1\"\n    description: Mapping-set level confidence is assigned by the creator of the\n      mapping set to indicate their overall confidence in the correctness (i.e.,\n      precision) of mappings in the mapping set. Mapping set confidence is\n      intended to be used in cases were the creator wants to express an overall\n      confidence into the agent that curated the individual mappings, for\n      example a lexical matching tool, or a group of students.\n\n      When not explicitly specified, confidence estimation algorithms should\n      consider the mapping set confidence to be 1.0 by default.\n    range: double\n    minimum_value: 0.0\n    maximum_value: 1.0\n    examples:\n      - value: \"0.95\"\n        description:\n          A confidence score of 0.95, indicating 95% confidence that the\n          mappings in the mapping set are correct.\n    see_also:\n      - https://mapping-commons.github.io/sssom/confidence-model\n      - https://github.com/mapping-commons/sssom/issues/438\n      - https://github.com/mapping-commons/sssom/blob/master/examples/schema/mapping_set_confidence.sssom.tsv\n  creator_id:\n    description:\n      Identifies the persons or groups responsible for the creation of the\n      mapping. The creator is the agent that put the mapping in its published\n      form, which may be different from the author, which is a person that was\n      actively involved in the assertion of the mapping. Recommended to be a\n      list of ORCIDs or otherwise identifying URIs.\n    slot_uri: dcterms:creator\n    range: EntityReference\n    multivalued: true\n    examples:\n      - value: orcid:0000-0002-7356-1779|orcid:0000-0002-6601-2165\n        description: >-\n          The ORCID of the (multiple) creators of the mapping. Note that this is\n          how the example would look like specifically in the SSSOM/TSV format,\n          where multivalued slots such as `creator_id` are represented as single\n          strings containing `|`-separated values.\n      - value: orcid:0000-0002-7356-1779\n        description: The ORCID of the creator of the mapping.\n  creator_label:\n    description: >-\n      A string representing the creator of this mapping. This should only be\n      used in the absence of a proper semantic identifier (which would be stored\n      in creator_id) for that creator. It is not expected that there should be\n      any link between creator_id and creator_label; in particular,\n      creator_label is not intended to provide a human-friendly version of an\n      identifier in creator_id.\n    range: string\n    multivalued: true\n    examples:\n      - value: Nicolas Matentzoglu|Chris Mungall\n        description: >-\n          The human-readable names of the (multiple) creators of the mapping.\n          Note that this is how the example would look like specifically in the\n          SSSOM/TSV format, where multivalued slots such as `creator_label` are\n          represented as single strings containing `|`-separated values.\n      - value: Nicolas Matentzoglu\n        description: The human-readable name of the creator of the mapping.\n  author_id:\n    description:\n      Identifies the persons or groups responsible for asserting the mappings.\n      Recommended to be a list of ORCIDs or otherwise identifying URIs.\n    slot_uri: pav:authoredBy\n    range: EntityReference\n    multivalued: true\n    examples:\n      - value: orcid:0000-0002-7356-1779|orcid:0000-0002-6601-2165\n        description: >-\n          The ORCID of the (multiple) authors of the mapping. Note that this is\n          how the example would look like specifically in the SSSOM/TSV format,\n          where multivalued slots such as `author_id` are represented as single\n          strings containing `|`-separated values.\n      - value: orcid:0000-0002-7356-1779\n        description: The ORCID of the author of the mapping.\n  author_label:\n    description: >-\n      A string representing the author of this mapping. This should only be used\n      in the absence of a proper semantic identifier (which would be stored in\n      author_id) for that author. It is not expected that there should be any\n      link between author_id and author_label; in particular, author_label is\n      not intended to provide a human-friendly version of an identifier in\n      author_id.\n    range: string\n    multivalued: true\n    examples:\n      - value: Nicolas Matentzoglu|Chris Mungall\n        description: >-\n          The human-readable names of the (multiple) authors of the mapping.\n          Note that this is how the example would look like specifically in the\n          SSSOM/TSV format, where multivalued slots such as `author_label` are\n          represented as single strings containing `|`-separated values.\n      - value: Nicolas Matentzoglu\n        description: The human-readable name of the author of the mapping.\n  reviewer_id:\n    description:\n      Identifies the persons or groups that reviewed and confirmed the mapping.\n      Recommended to be a list of ORCIDs or otherwise identifying URIs.\n    range: EntityReference\n    multivalued: true\n    examples:\n      - value: orcid:0000-0002-7356-1779|orcid:0000-0002-6601-2165\n        description: >-\n          The ORCID of the (multiple) reviewers of the mapping. Note that this\n          is how the example would look like specifically in the SSSOM/TSV\n          format, where multivalued slots such as `reviewer_id` are represented\n          as single strings containing `|`-separated values.\n      - value: orcid:0000-0002-7356-1779\n        description: The ORCID of the reviewer of the mapping.\n  reviewer_label:\n    description: >-\n      A string representing the reviewer of this mapping. This should only be\n      used in the absence of a proper semantic identifier (which would be stored\n      in reviewer_id) for that reviewer. It is not expected that there should be\n      any link between reviewer_id and reviewer_label; in particular,\n      reviewer_label is not intended to provide a human-friendly version of an\n      identifier in reviewer_id.\n    range: string\n    multivalued: true\n    examples:\n      - value: Nicolas Matentzoglu|Chris Mungall\n        description: >-\n          The human-readable names of the (multiple) reviewers of the mapping.\n          Note that this is how the example would look like specifically in the\n          SSSOM/TSV format, where multivalued slots such as `reviewer_label` are\n          represented as single strings containing `|`-separated values.\n      - value: Nicolas Matentzoglu\n        description: The human-readable name of the reviewer of the mapping.\n  license:\n    description:\n      A url to the license of the mapping. In absence of a license we assume no\n      license.\n    range: NonRelativeURI\n    slot_uri: dcterms:license\n    examples:\n      - value: https://creativecommons.org/licenses/by/4.0/\n        description:\n          The URI of the Creative Commons Attribution 4.0 International license.\n  subject_source:\n    description: URI of vocabulary or identifier source for the subject.\n    range: EntityReference\n    instantiates:\n      - sssom:Propagatable\n    annotations:\n      propagated: true\n    examples:\n      - value: obo:mondo.owl\n        description:\n          A persistent OBO CURIE pointing to the latest version of the Mondo\n          ontology.\n      - value: wikidata:Q7876491\n        description: A Wikidata identifier for the Uberon ontology resource.\n  subject_source_version:\n    description:\n      Version IRI or version string of the source of the subject term.\n    range: string\n    instantiates:\n      - sssom:Propagatable\n    annotations:\n      propagated: true\n    examples:\n      - value: http://purl.obolibrary.org/obo/mondo/releases/2021-01-30/mondo.owl\n        description:\n          A persistent Version IRI pointing to the Mondo version '2021-01-30'\n  object_source:\n    description: URI of vocabulary or identifier source for the object.\n    range: EntityReference\n    instantiates:\n      - sssom:Propagatable\n    annotations:\n      propagated: true\n    examples:\n      - value: obo:mondo.owl\n        description:\n          A persistent OBO CURIE pointing to the latest version of the Mondo\n          ontology.\n      - value: wikidata:Q7876491\n        description: A Wikidata identifier for the Uberon ontology resource.\n  object_source_version:\n    description: Version IRI or version string of the source of the object term.\n    range: string\n    instantiates:\n      - sssom:Propagatable\n    annotations:\n      propagated: true\n    examples:\n      - value: http://purl.obolibrary.org/obo/mondo/releases/2021-01-30/mondo.owl\n        description:\n          A persistent Version IRI pointing to the Mondo version '2021-01-30'\n  mapping_provider:\n    description:\n      URL pointing to the source that provided the mapping, for example an\n      ontology that already contains the mappings, or a database from which it\n      was derived.\n    range: NonRelativeURI\n    instantiates:\n      - sssom:Propagatable\n    annotations:\n      propagated: true\n    examples:\n      - value: https://www.ohdsi.org/\n        description:\n          A URL pointing to the Observational Health Data Sciences and\n          Informatics initiative.\n      - value: https://monarchinitiative.org/\n        description: A URL pointing to the Monarch Initiative Resource.\n  mapping_set_source:\n    description:\n      A mapping set or set of mapping set that was used to derive the mapping\n      set.\n    slot_uri: prov:wasDerivedFrom\n    range: NonRelativeURI\n    multivalued: true\n    examples:\n      - value: http://purl.obolibrary.org/obo/mondo/mappings/2022-05-20/mondo_exactmatch_ncit.sssom.tsv\n        description:\n          A persistent, ideally versioned, link to the mapping set from which\n          the current mapping set is derived.\n  mapping_source:\n    description:\n      The mapping set this mapping was originally defined in. mapping_source is\n      used for example when merging multiple mapping sets or deriving one\n      mapping set from another.\n    range: EntityReference\n    examples:\n      - value: MONDO_MAPPINGS:mondo_exactmatch_ncit.sssom.tsv\n        description:\n          A reference to the mapping set that originally contained this mapping.\n  mapping_cardinality:\n    description:\n      A value indicating whether the subject (respectively object) of this\n      mapping record is present in other records involving a different object\n      (respectively subject), within the subset of records defined by the\n      cardinality_scope slot (or within the entire mapping set if\n      cardinality_scope is undefined). Note that this is a convenience field,\n      whose values can always be derived from the mapping set.\n    range: mapping_cardinality_enum\n    examples:\n      - value: \"1:1\"\n        description:\n          A one-to-one mapping. There are no other records in which the same\n          subject is mapped to a different object, and no other records in which\n          the same object is mapped to a different subject.\n      - value: \"1:n\"\n        description:\n          A one-to-many mapping. There are other records in which the same\n          subject is mapped to at least one different object than the object\n          present in this record; there are no other records in which the object\n          is mapped to a different subject.\n    see_also:\n      - https://github.com/mapping-commons/sssom/blob/master/examples/schema/cardinality.sssom.tsv\n      - https://github.com/mapping-commons/sssom/blob/master/examples/schema/cardinality-with-unmapped-entities.sssom.tsv\n      - https://github.com/mapping-commons/sssom/blob/master/examples/schema/cardinality-scope-empty.sssom.tsv\n  cardinality_scope:\n    description:\n      A list of mapping slots that define the scope for the value found in the\n      mapping_cardinality slot. Mappings are considered to belong to the same\n      scope if they have the same value for all slots listed in the scope. If no\n      scope is defined, the default scope is empty, meaning that all mappings\n      belong to a single scope that is identical to the entire mapping set. The\n      behaviour if a value in the list does not correspond to a valid slot name\n      is undefined.\n    range: string\n    multivalued: true\n    instantiates:\n      - sssom:Propagatable\n      - sssom:Versionable\n    annotations:\n      propagated: true\n      added_in: \"1.1\"\n    examples:\n      - value: predicate_id\n        description: >-\n          Indicates that mapping_cardinality is computed relatively to all\n          mappings that have the same predicate.\n      - value: \"predicate_id|object_source\"\n        description: >-\n          Indicates that mapping_cardinality is computed relatively to all\n          mappings that have the same predicate and the same object source. Note\n          that this is how the example would look like specifically in the\n          SSSOM/TSV format, where multivalued slots like `cardinality_scope` are\n          represented as a single string containing `|`-separated values.\n    see_also:\n      - https://github.com/mapping-commons/sssom/issues/467\n      - https://github.com/mapping-commons/sssom/blob/master/examples/schema/cardinality-scope-predicate.sssom.tsv\n      - https://github.com/mapping-commons/sssom/blob/master/examples/schema/cardinality-scope-predicate+object_source.sssom.tsv\n  mapping_tool:\n    description:\n      A reference to the tool or algorithm that was used to generate the\n      mapping. Should be a URL pointing to more info about it, but can be free\n      text. Consider using the mapping_tool_id slot for a more standardised\n      reference.\n    range: string\n    instantiates:\n      - sssom:Propagatable\n    annotations:\n      propagated: true\n    examples:\n      - value: https://github.com/AgreementMakerLight/AML-Project\n        description: A URL pointing to the AgreementMakerLight project.\n      - value: AgreementMakerLight\n        description: A string (name) denoting the AgreementMakerLight project.\n  mapping_tool_id:\n    description:\n      The ID (entity reference) of the tool or algorithm that was used to\n      generate the mapping.\n    range: EntityReference\n    instantiates:\n      - sssom:Propagatable\n      - sssom:Versionable\n    annotations:\n      propagated: true\n      added_in: \"1.1\"\n    examples:\n      - value: wikidata:Q58057366\n        description:\n          A wikidata PURL identifying the AgreementMakerLight project.\n    see_also:\n      - https://github.com/mapping-commons/sssom/blob/master/examples/schema/mapping_tool_id.sssom.tsv\n      - https://github.com/mapping-commons/sssom/issues/449\n  mapping_tool_version:\n    description:\n      Version string that denotes the version of the mapping tool used.\n    range: string\n    instantiates:\n      - sssom:Propagatable\n    annotations:\n      propagated: true\n    examples:\n      - value: v3.2\n  mapping_date:\n    description:\n      The date the mapping was asserted. This is different from the date the\n      mapping was published or compiled in a SSSOM file.\n    slot_uri: dcterms:created\n    range: date\n    instantiates:\n      - sssom:Propagatable\n    examples:\n      - value: \"2021-01-01\"\n    annotations:\n      propagated: true\n  publication_date:\n    description:\n      The date the mapping was published. This is different from the date the\n      mapping was asserted.\n    slot_uri: dcterms:issued\n    range: date\n    examples:\n      - value: \"2021-01-01\"\n  review_date:\n    description:\n      The date the mapping was reviewed. This is different from the date the\n      mapping was asserted and published. If this field is used in a mapping,\n      reviewer_id and/or reviewer_label MUST also be be set.\n    range: date\n    examples:\n      - value: \"2021-01-01\"\n    instantiates:\n      - sssom:Versionable\n    annotations:\n      added_in: \"1.1\"\n    see_also:\n      - https://github.com/mapping-commons/sssom/issues/511\n      - https://github.com/mapping-commons/sssom/blob/master/examples/schema/review_date.sssom.tsv\n  confidence:\n    description: A value assigned by the creator of the mapping to denote the\n      creator's confidence or estimated probability that the mapping record is\n      correct. A value of 1.0 means the creator has full confidence in the\n      correctness of the mapping record, while a value of 0.0 means the creator\n      is fully unsure whether the mapping record is correct or not.\n\n      When not explicitly specified, confidence estimation algorithms should\n      consider the mapping confidence to be 1.0 by default.\n    range: double\n    minimum_value: 0.0\n    maximum_value: 1.0\n    see_also:\n      - https://mapping-commons.github.io/sssom/confidence-model\n    examples:\n      - value: \"0.95\"\n        description: A confidence score of 0.95, indicating 95% confidence.\n  reviewer_agreement:\n    description: A value assigned by the reviewer of the mapping to denote their\n      confidence that the mapping record is correct. A value of 1.0 means the\n      reviewer fully agrees with the mapping record. A value of -1.0 means the\n      reviewer fully disagrees with the mapping record. A value of 0.0 means the\n      reviewer is not sure whether the mapping record is correct or not.\n\n      When not explicitly specified, confidence estimation algorithms should\n      consider the reviewer agreement to be 1.0 by default.\n    range: double\n    minimum_value: -1.0\n    maximum_value: 1.0\n    instantiates:\n      - sssom:Versionable\n    annotations:\n      added_in: \"1.1\"\n    see_also:\n      - https://mapping-commons.github.io/sssom/confidence-model\n      - https://github.com/mapping-commons/sssom/issues/510\n      - https://github.com/mapping-commons/sssom/pull/519\n    examples:\n      - value: \"1.0\"\n        description:\n          A reviewer agreement of 1.0 denotes that the reviewer considers the\n          mapping record to be correct with full confidence\n      - value: \"-1.0\"\n        description:\n          A reviewer agreement of -1.0 denotes that the reviewer considers the\n          mapping record to be incorrect with full confidence\n      - value: \"0.0\"\n        description:\n          A reviewer agreement of 0.0 denotes that the reviewer is not sure\n          whether the mapping record is correct or not.\n  subject_match_field:\n    description: >-\n      A list of properties, annotations or attributes related to the subject\n      that was used to establish the match. This property is recommended for use\n      in conjunction with  mapping justifications related to lexical matching,\n      such as `semapv:LexicalMatching`.  For additional information see the 'See\n      Also' section.\n    range: EntityReference\n    multivalued: true\n    instantiates:\n      - sssom:Propagatable\n    annotations:\n      propagated: true\n    examples:\n      - value: rdfs:label\n        description:\n          \"The RDFS label property (rdfs:label) was used to match the subject.\"\n      - value: skos:prefLabel\n        description:\n          \"The SKOS preferred label property (skos:prefLabel) was used to match\n          the subject.\"\n    see_also:\n      - https://mapping-commons.github.io/sssom/mapping-justifications/#lexical-matching\n      - https://github.com/mapping-commons/sssom/issues/413\n  object_match_field:\n    description: >-\n      A list of properties, annotations or attributes related to the object that\n      was used to establish the match. This property is recommended for use in\n      conjunction with  mapping justifications related to lexical matching, such\n      as `semapv:LexicalMatching`.  For additional information see the 'See\n      Also' section.\n    range: EntityReference\n    multivalued: true\n    instantiates:\n      - sssom:Propagatable\n    annotations:\n      propagated: true\n    examples:\n      - value: rdfs:label\n        description:\n          \"The RDFS label property (rdfs:label) was used to match the object.\"\n      - value: skos:prefLabel\n        description:\n          \"The SKOS preferred label property (skos:prefLabel) was used to match\n          the object.\"\n    see_also:\n      - https://mapping-commons.github.io/sssom/mapping-justifications/#lexical-matching\n      - https://github.com/mapping-commons/sssom/issues/413\n  match_string:\n    description:\n      String that is shared by subj/obj. It is recommended to indicate the\n      fields for the match using the object and subject_match_field slots.\n    range: string\n    multivalued: true\n    examples:\n      - value: \"gala\"\n        description:\n          \"The 'gala' string was matched for both subject and object.\"\n  subject_preprocessing:\n    description:\n      Method of preprocessing applied to the fields of the subject. If different\n      preprocessing steps were performed on different fields, it is recommended\n      to store the match in separate rows.\n    range: EntityReference\n    multivalued: true\n    instantiates:\n      - sssom:Propagatable\n    annotations:\n      propagated: true\n    examples:\n      - value: semapv:Stemming\n      - value: semapv:StopWordRemoval\n  object_preprocessing:\n    description:\n      Method of preprocessing applied to the fields of the object. If different\n      preprocessing steps were performed on different fields, it is recommended\n      to store the match in separate rows.\n    range: EntityReference\n    multivalued: true\n    instantiates:\n      - sssom:Propagatable\n    annotations:\n      propagated: true\n    examples:\n      - value: semapv:Stemming\n      - value: semapv:StopWordRemoval\n  curation_rule:\n    description:\n      A curation rule is a (potentially) complex condition executed by an agent\n      that led to the establishment of a mapping. Curation rules often involve\n      complex domain-specific considerations, which are hard to capture in an\n      automated fashion. The curation rule is captured as a resource rather than\n      a string, which enables higher levels of transparency and sharing across\n      mapping sets. The URI representation of the curation rule is expected to\n      be a resolvable identifier which provides details about the nature of the\n      curation rule.\n    range: EntityReference\n    instantiates:\n      - sssom:Propagatable\n    annotations:\n      propagated: true\n    multivalued: true\n    examples:\n      - value: DISEASE_MAPPING_COMMONS_RULES:MPR2\n        description:\n          A reference to the Disease Mapping Commons rule with the ID MPR2.\n    see_also:\n      - https://github.com/mapping-commons/sssom/issues/166\n      - https://github.com/mapping-commons/sssom/pull/258\n      - https://github.com/mapping-commons/sssom/blob/master/examples/schema/curation_rule.sssom.tsv\n      - https://github.com/mapping-commons/sssom/blob/master/examples/schema/curation_rule-propagated.sssom.tsv\n  curation_rule_text:\n    description:\n      A curation rule is a (potentially) complex condition executed by an agent\n      that led to the establishment of a mapping. Curation rules often involve\n      complex domain-specific considerations, which are hard to capture in an\n      automated fashion. The curation rule should be captured as a resource\n      (entity reference) rather than a string (see curation_rule element), which\n      enables higher levels of transparency and sharing across mapping sets. The\n      textual representation of curation rule is intended to be used in cases\n      where the creation of a resource is not practical from the perspective of\n      the mapping_provider.\n    range: string\n    instantiates:\n      - sssom:Propagatable\n    annotations:\n      propagated: true\n    multivalued: true\n    examples:\n      - value:\n          \"The two phenotypes inhere in homologous structures and exhibit the\n          same phenotypic quality.\"\n      - value: \"The two diseases are used synonymous in the medical literature.\"\n    see_also:\n      - https://github.com/mapping-commons/sssom/issues/166\n      - https://github.com/mapping-commons/sssom/pull/258\n      - https://github.com/mapping-commons/sssom/blob/master/examples/schema/curation_rule_text.sssom.tsv\n      - https://github.com/mapping-commons/sssom/blob/master/examples/schema/curation_rule_text-propagated.sssom.tsv\n  similarity_score:\n    description:\n      A score between 0 and 1 to denote the similarity between two entities,\n      where 1 denotes equivalence, and 0 denotes disjointness. The score is\n      meant to be used in conjunction with the similarity_measure field, to\n      document, for example, the lexical or semantic match of a matching\n      algorithm.\n    range: double\n    minimum_value: 0.0\n    maximum_value: 1.0\n    examples:\n      - value: \"0.95\"\n        description: A similarity score of 0.95, indicating 95% similarity.\n    see_also:\n      - https://github.com/mapping-commons/sssom/issues/385\n      - https://github.com/mapping-commons/sssom/pull/386\n      - https://github.com/mapping-commons/sssom/blob/master/examples/schema/similarity_score.sssom.tsv\n  similarity_measure:\n    description:\n      The measure used for computing a similarity score. This field is meant to\n      be used in conjunction with the similarity_score field, to document, for\n      example, the lexical or semantic match of a matching algorithm. To make\n      processing this field as unambiguous as possible, we recommend using\n      wikidata CURIEs, but the type of this field is deliberately unspecified.\n    range: string\n    instantiates:\n      - sssom:Propagatable\n    annotations:\n      propagated: true\n    examples:\n      - value: https://www.wikidata.org/entity/Q865360\n        description: the Wikidata IRI for the Jaccard index measure).\n      - value: wikidata:Q865360\n        description: the Wikidata CURIE for the Jaccard index measure).\n      - value: Levenshtein distance\n        description:\n          a score to measure the distance between two character sequences).\n    see_also:\n      - https://github.com/mapping-commons/sssom/issues/385\n      - https://github.com/mapping-commons/sssom/pull/386\n      - https://github.com/mapping-commons/sssom/blob/master/examples/schema/similarity_score.sssom.tsv\n  issue_tracker_item:\n    description: The issue tracker item discussing this mapping.\n    range: EntityReference\n    examples:\n      - value: SSSOM_GITHUB_ISSUE:166\n        description:\n          A URL resolving to an issue discussing a new SSSOM element request\n    see_also:\n      - https://github.com/mapping-commons/sssom/issues/78\n      - https://github.com/mapping-commons/sssom/pull/259\n      - https://github.com/mapping-commons/sssom/blob/master/examples/schema/issue_tracker_item.sssom.tsv\n  issue_tracker:\n    description: A URL location of the issue tracker for this entity.\n    range: NonRelativeURI\n    examples:\n      - value: https://github.com/mapping-commons/mh_mapping_initiative/issues\n        description:\n          A URL resolving to the issue tracker of the Mouse-Human mapping\n          initiative\n    see_also:\n      - https://github.com/mapping-commons/sssom/issues/78\n      - https://github.com/mapping-commons/sssom/pull/259\n      - https://github.com/mapping-commons/sssom/blob/master/examples/schema/issue_tracker.sssom.tsv\n  see_also:\n    description:\n      A URL specific for the mapping instance. E.g. for kboom we have a\n      per-mapping image that shows surrounding axioms that drive probability.\n      Could also be a github issue URL that discussed a complicated alignment\n    slot_uri: rdfs:seeAlso\n    examples:\n      - value: https://github.com/mapping-commons/mh_mapping_initiative/pull/41\n        description:\n          A URL pointing to the pull request that introduced the mapping.\n    range: NonRelativeURI\n    multivalued: true\n    see_also:\n      - https://github.com/mapping-commons/sssom/issues/422\n  other:\n    description:\n      \"Pipe separated list of key value pairs for properties not part of the\n      SSSOM spec. Can be used to encode additional provenance data. NOTE. This\n      field is not recommended for general use, and should be used sparingly.\n      See\n      https://github.com/mapping-commons/sssom/blob/master/examples/schema/extension-slots.sssom.tsv\n      for an alternative approach based on extension slots.\"\n    range: string\n  comment:\n    description:\n      Free text field containing either curator notes or text generated by tool\n      providing additional informative information.\n    slot_uri: rdfs:comment\n    range: string\n    examples:\n      - value:\n          This mapping is weird in that the hierarchical position of the two\n          terms is very different.\n        description:\n          A comment explaining a mapping authors reservation on a mapping.\n  extension_definitions:\n    description:\n      A list that defines the extension slots used in the mapping set.\n    range: extension definition\n    multivalued: true\n    see_also:\n      - https://github.com/mapping-commons/sssom/issues/328\n      - https://github.com/mapping-commons/sssom/blob/master/examples/schema/extension-slots.sssom.tsv\n  record_id:\n    description: >-\n      A unique identifier for a mapping record, that is for an instance of the\n      Mapping class (in the SSSOM/TSV serialisation, this corresponds to an\n      individual row after propagation is applied). This slot is intended to\n      uniquely identify one such record within a mapping set and may for example\n      act as the resource identifier for the record when it is serialised into\n      RDF. This slot MUST NOT be used to “group” several records together to\n      indicate that they pertain to a single mapping (for example, that they\n      represent different versions of the same mapping), by assigning the same\n      ID to several records. When it is used, every record within a set MUST\n      have a unique, non-empty value. The identifier MUST be a URI; beyond that,\n      its format is unconstrained and the identifier MUST be treated as an\n      opaque string.\n    range: EntityReference\n    instantiates:\n      - sssom:Versionable\n    annotations:\n      added_in: \"1.1\"\n    see_also:\n      - https://github.com/mapping-commons/sssom/issues/359\n      - https://github.com/mapping-commons/blob/master/examples/schema/record-ids.sssom.tsv\nclasses:\n  mapping set:\n    description: Represents a set of mappings.\n    slot_usage:\n      license:\n        required: true\n      similarity_measure:\n        instantiates:\n          - sssom:Versionable\n        annotations:\n          added_in: \"1.1\"\n      curation_rule:\n        instantiates:\n          - sssom:Versionable\n        annotations:\n          added_in: \"1.1\"\n      curation_rule_text:\n        instantiates:\n          - sssom:Versionable\n        annotations:\n          added_in: \"1.1\"\n    slots:\n      - sssom_version\n      - curie_map\n      - mappings\n      - mapping_set_id\n      - mapping_set_version\n      - mapping_set_source\n      - mapping_set_title\n      - mapping_set_description\n      - mapping_set_confidence\n      - creator_id\n      - creator_label\n      - license\n      - subject_type\n      - subject_source\n      - subject_source_version\n      - object_type\n      - object_source\n      - object_source_version\n      - predicate_type\n      - mapping_provider\n      - cardinality_scope\n      - mapping_tool\n      - mapping_tool_id\n      - mapping_tool_version\n      - mapping_date\n      - publication_date\n      - subject_match_field\n      - object_match_field\n      - subject_preprocessing\n      - object_preprocessing\n      - similarity_measure\n      - curation_rule\n      - curation_rule_text\n      - see_also\n      - issue_tracker\n      - other\n      - comment\n      - extension_definitions\n  mapping:\n    description: Represents an individual mapping between a pair of entities.\n    slots:\n      - record_id\n      - subject_id\n      - subject_label\n      - subject_category\n      - predicate_id\n      - predicate_label\n      - predicate_modifier\n      - object_id\n      - object_label\n      - object_category\n      - mapping_justification\n      - author_id\n      - author_label\n      - reviewer_id\n      - reviewer_label\n      - creator_id\n      - creator_label\n      - license\n      - subject_type\n      - subject_source\n      - subject_source_version\n      - object_type\n      - object_source\n      - object_source_version\n      - predicate_type\n      - mapping_provider\n      - mapping_source\n      - mapping_cardinality\n      - cardinality_scope\n      - mapping_tool\n      - mapping_tool_id\n      - mapping_tool_version\n      - mapping_date\n      - publication_date\n      - review_date\n      - confidence\n      - reviewer_agreement\n      - curation_rule\n      - curation_rule_text\n      - subject_match_field\n      - object_match_field\n      - match_string\n      - subject_preprocessing\n      - object_preprocessing\n      - similarity_score\n      - similarity_measure\n      - see_also\n      - issue_tracker_item\n      - other\n      - comment\n    class_uri: owl:Axiom\n    unique_keys:\n      record_identifier:\n        description: >-\n          Each mapping within a mapping set MAY be identified by a unique,\n          opaque record identifier. This slot MUST be used consistently, in that\n          either all mappings in the set have a such a record identifier, or\n          none of them have one. The behaviour when a set contains both mappings\n          with a record identifier and mappings without a record identifier is\n          unspecified. The behaviour when two mappings have the same record\n          identifier is unspecified.\n        unique_key_slots:\n          - record_id\n    rules:\n      - preconditions:\n          slot_conditions:\n            subject_type:\n              equals_string: \"rdfs literal\"\n        postconditions:\n          slot_conditions:\n            subject_label:\n              required: true\n      - preconditions:\n          slot_conditions:\n            subject_type:\n              none_of:\n                - equals_string: \"rdfs literal\"\n        postconditions:\n          slot_conditions:\n            subject_id:\n              required: true\n      - preconditions:\n          slot_conditions:\n            object_type:\n              equals_string: \"rdfs literal\"\n        postconditions:\n          slot_conditions:\n            object_label:\n              required: true\n      - preconditions:\n          slot_conditions:\n            object_type:\n              none_of:\n                - equals_string: \"rdfs literal\"\n        postconditions:\n          slot_conditions:\n            object_id:\n              required: true\n      - description:\n          If a review date is provided, then at at least one of reviewer_id or\n          reviewer_label must also be provided\n        preconditions:\n          slot_conditions:\n            review_date:\n              required: true\n        postconditions:\n          any_of:\n            - slot_conditions:\n                reviewer_id:\n                  required: true\n            - slot_conditions:\n                reviewer_label:\n                  required: true\n      - description:\n          If a reviewer agreement value is provided, then at at least one of\n          reviewer_id or reviewer_label must also be provided\n        preconditions:\n          slot_conditions:\n            reviewer_agreement:\n              required: true\n        postconditions:\n          any_of:\n            - slot_conditions:\n                reviewer_id:\n                  required: true\n            - slot_conditions:\n                reviewer_label:\n                  required: true\n\n  mapping registry:\n    description:\n      A registry for managing mapping sets. It holds a set of mapping set\n      references, and can import other registries.\n    slots:\n      - mapping_registry_id\n      - mapping_registry_title\n      - mapping_registry_description\n      - imports\n      - mapping_set_references\n      - documentation\n      - homepage\n      - issue_tracker\n  mapping set reference:\n    description:\n      A reference to a mapping set. It allows to augment mapping set metadata\n      from the perspective of the registry, for example, providing confidence,\n      or a local filename or a grouping.\n    slots:\n      - mapping_set_id\n      - mirror_from\n      - registry_confidence\n      - mapping_set_group\n      - last_updated\n      - local_name\n  prefix:\n    slots:\n      - prefix_name\n      - prefix_url\n  extension definition:\n    description: A definition of an extension (non-standard) slot.\n    attributes:\n      slot_name:\n        description: The name of the extension slot.\n        range: ncname\n        required: true\n      property:\n        description:\n          The property associated with the extension slot. It is intended to\n          provide a non-ambiguous meaning to the slot (contrary to the\n          slot_name, which for brevity reasons may be ambiguous).\n        range: uriorcurie\n      type_hint:\n        description: Expected type of the values of the extension slot.\n        range: uriorcurie\n  Propagatable:\n    class_uri: sssom:Propagatable\n    description:\n      Metamodel extension class to describe slots whose value can be propagated\n      down from the MappingSet class to the Mapping class.\n    see_also:\n      - https://github.com/mapping-commons/sssom/issues/305\n    attributes:\n      propagated:\n        description:\n          Indicates whether a slot can be propagated from a mapping down to\n          individual mappings.\n        range: boolean\n  Versionable:\n    class_uri: sssom:Versionable\n    description:\n      Metamodel extension class to manage slots that may not exist in all\n      versions of the model.\n    attributes:\n      added_in:\n        description:\n          The version of the specification in which the slot was added. If not\n          specified, the slot must be assumed to have been added in version 1.0.\n        range: sssom_version_enum\n  NoTermFound:\n    class_uri: sssom:NoTermFound\n    description:\n      sssom:NoTermFound can be used in place of a subject_id or object_id when\n      the corresponding entity could not be found. It SHOULD be used in\n      conjunction with a corresponding subject_source or object_source to\n      signify where the term was not found.\n    see_also:\n      - https://github.com/mapping-commons/sssom/issues/28\n      - https://github.com/mapping-commons/sssom/blob/master/examples/schema/no_term_found.sssom.tsv\n"
  },
  {
    "path": "tests/__init__.py",
    "content": ""
  },
  {
    "path": "tests/input/CONFIG.yaml",
    "content": "model_name: template-config-model\nroot_schema: config_model\n\nmodel_organization: linkml\nmodel_author: Harold Solbrig\nmodel_author_email: solbrig@jhu.edu\nmodel_synopsis: Configuration parameters for LinkML model generation\nmodel_description: |-\n  The parameters used to create and generate a new model derived from the LinkML Model Template\n\n# Trove Classifiers (https://pypi.org/classifiers/) -- copied to setup.cfg only if not already present\nclassifiers:\n  - \"Development Status :: 4 - Beta\"\n  - \"Environment :: Console\"\n  - \"Intended Audience :: Developers\"\n  - \"Intended Audience :: Science/Research\"\n  - \"Intended Audience :: Information Technology\"\n  - \"License :: CC0 1.0 Universal (CC0 1.0) Public Domain Dedication\"\n  - \"Programming Language :: Python :: 3 :: Only\"\n  - \"Programming Language :: Python :: 3.7\"\n  - \"Programming Language :: Python :: 3.8\"\n  - \"Programming Language :: Python :: 3.9\"\n\n# Keywords -- copied to setup.cfg only if not already present\nkeywords: [linkml, LOD, Modeling, Linked open data, model]\n\n# Elements to be generated\n# See: https://github.com/linkml/linkml/generators/README.md for what the outputs look like\n# Possible values: graphql -- graphql schema for the model\n#                  json -- LinkML model definition in JSON syntax\n#                  jsonld_context -- JSON-LD context definitions for model\n#                  json_schema -- Model schema in json schema\n#                  owl -- OWL representation of model schema\n#                  rdf -- LinkML Model definition in RDF\n#                  shex -- LinkML model definition in ShEx\ngenerate: [jsonld_context, json_schema]\n"
  },
  {
    "path": "tests/input/README.md",
    "content": "# Tests input directory\nThis file contains samples of your schema. Samples can written in yaml, json, rdf or any other language that \nthe [https://linkml.github.io/linkml-runtime]() importers and exporters support.\n\n`test_examples.py` will iterate over this directory, loading each test and:\n1) For each runtime generator (yaml, json, rdf, ...) will emit the output in that language\n2) Will compare the output to its expected value in the `output` directory and will alert you if something\nhas changed\n3) If something HAS changed, will update the output accordingly.\n\n[ ] Add a manifest setup https://linkml.github.io/linkml-template-config-model, so we can specify whether\nwe expect the tests to pass or fail and, if they fail, why.\n"
  },
  {
    "path": "tests/test_added_in_annotations.py",
    "content": "import unittest\nfrom jsonasobj2 import as_dict\n\nfrom linkml_runtime.utils.schemaview import SchemaView, load_schema_wrap\n\nCURRENT_VERSION = \"1.1\"\n\n\nclass TestAddedInAnnotationTestCase(unittest.TestCase):\n    \"\"\"Checks that all newly added slots are annotated as such.\"\"\"\n\n    def test_new_slots(self):\n        # For all the classes we care about, we list the pre-existing\n        # slots in the last version before the current one.\n        # That list should be updated after every release corresponding\n        # to a new version of the spec (e.g. after the 1.1 release, add\n        # all the 1.1 slots).\n        baseslots = {\n            \"mapping set\": [\n                \"curie_map\",\n                \"mappings\",\n                \"mapping_set_id\",\n                \"mapping_set_version\",\n                \"mapping_set_source\",\n                \"mapping_set_title\",\n                \"mapping_set_description\",\n                \"creator_id\",\n                \"creator_label\",\n                \"license\",\n                \"subject_type\",\n                \"subject_source\",\n                \"subject_source_version\",\n                \"object_type\",\n                \"object_source\",\n                \"object_source_version\",\n                \"mapping_provider\",\n                \"mapping_tool\",\n                \"mapping_tool_version\",\n                \"mapping_date\",\n                \"publication_date\",\n                \"subject_match_field\",\n                \"object_match_field\",\n                \"subject_preprocessing\",\n                \"object_preprocessing\",\n                \"see_also\",\n                \"issue_tracker\",\n                \"other\",\n                \"comment\",\n                \"extension_definitions\",\n            ],\n            \"mapping\": [\n                \"subject_id\",\n                \"subject_label\",\n                \"subject_category\",\n                \"predicate_id\",\n                \"predicate_label\",\n                \"predicate_modifier\",\n                \"object_id\",\n                \"object_label\",\n                \"object_category\",\n                \"mapping_justification\",\n                \"author_id\",\n                \"author_label\",\n                \"reviewer_id\",\n                \"reviewer_label\",\n                \"creator_id\",\n                \"creator_label\",\n                \"license\",\n                \"subject_type\",\n                \"subject_source\",\n                \"subject_source_version\",\n                \"object_type\",\n                \"object_source\",\n                \"object_source_version\",\n                \"mapping_provider\",\n                \"mapping_source\",\n                \"mapping_cardinality\",\n                \"mapping_tool\",\n                \"mapping_tool_version\",\n                \"mapping_date\",\n                \"publication_date\",\n                \"confidence\",\n                \"curation_rule\",\n                \"curation_rule_text\",\n                \"subject_match_field\",\n                \"object_match_field\",\n                \"match_string\",\n                \"subject_preprocessing\",\n                \"object_preprocessing\",\n                \"similarity_score\",\n                \"similarity_measure\",\n                \"see_also\",\n                \"issue_tracker_item\",\n                \"other\",\n                \"comment\",\n            ],\n        }\n        unannotated = []\n        annotated_with_wrong_version = []\n\n        sv = SchemaView(load_schema_wrap(\"src/sssom_schema/schema/sssom_schema.yaml\"))\n        for class_name, class_view in sv.all_classes().items():\n            baseslots_for_class = baseslots.get(class_name)\n            if baseslots_for_class is None:\n                continue\n\n            for slot_name in class_view.slots:\n                if slot_name in baseslots_for_class:\n                    # This is a pre-existing slot, move along\n                    continue\n\n                # New slot, check for added_in annotation\n                slot_view = sv.induced_slot(slot_name, class_name)\n                added_in = as_dict(slot_view.annotations).get(\"added_in\", None)\n                if added_in is None:\n                    unannotated.append(\n                        f\"Slot {slot_name} in class {class_name} is not annotated\"\n                    )\n                else:\n                    version = added_in.get(\"value\")\n                    if version != CURRENT_VERSION:\n                        annotated_with_wrong_version.append(\n                            f\"Slot {slot_name} in class {class_name} is annotated with a wrong version ({version})\"\n                        )\n\n        self.assertListEqual([], unannotated)\n        self.assertListEqual([], annotated_with_wrong_version)\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "utils/get-value.sh",
    "content": "#!/usr/bin/bash\n# get the value of a key in the about.yaml file\n# https://stackoverflow.com/questions/1221833/pipe-output-and-capture-exit-status-in-bash\ngrep $1 about.yaml | sed \"s/$1:[[:space:]]//\" ; test ${PIPESTATUS[0]} -eq 0\n"
  }
]