diff --git a/.editorconfig b/.editorconfig index 1cf0585..80e0172 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,5 +1,21 @@ root = true +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true + +[*.py] +indent_size = 4 + +[Makefile] +indent_style = tab + +root = true + [*] indent_style = space indent_size = 2 diff --git a/.github/workflows/auto-add-to-project.yml b/.github/workflows/auto-add-to-project.yml new file mode 100644 index 0000000..98e49d2 --- /dev/null +++ b/.github/workflows/auto-add-to-project.yml @@ -0,0 +1,18 @@ +name: Auto add issues and PRs to EKGF Data Product Workgroup project + +on: + issues: + types: [opened, reopened] + pull_request: + types: [opened, reopened] + +jobs: + add_to_project: + runs-on: ubuntu-latest + steps: + - name: Add to org project + uses: actions/add-to-project@v1.0.1 + with: + project-url: https://github.com/orgs/EKGF/projects/5 + github-token: ${{ secrets.PROJECTS_WRITE_TOKEN }} + diff --git a/.github/workflows/build-spec.yml b/.github/workflows/build-spec.yml index 0d03b92..111e212 100644 --- a/.github/workflows/build-spec.yml +++ b/.github/workflows/build-spec.yml @@ -19,6 +19,8 @@ concurrency: jobs: build: runs-on: macos-latest + permissions: + contents: read steps: - name: Debug - Show event info run: | @@ -26,10 +28,10 @@ jobs: echo "Ref: ${{ github.ref }}" echo "SHA: ${{ github.sha }}" echo "Actor: ${{ github.actor }}" - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 + - uses: actions/checkout@v6 + - uses: actions/setup-python@v6 with: - python-version: '3.12' + python-version: '3.13' cache: 'pip' # caching pip dependencies - name: Install dependencies and run generator run: | @@ -38,7 +40,7 @@ jobs: echo "Running spec generator..." python spec-generator/main.py - name: Upload artifact - uses: actions/upload-pages-artifact@v3 + uses: actions/upload-pages-artifact@v4 with: # Upload the contents of the dist directory path: 'dist' @@ -67,4 +69,4 @@ jobs: echo "Workflow run ID: ${{ github.run_id }}" - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v4 # or specific "vX.X.X" version tag for this action + uses: actions/deploy-pages@v4 diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..0d26a5c --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,9 @@ +{ + "recommendations": [ + "ms-python.python", + "ms-python.vscode-pylance", + "ms-toolsai.jupyter" + ] +} + + diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..5adb9ef --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python", + "makefile.configureOnOpen": false +} + + diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..e5c591a --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,66 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## What This Project Is + +DPROD (Data Product Ontology) is an OMG standard that extends the W3C DCAT vocabulary to describe data products in data mesh architectures. The repository contains the OWL ontology, SHACL validation shapes, a Python spec generator, and worked examples. + +## Build + +```bash +bash build.sh +``` + +This sets up a `.venv` with Python 3.12+, installs dependencies, and runs the spec generator. Output goes to `dist/`. The build fetches `https://www.w3.org/ns/dcat2.ttl` remotely, so it requires internet access. + +To run just the generator (after initial setup): + +```bash +source .venv/bin/activate +python spec-generator/main.py +``` + +There are no tests or linters configured. + +## Architecture + +### Spec Generation Pipeline + +The spec generator (`spec-generator/main.py`) produces the specification HTML and serialized ontology files: + +1. **Load** — Three RDF sources are parsed into a single graph: `dprod-ontology.ttl` (OWL classes/properties), `dprod-shapes.ttl` (SHACL shapes), and the remote W3C DCAT vocabulary. +2. **Discover** — The graph is scanned for SHACL NodeShapes. Each NodeShape is linked to its OWL target class via `sh:targetClass`. Properties come from `sh:property` on each NodeShape. +3. **Two-pass property loading** — For both NodeShapes and PropertyShapes, OWL properties are loaded first, then SHACL properties override them. Predicates in `IGNORED_NODE_SHAPE_PREDICATES` / `IGNORED_PROPERTY_SHAPE_PREDICATES` (in `globals.py`) are skipped during the SHACL pass to prevent shape metadata from leaking into the spec. +4. **Examples** — Each subdirectory in `examples/` with a `README.md` is loaded; the markdown is converted to HTML. +5. **Render** — Jinja2 renders `respec/template.html` with the discovered classes and examples, producing `dist/index.html`. +6. **Serialize** — The ontology is serialized to Turtle, JSON-LD, and RDF/XML in multiple combinations (ontology-only, shapes-only, combined). A standalone `dprod-context.jsonld` is also generated for use as a remote `@context` in JSON-LD documents. + +### Key relationships + +- `dprod-ontology.ttl` defines OWL classes and properties (the "what"). +- `dprod-shapes.ttl` defines SHACL shapes that constrain those classes (the "how to validate"). Each NodeShape targets an OWL class; each PropertyShape constrains an OWL property via `sh:path`. +- `respec/template.html` is both a W3C ReSpec document and a Jinja2 template. Static sections (preamble, scope, namespaces) are plain HTML. Dynamic sections use `{% for cls in classes %}` loops to render class and property tables. +- Class ordering in the spec is hardcoded in `main.py` (the `reorder_list` call), not derived from the ontology. +- Examples referenced in `@context` use `dprod-context.jsonld` (standalone context), not `dprod.jsonld` (full ontology dump). + +### Namespace + +The canonical namespace is `https://www.omg.org/spec/DPROD/`. The shapes namespace is `https://www.omg.org/spec/DPROD/shapes/`. These are defined in `globals.py`. + +## Branch Model and Git Workflow + +- **`main`** — The officially accepted OMG standard. Deploys to GitHub Pages. +- **`develop`** — Working branch where the EKGF evolves the standard. +- **Issue branches** — Created from `develop`, named after the OMG JIRA issue number (e.g., `DPROD-16`). Commit messages should reference both the JIRA issue and the GitHub issue (e.g., `Resolves: DPROD-16, #29`). +- **Ballot branches** — Named `ballot/N` (e.g., `ballot/3`), created by the ballot administrator to group issue branches for a formal OMG vote. Merged into `develop` with a merge commit (not squash/rebase) to preserve individual issue history. + +See `CONTRIBUTING.md` for the full process. + +## Common Modifications + +- **Add/modify an ontology class or property**: Edit both `ontology/dprod/dprod-ontology.ttl` (OWL definition) and `ontology/dprod/dprod-shapes.ttl` (SHACL shape). Keep descriptions in sync. +- **Change spec rendering or layout**: Edit `respec/template.html`. Static content is plain HTML; dynamic content uses Jinja2 syntax. +- **Change class ordering in the spec**: Edit the `reorder_list` call in `spec-generator/main.py`. +- **Add an example**: Create a subdirectory in `examples/` with a `README.md` (and optionally an `example.jsonld`). Update `examples/README.md`. +- **Add a namespace to the spec**: Add a `` to the namespace table in `respec/template.html` and ensure the prefix is declared in the relevant `.ttl` files. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..bd356ac --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,86 @@ +# Contributing + +This document provides guidelines for contributing to the +[Data Product (DPROD)](https://www.omg.org/spec/DPROD/) specification +using a Git workflow designed for issue-based development and a formal +OMG balloting process. + +## Branches + +- **`main`** — The officially accepted OMG standard. +- **`develop`** — The working branch where the + [Enterprise Knowledge Graph Forum (EKGF)](https://www.ekgf.org), + an OMG community, continues to evolve the standard. +- **Issue branches** — Created from `develop` for each issue, + named after the OMG JIRA issue number (e.g., `DPROD-16`). +- **Ballot branches** — Created by the ballot administrator + to group issue branches for a formal vote (e.g., `ballot/3`). + +## 1. Issue Branches + +- **Create a branch**: For every issue you work on, create a dedicated + branch from `develop`. Name it after the OMG JIRA issue number + (e.g., `DPROD-16`). +- **Isolate changes**: Only commit changes related to the specific issue + on that branch. Keep commits concise and focused. +- **No pull requests for issue branches**: Do not create a pull request + for your issue branch. Issue branches are included in a ballot branch + by the ballot administrator, and only the ballot branch gets a pull + request. + +## 2. Keeping Your Branch Up-to-Date + +- **Rebase from `develop`**: Regularly rebase your issue branch to + incorporate the latest changes. This helps prevent merge conflicts and + keeps your branch current. + + ```bash + git checkout DPROD-16 + git rebase develop + ``` + +- **Avoid merging from other branches**: Do not merge changes from other + issue branches into yours. If absolutely necessary, use squash merging + to maintain a clean history. + +## 3. Ballot Preparation + +- **Notification**: You will be notified when your issue is being + considered for a ballot. +- **Ensure your branch is ready**: Make sure your issue branch is + up-to-date with `develop` (rebase if needed) and that all commits are + clear and well-organized. + +## 4. Ballot Review + +- **Pull request**: The ballot administrator will create a pull request + for the ballot branch (e.g., `ballot/3`), which includes your issue + branch. +- **Review**: Review the ballot pull request as a whole or examine your + individual issue branch to ensure the changes are correct. Provide + feedback or approvals as needed. + +## 5. Post-Ballot + +- **Merge to `develop`**: If the ballot passes, the administrator will + merge the ballot branch into `develop`. +- **Rejected issues**: If your issue is rejected in a ballot: + - Address the feedback provided. + - Rebase your branch from `develop` (after the ballot branch is merged). + - Optionally rename your branch (e.g., add `.1`) to indicate the + revision. + - Your issue will be included in a future ballot. + +## 6. Important Considerations + +- **Commit messages**: Write clear and informative commit messages that + explain *why* the change was made, not just what changed. +- **Issue tracking**: Keep both + [GitHub Issues](https://github.com/EKGF/dprod/issues) and + [OMG JIRA](https://issues.omg.org/browse/DPROD) updated with the + status of your work. Reference the OMG JIRA issue number in your + branch name and commit messages (e.g., `DPROD-16`), and reference the + GitHub issue number where applicable (e.g., `#29`). +- **Communication**: Communicate with the ballot administrator and other + team members throughout the process, especially if you have questions + or encounter issues. diff --git a/LICENSE b/LICENSE index 15ff673..f3d6d80 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,26 @@ -MIT License - -Copyright (c) 2024 Enterprise Knowledge Graph Forum, Object Management Group, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +Creative Commons Attribution 4.0 International (CC BY 4.0) + +Copyright (c) 2024-2026 Enterprise Knowledge Graph Forum, EDM Council, Inc. + +This work is licensed under the Creative Commons Attribution 4.0 +International License. To view a copy of this license, visit: + + https://creativecommons.org/licenses/by/4.0/ + +You are free to: + +- Share — copy and redistribute the material in any medium or format + for any purpose, even commercially. +- Adapt — remix, transform, and build upon the material for any + purpose, even commercially. + +Under the following terms: + +- Attribution — You must give appropriate credit, provide a link to the + license, and indicate if changes were made. You may do so in any + reasonable manner, but not in any way that suggests the licensor + endorses you or your use. + +- No additional restrictions — You may not apply legal terms or + technological measures that legally restrict others from doing + anything the license permits. diff --git a/build.sh b/build.sh index 9e88365..f9c289a 100755 --- a/build.sh +++ b/build.sh @@ -6,7 +6,7 @@ REPO_DIR="$(dirname "$(realpath ${BASH_SOURCE[0]})")" venv_dir="${REPO_DIR}/.venv" system_python_bin="/usr/bin/python3" system_python_version="0.0.0" -system_python_minimum_version="3.12" +system_python_minimum_version="3.13" venv_python_bin="${venv_dir}/bin/python${system_python_minimum_version}" function check_system_python() { diff --git a/concept/README.md b/concept/README.md index 536f2bb..acc1057 100644 --- a/concept/README.md +++ b/concept/README.md @@ -41,7 +41,7 @@ For the time being, the activities of the working group are focused on the publi ![data product descriptor components](./dpds-structure.png) -DPDS is available [here](https://dpds.opendatamesh.org/resources/specifications/1.0.0-DRAFT/). A full example of a data product described using DPDS is available [here](https://dpds.opendatamesh.org/quickstart/). +DPDS is available [here](https://dpds.opendatamesh.org/specifications/dpds/1.0.0/). A full example of a data product described using DPDS is available [here](https://dpds.opendatamesh.org/). ### DPDS General Info @@ -50,7 +50,7 @@ General info can be used to provide a high level descriptiono of the data produc - `fullyQualifiedName` (**string:fqn**): This is the unique universal identifier of the data product. It MUST be a URN of the form `urn:dpds:{mesh-namespace}:dataproducts:{product-name}:{product-major-version}`. It's RECOMMENDED to use as `mesh-namespace` your company's domain name in reverse dot notation (ex. `com.company-xyz`) in order to ensure that the `fullyQualifiedName` is a unique universal idetifier as REQUIRED. - `version` (**string:version**): this is the semantic version number of the data product (not to be confused with the `dataProductDescriptor` version above). - `domain` (**string**): This is the domain to which the data product belongs. -- `owner` ([Owner Object](https://dpds.opendatamesh.org/resources/specifications/last.md#owner-object)): This is a collection of information related to the data product's owner. The only mandatory field is the `id` of the owner, usually his or her corporate mail address. +- `owner` ([Owner Object](https://dpds.opendatamesh.org/specifications/dpds/1.0.0/)): This is a collection of information related to the data product's owner. The only mandatory field is the `id` of the owner, usually his or her corporate mail address. @@ -59,9 +59,9 @@ All ports, regardless of their type, are described using the following fields: - `fullyQualifiedName`: The unique universal identifier of the port. It MUST be a URN of the form `urn:dpds:{mesh-namespace}:dataproducts:{product-name}:{product-major-version}:{port-type}:{port-name}` - `version`: This is the semantic version number of the data product's port. Every time the *major version* of port changes also the *major version* of the product MUST be incremented. -- `promises` ([Promises Object](https://dpds.opendatamesh.org/resources/specifications/last.md#promises-object)): These are the data product's promises declared over the port. Through promises the data product declares the intent of the port. Promises are not a guarantee of the outcome but the data product will behave accordingly to them to realize its intent. The more a data product keeps its promises over time and the more trustworthy it is. Thus, the more trustworthy a data product is the more potential consumers are likely to use it. Trust is based on the verification of how good a data product was in the past in keeping its promises. This verification should be automated by the underlying platform and synthesized in a trust score shared with all potential consumers. Examples of promises are descriptions of services' API, SLO, deprecation policy, etc. -- `expectations` ([Expectations Object](https://dpds.opendatamesh.org/resources/specifications/last.md#expectations-object)): These are the data product's expectations declared over the port. Through expectations the data product declares how it wants the port to be used by its consumers. Expectations are the inverse of promises. They are a way to explicitly state what promises the data product would like consumers to make regarding how they will use the port. Examples of expectations are intended usage, intended audience, etc. -- `contracts` ([Contracts Object](https://dpds.opendatamesh.org/resources/specifications/last.md#contracts-object)): These are the data product's contracts declared over the port. Through contracts the data product declares promises and expectations that must be respected both by itself and its consumers respectively. A contract is an explicit agreement between the data product and its consumers. It is used to group all the promises and expectations that if not respected can generate penalties like monetary sanctions or interruption of service. Examples of contracts are terms of conditions, SLA, billing policy, etc. +- `promises` ([Promises Object](https://dpds.opendatamesh.org/specifications/dpds/1.0.0/)): These are the data product's promises declared over the port. Through promises the data product declares the intent of the port. Promises are not a guarantee of the outcome but the data product will behave accordingly to them to realize its intent. The more a data product keeps its promises over time and the more trustworthy it is. Thus, the more trustworthy a data product is the more potential consumers are likely to use it. Trust is based on the verification of how good a data product was in the past in keeping its promises. This verification should be automated by the underlying platform and synthesized in a trust score shared with all potential consumers. Examples of promises are descriptions of services' API, SLO, deprecation policy, etc. +- `expectations` ([Expectations Object](https://dpds.opendatamesh.org/specifications/dpds/1.0.0/)): These are the data product's expectations declared over the port. Through expectations the data product declares how it wants the port to be used by its consumers. Expectations are the inverse of promises. They are a way to explicitly state what promises the data product would like consumers to make regarding how they will use the port. Examples of expectations are intended usage, intended audience, etc. +- `contracts` ([Contracts Object](https://dpds.opendatamesh.org/specifications/dpds/1.0.0/)): These are the data product's contracts declared over the port. Through contracts the data product declares promises and expectations that must be respected both by itself and its consumers respectively. A contract is an explicit agreement between the data product and its consumers. It is used to group all the promises and expectations that if not respected can generate penalties like monetary sanctions or interruption of service. Examples of contracts are terms of conditions, SLA, billing policy, etc. A data product can have multiple ports of the same type, for example it is possible to have multiple output ports and/or inpunt ports. @@ -70,16 +70,16 @@ The API of a port is part of its promises. The promises configuration block comp - `platform`: This is the target technological platform in which the services associated with the given port operate. Examples: `onprem:milan-1`, `aws:eu-south-1`, `aws:eu-south-1:redshift`. - `servicesType`: This is the type of service associated with the given port. Examples: `soap-services`, `rest-services`, `odata-services`,`streaming-services`, `datastore-services`. -- `api` ([Standard Definition Object](https://dpds.opendatamesh.org/resources/specifications/last.md#standardDefinitionObject)): this is the formal description of services API. A good API standard specification should describe how to define the following elements of the service interface: addressable endpoints, available authentication methods and schema of data object exchanged. +- `api` ([Standard Definition Object](https://dpds.opendatamesh.org/specifications/dpds/1.0.0/)): this is the formal description of services API. A good API standard specification should describe how to define the following elements of the service interface: addressable endpoints, available authentication methods and schema of data object exchanged. - `specification`: This is the name of the specification used to define the service API. It is RECOMMENDED to use [Open API Specification](https://github.com/OAI/OpenAPI-Specification) for restful services, [Async API Specification](https://github.com/asyncapi/spec) for streaming services and *DataStore API Specification* for data store connection-based services. Other specifications MAY be used as required. - `version`: This is the version of the specification used to define the service API. - `definition`: This is the definition of the service API built using the specification reported in the fields above. Define how to describe the API is out of the scope of DPDS. -- `depreceationPolicy` ([Specification Extension Point](https://dpds.opendatamesh.org/resources/specifications/last.md#specificationExtensionPoint)): This is the deprecation policy adopted for the given set of services. A policy description and a pointer to external documentation can be provided. Moreover, other fields with **"x-" prefix** can be added to provide further informations as needed (ex. `x-deprecation-period`). +- `depreceationPolicy` ([Specification Extension Point](https://dpds.opendatamesh.org/specifications/dpds/1.0.0/)): This is the deprecation policy adopted for the given set of services. A policy description and a pointer to external documentation can be provided. Moreover, other fields with **"x-" prefix** can be added to provide further informations as needed (ex. `x-deprecation-period`). - `description`: This is a general description of the deprecation policy. - - `externalDocs` ([External Resource Object](https://dpds.opendatamesh.org/resources/specifications/last.md#externalResourceObject)): This is a pointer to external documentation that describe in more detail the deprecation policy. -- `slo`: ([Specification Extension Point](https://dpds.opendatamesh.org/resources/specifications/last.md#specificationExtensionPoint)): These are the _service_ level objectives (SLO)* supported by the given set of services. An SLO description and a pointer to external documentation can be provided. Moreover, other fields with **"x-" prefix** can be added to provide further information as needed (ex. `x-availability`, `x-responsetime`, etc...). + - `externalDocs` ([External Resource Object](https://dpds.opendatamesh.org/specifications/dpds/1.0.0/)): This is a pointer to external documentation that describe in more detail the deprecation policy. +- `slo`: ([Specification Extension Point](https://dpds.opendatamesh.org/specifications/dpds/1.0.0/)): These are the _service_ level objectives (SLO)* supported by the given set of services. An SLO description and a pointer to external documentation can be provided. Moreover, other fields with **"x-" prefix** can be added to provide further information as needed (ex. `x-availability`, `x-responsetime`, etc...). - `description`: This is a general description of the supported SLO - - `externalDocs` ([External Resource Object](https://dpds.opendatamesh.org/resources/specifications/last.md#externalResourceObject)): This is a pointer to external documentation that describes in more detail the supported SLO. + - `externalDocs` ([External Resource Object](https://dpds.opendatamesh.org/specifications/dpds/1.0.0/)): This is a pointer to external documentation that describes in more detail the supported SLO. NOTE: The schema of exposed data is part of the the API description. The way of defining schema is so dependant by the API Specification Standard used. Popular standards like OpenAPI and AsyncAPI let user free to define the schema selecting the modality that best fit the format used to expose data (ex. avro schema for avro format, json schema for json, ecc ...) diff --git a/examples/README.md b/examples/README.md index 20d6e2c..68c8a87 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,5 +1,18 @@ # Examples -- [Apply DCAT](apply-dcat/README.md) -- [Gleif](gleif/README.md) -- [OpenData file](opendata-file/README.md) +## Implemented + +- [SBA Pool Rates](sba-pool-rates/README.md) - Mortgage-backed securities rates served through three ports: database query, API, and Kafka topic. +- [Equity Trade](equity-trade/README.md) - Equity trades data product providing datasets for London Stock Exchange and Euronext. +- [Data Lineage](data-lineage/README.md) - Tracing lineage between data products via input/output ports and at the dataset level using PROV. +- [Data Rights](data-rights/README.md) - Describing rights and entitlements on data products and datasets using ODRL policies. +- [Data Quality](data-quality/README.md) - Measuring dataset quality using the W3C Data Quality Vocabulary (DQV). +- [Data Schema](data-schema/README.md) - Describing dataset schemas using SHACL node shapes and property shapes. +- [Observability Ports](observability-ports/README.md) - Exposing monitoring and diagnostic data through a dedicated observability port. +- [Core Data Product Extensions](core-data-product-extensions/README.md) - Extending a data product with additional metadata such as FIBO-based agreements. + +## Planned + +- Apply DCAT +- Gleif +- OpenData file diff --git a/examples/core-data-product-extensions/README.md b/examples/core-data-product-extensions/README.md index 614626b..ba7dd1b 100644 --- a/examples/core-data-product-extensions/README.md +++ b/examples/core-data-product-extensions/README.md @@ -1,97 +1,97 @@ -For real world data products, the core data product details will be part of a -wider set of metadata that allows the data and data product to be used effectively. - -Below is an example of extending the DPROD data product, -specifically by adding an agreement to a data product. - -In this example, a Data Product Agreement is defined as a subclass of FIBO Agreement. - -*Definition of a simple Agreement based on FIBO:* - -```json -[ - { - "@context": [ - "https://ekgf.github.io/dprod/dprod.jsonld", - { - "fibo": "http://spec.edmcouncil.org/fibo/ontology/FND/Agreements/MetadataFNDAgreements/#", - "ex": "http://example.org/dp#" - } - ], - "@id": "ex:isSubjectToAgreement", - "@type": "rdf:Property", - "rdfs:label": "Data Product is Subject To FIBO Agreement", - "rdfs:domain": { - "@id": "DataProduct" - }, - "rdfs:range": { - "@id": "DataProductAgreement" - } - }, - { - "@id": "ex:DataProductAgreement", - "@type": "rdfs:class", - "rdfs:label": "DataProductAgreement", - "rdfs:subClassOf": { - "@id": "fibo:Agreement" - } - } -] -``` - -A full definition of agreements for data products is likely to be more complex -than a single class and may use other information models or their profiles -(such as ODRL Policy) or create dedicated definitions. - -Below is an example of a Data Product with an associated Data Product Agreement with an effective date. - -*Using the agreement:* - -```json -{ - "@context": [ - "https://ekgf.github.io/dprod/dprod.jsonld", - { - "fibo": "http://spec.edmcouncil.org/fibo/ontology/FND/Agreements/MetadataFNDAgreements/#", - "ex": "http://example.org/dp#" - } - ], - "dataProducts": [ - { - "id": "https://y.com/data-product/company-sales", - "type": "DataProduct", - "outputPort": { - "id": "https://y.com/data-product/company-sales/port/2025-sales", - "type": "DataService", - "label": "Sales", - "endpointURL": "https://y.com/data-product/company-sales/port/2025-sales", - "isAccessServiceOf": { - "type": "Distribution", - "format": "https://www.iana.org/assignments/media-types/application/json", - "isDistributionOf": { - "type": "Dataset", - "label": "Sales", - "id": "https://y.com/data-product/company-sales/dataset/2025-sales", - "conformsTo": "https://y.com/schema/Sale" - } - } - }, - "ex:iSubjectToAgreement": { - "@id": "ex:VVSimpleAgreement", - "@type": "ex:DataProductagreement" - } - } - ], - "agreements": [ - { - "@id": "ex:VVSimpleAgreement", - "@type": "ex:DataProductAgreement", - "rdfs:label": "Very Simple Data Product Agreement", - "fibo:hasEffectiveDate": { - "@type": "xsd:date", - "@value": "2024-08-31" - } - } - ] -} -``` +For real world data products, the core data product details will be part of a +wider set of metadata that allows the data and data product to be used effectively. + +Below is an example of extending the DPROD data product, +specifically by adding an agreement to a data product. + +In this example, a Data Product Agreement is defined as a subclass of FIBO Agreement. + +*Definition of a simple Agreement based on FIBO:* + +```json +[ + { + "@context": [ + "https://www.omg.org/spec/DPROD/dprod-context.jsonld", + { + "fibo": "http://spec.edmcouncil.org/fibo/ontology/FND/Agreements/MetadataFNDAgreements/#", + "ex": "http://example.org/dp#" + } + ], + "@id": "ex:isSubjectToAgreement", + "@type": "rdf:Property", + "rdfs:label": "Data Product is Subject To FIBO Agreement", + "rdfs:domain": { + "@id": "DataProduct" + }, + "rdfs:range": { + "@id": "DataProductAgreement" + } + }, + { + "@id": "ex:DataProductAgreement", + "@type": "rdfs:class", + "rdfs:label": "DataProductAgreement", + "rdfs:subClassOf": { + "@id": "fibo:Agreement" + } + } +] +``` + +A full definition of agreements for data products is likely to be more complex +than a single class and may use other information models or their profiles +(such as ODRL Policy) or create dedicated definitions. + +Below is an example of a Data Product with an associated Data Product Agreement with an effective date. + +*Using the agreement:* + +```json +{ + "@context": [ + "https://www.omg.org/spec/DPROD/dprod-context.jsonld", + { + "fibo": "http://spec.edmcouncil.org/fibo/ontology/FND/Agreements/MetadataFNDAgreements/#", + "ex": "http://example.org/dp#" + } + ], + "dataProducts": [ + { + "id": "https://y.com/data-product/company-sales", + "type": "DataProduct", + "outputPort": { + "id": "https://y.com/data-product/company-sales/port/2025-sales", + "type": "DataService", + "label": "Sales", + "endpointURL": "https://y.com/data-product/company-sales/port/2025-sales", + "isAccessServiceOf": { + "type": "Distribution", + "format": "https://www.iana.org/assignments/media-types/application/json", + "isDistributionOf": { + "type": "Dataset", + "label": "Sales", + "id": "https://y.com/data-product/company-sales/dataset/2025-sales", + "conformsTo": "https://y.com/schema/Sale" + } + } + }, + "ex:iSubjectToAgreement": { + "@id": "ex:VVSimpleAgreement", + "@type": "ex:DataProductAgreement" + } + } + ], + "agreements": [ + { + "@id": "ex:VVSimpleAgreement", + "@type": "ex:DataProductAgreement", + "rdfs:label": "Very Simple Data Product Agreement", + "fibo:hasEffectiveDate": { + "@type": "xsd:date", + "@value": "2024-08-31" + } + } + ] +} +``` diff --git a/examples/data-lineage/README.md b/examples/data-lineage/README.md index 1b8326a..4919895 100644 --- a/examples/data-lineage/README.md +++ b/examples/data-lineage/README.md @@ -25,7 +25,7 @@ connect to each other through their input and output ports: ```json { - "@context": "https://ekgf.github.io/dprod/dprod.jsonld", + "@context": "https://www.omg.org/spec/DPROD/dprod-context.jsonld", "dataProducts": [ { "id": "https://y.com/data-product/company-finance", @@ -119,7 +119,7 @@ In Linked Data, this would use a query such as: ```sparql PREFIX : PREFIX rdfs: -PREFIX dprod: +PREFIX dprod: SELECT DISTINCT ?input WHERE diff --git a/examples/data-quality/example.jsonld b/examples/data-quality/example.jsonld index 941a7bc..528448a 100644 --- a/examples/data-quality/example.jsonld +++ b/examples/data-quality/example.jsonld @@ -1,7 +1,7 @@ [ { - "@context": "https://ekgf.github.io/dprod/dprod.jsonld", + "@context": "https://www.omg.org/spec/DPROD/dprod-context.jsonld", "id": "https://y.com/derived-quality-measurementA", "@type": "QualityMeasurement", "value": 1, @@ -17,7 +17,7 @@ , { - "@context": "https://ekgf.github.io/dprod/dprod.jsonld", + "@context": "https://www.omg.org/spec/DPROD/dprod-context.jsonld", "@id": "https://y.com/quality-measurement-B", "@type": "QualityMeasurement", "value": "false", @@ -32,7 +32,7 @@ } , { - "@context": "https://ekgf.github.io/dprod/dprod.jsonld", + "@context": "https://www.omg.org/spec/DPROD/dprod-context.jsonld", "id": "https://y.com/products/uk-bonds", "type": "DataProduct", "outputPort": { diff --git a/examples/data-rights/README.md b/examples/data-rights/README.md index 638c1d2..23ab16f 100644 --- a/examples/data-rights/README.md +++ b/examples/data-rights/README.md @@ -12,18 +12,21 @@ examplePolicyA odrl:target exampleProduct:ProductA . examplePolicyB odrl:target exampleDataset:DatasetA1 . ``` -An example of a policy follows, that describes permission to distribute the data only within a specific geographic region: +An example of an agreement follows, that describes permission to use all the datasets of the product if the user is working inside EMEA or APAC: ```json examplePolicyA odrl:permission { - "action": "odrl:distribute", - "constraint": [ - {"leftOperand": "spatial", - "operator": "eq", - "rightOperator": "region:EMEA" - } - ] + "action": "odrl:use", + "assignee": { + "@type": "odrl:PartyCollection", + "refinement": [ + {"leftOperand": "odrl:spatial", + "operator": "odrl:isAnyOf", + "rightOperand": ["reg:EMEA", "reg:APAC"] + } + ] } + } ``` diff --git a/examples/data-rights/example.jsonld b/examples/data-rights/example.jsonld index f1c4e4b..6a03398 100644 --- a/examples/data-rights/example.jsonld +++ b/examples/data-rights/example.jsonld @@ -1,5 +1,5 @@ { - "@type": "Offer", + "@type": "Agreement", "@context": [ { "odrl": "http://www.w3.org/ns/odrl/2/", @@ -7,24 +7,25 @@ } ], "uid": "56456df-dfg-34535345-5545", - "assigner": "https://schema.org/person/AdamSmith", - "target": "https://data.org/data-product/equity-trade-xxx", "permission": [ { - "action": "odrl:read", - "constraint": [ - { - "@type": "odrl:Constraint", - "leftOperand": "odrl:spatial", - "operator": "odrl:isAnyOf", - "rightOperand": [ - "reg:EMEA", - "reg:APAC" - ], - "description": " Permission to read all the datasets of the product if user is working inside EMEA or APAC" - } - ] + "target": "https://data.org/data-product/equity-trade-xxx", + "assigner": "https://schema.org/person/AdamSmith", + "assignee": { + "@type": "PartyCollection", + "source": "https://example.org/DataDepartment", + "refinement": [{ + "leftOperand": "odrl:spatial", + "operator": "odrl:isAnyOf", + "rightOperand": [ + "reg:EMEA", + "reg:APAC" + ], + "description": " Permission to read all the datasets of the product if user is working inside EMEA or APAC" + }] + }, + "action": "odrl:use", } ] } diff --git a/examples/data-schema/example.jsonld b/examples/data-schema/example.jsonld index b1afc1e..9367696 100644 --- a/examples/data-schema/example.jsonld +++ b/examples/data-schema/example.jsonld @@ -1,5 +1,5 @@ { -"@context": "https://ekgf.github.io/dprod/dprod.jsonld", +"@context": "https://www.omg.org/spec/DPROD/dprod-context.jsonld", "id": "https://y.com/products/equity-trade-xxx", "@type": "DataProduct", "title": "Equity Trade XXX", diff --git a/examples/dprod-example.json b/examples/dprod-example.json index 495fdfe..5413ec3 100644 --- a/examples/dprod-example.json +++ b/examples/dprod-example.json @@ -1,110 +1,110 @@ -[ - { - "@context": "https://ekgf.github.io/dprod/dprod.jsonld", - "id": "https://www.ekgf.org/data/data-product/permid-data-product", - "type": "DataProduct", - "title": "PermId Data Product", - "description": "LSEG is making available its Permanent Identifiers, or PermIDs, and the associated entity masters and metadata to the market. PermIDs are open, permanent and universal identifiers where underlying attributes capture the context of the identity they each represent.", - "dataProductOwner": "https://www.linkedin.com/in/olibage/", - "lifecycleStatus": "https://ekgf.github.io/dprod/data/lifecycle-status/Consume", - "outputPort": { - "type": "DataService", - "id": "https://www.ekgf.org/data/dataservice/permid-organization" - "title": "Organization Endpoint", - "endpointURL": "https://api-eit.refinitiv.com/permid/search?q= ", - "endPointDescription": "https://developers.lseg.com/en/api-catalog/open-perm-id/permid-entity-search", - "conformsTo": "https://swagger.io/specification/", - "securitySchemaType": "httpApiKey", - "isAccessServiceOf": { - "type": "Distribution", - "format": "https://www.iana.org/assignments/media-types/application/json", - "isDistributionOf": { - "type": "Dataset", - "title": "PermId Organization", - "id": "https://www.ekgf.org/data/dataset/permid-organization", - "conformsTo": "https://permid.org/ontology/organization/" - } - } - } - }, - { - "@context": "https://ekgf.github.io/dprod/dprod.jsonld", - "id": "https://www.ekgf.org/data/data-product/gleif-data-product", - "type": "DataProduct", - "title": "GLEIF Data Product", - "description": "GLEIF makes available the Global LEI Index. This is the only global online source that provides open, standardized and high quality legal entity reference data. By doing so, GLEIF enables people and businesses to make smarter, less costly and more reliable decisions about who to do business with.", - "dataProductOwner": "https://www.linkedin.com/in/peterivett/", - "lifecycleStatus": "https://ekgf.github.io/dprod/data/lifecycle-status/Consume", - "outputPort": [ - { - "type": "DataService", - "id": "https://www.ekgf.org/data/dataservice/gleif-l1", - "title": "GLEIF L1 Endpoint", - "endpointURL": "https://data.world/gleif/lei-data/workspace/file?filename=L1Data.ttl ", - "endPointDescription": "https://data.world/gleif/lei-data/workspace/project-summary?agentid=gleif&datasetid=lei-data", - "isAccessServiceOf": { - "type": "Distribution", - "format": "https://www.iana.org/assignments/media-types/text/turtle", - "isDistributionOf": { - "type": "Dataset", - "title": "GLEIF L1 Organization", - "id": "https://www.ekgf.org/data/dataset/gleif-l1", - "conformsTo": "https://www.gleif.org/ontology/L1/" - } - } - }, - { - "type": "DataService", - "title": "GLEIF L1 XML Download", - "endpointURL": "https://www.gleif.org/en/lei-data/gleif-golden-copy/download-the-golden-copy#.zip", - "endPointDescription": "https://data.world/gleif/lei-data/workspace/project-summary?agentid=gleif&datasetid=lei-data", - "isAccessServiceOf": { - "type": "Distribution", - "format": "https://www.iana.org/assignments/media-types/application/xml", - "isDistributionOf": { - "type": "Dataset", - "title": "GLEIF Level 1 LEI-CDF Golden Copy File", - "id": "https://www.ekgf.org/data/dataset/gleif-l1-xml-data-product", - "conformsTo": "https://www.gleif.org/en/about-lei/common-data-file-format/current-versions/level-1-data-lei-cdf-3-1-format" - } - } - } - ] - }, - - { - "@context": "https://ekgf.github.io/dprod/dprod.jsonld", - "id": "https://www.ekgf.org/data/data-product/legal-entity-data-product", - "type": "DataProduct", - "title": "Legal Entity Data Product", - "description": "TODO", - "dataProductOwner": "https://www.linkedin.com/in/tonyseale/", - "lifecycleStatus": "https://ekgf.github.io/dprod/data/lifecycle-status/Consume", - "inputPort": [{ - "type": "DataService", - "id": "https://www.ekgf.org/data/dataservice/gleif-l1" - } , - - { - "type": "DataService", - "id": "https://www.ekgf.org/data/dataservice/permid-organization" - } - ], - "outputPort": { - "type": "DataService", - "title": "Legal Entity Endpoint", - "endpointURL": "https://github.com/EKGF/dprod/tree/develop/examples/legal-entity ", - "endPointDescription": "https://github.com/EKGF/dprod/tree/develop/examples/legal-entity/readme.txt", - "isAccessServiceOf": { - "type": "Distribution", - "format": "https://www.iana.org/assignments/media-types/application/json", - "isDistributionOf": { - "type": "Dataset", - "title": "Legal Entity", - "id": "https://www.ekgf.org/data/dataset/legal-entity", - "conformsTo": "https://github.com/EKGF/dprod/tree/develop/examples/legal-entity/ontology.ttl", - } - } - } - } +[ + { + "@context": "https://www.omg.org/spec/DPROD/dprod-context.jsonld", + "id": "https://www.ekgf.org/data/data-product/permid-data-product", + "type": "DataProduct", + "title": "PermId Data Product", + "description": "LSEG is making available its Permanent Identifiers, or PermIDs, and the associated entity masters and metadata to the market. PermIDs are open, permanent and universal identifiers where underlying attributes capture the context of the identity they each represent.", + "dataProductOwner": "https://www.linkedin.com/in/olibage/", + "lifecycleStatus": "https://www.omg.org/spec/DPROD/data/lifecycle-status/Consume", + "outputPort": { + "type": "DataService", + "id": "https://www.ekgf.org/data/dataservice/permid-organization" + "title": "Organization Endpoint", + "endpointURL": "https://api-eit.refinitiv.com/permid/search?q= ", + "endPointDescription": "https://developers.lseg.com/en/api-catalog/open-perm-id/permid-entity-search", + "conformsTo": "https://swagger.io/specification/", + "securitySchemaType": "httpApiKey", + "isAccessServiceOf": { + "type": "Distribution", + "format": "https://www.iana.org/assignments/media-types/application/json", + "isDistributionOf": { + "type": "Dataset", + "title": "PermId Organization", + "id": "https://www.ekgf.org/data/dataset/permid-organization", + "conformsTo": "https://permid.org/ontology/organization/" + } + } + } + }, + { + "@context": "https://www.omg.org/spec/DPROD/dprod-context.jsonld", + "id": "https://www.ekgf.org/data/data-product/gleif-data-product", + "type": "DataProduct", + "title": "GLEIF Data Product", + "description": "GLEIF makes available the Global LEI Index. This is the only global online source that provides open, standardized and high quality legal entity reference data. By doing so, GLEIF enables people and businesses to make smarter, less costly and more reliable decisions about who to do business with.", + "dataProductOwner": "https://www.linkedin.com/in/peterivett/", + "lifecycleStatus": "https://www.omg.org/spec/DPROD/data/lifecycle-status/Consume", + "outputPort": [ + { + "type": "DataService", + "id": "https://www.ekgf.org/data/dataservice/gleif-l1", + "title": "GLEIF L1 Endpoint", + "endpointURL": "https://data.world/gleif/lei-data/workspace/file?filename=L1Data.ttl ", + "endPointDescription": "https://data.world/gleif/lei-data/workspace/project-summary?agentid=gleif&datasetid=lei-data", + "isAccessServiceOf": { + "type": "Distribution", + "format": "https://www.iana.org/assignments/media-types/text/turtle", + "isDistributionOf": { + "type": "Dataset", + "title": "GLEIF L1 Organization", + "id": "https://www.ekgf.org/data/dataset/gleif-l1", + "conformsTo": "https://www.gleif.org/ontology/L1/" + } + } + }, + { + "type": "DataService", + "title": "GLEIF L1 XML Download", + "endpointURL": "https://www.gleif.org/en/lei-data/gleif-golden-copy/download-the-golden-copy#.zip", + "endPointDescription": "https://data.world/gleif/lei-data/workspace/project-summary?agentid=gleif&datasetid=lei-data", + "isAccessServiceOf": { + "type": "Distribution", + "format": "https://www.iana.org/assignments/media-types/application/xml", + "isDistributionOf": { + "type": "Dataset", + "title": "GLEIF Level 1 LEI-CDF Golden Copy File", + "id": "https://www.ekgf.org/data/dataset/gleif-l1-xml-data-product", + "conformsTo": "https://www.gleif.org/en/about-lei/common-data-file-format/current-versions/level-1-data-lei-cdf-3-1-format" + } + } + } + ] + }, + + { + "@context": "https://www.omg.org/spec/DPROD/dprod-context.jsonld", + "id": "https://www.ekgf.org/data/data-product/legal-entity-data-product", + "type": "DataProduct", + "title": "Legal Entity Data Product", + "description": "TODO", + "dataProductOwner": "https://www.linkedin.com/in/tonyseale/", + "lifecycleStatus": "https://www.omg.org/spec/DPROD/data/lifecycle-status/Consume", + "inputPort": [{ + "type": "DataService", + "id": "https://www.ekgf.org/data/dataservice/gleif-l1" + } , + + { + "type": "DataService", + "id": "https://www.ekgf.org/data/dataservice/permid-organization" + } + ], + "outputPort": { + "type": "DataService", + "title": "Legal Entity Endpoint", + "endpointURL": "https://github.com/EKGF/dprod/tree/develop/examples/legal-entity ", + "endPointDescription": "https://github.com/EKGF/dprod/tree/develop/examples/legal-entity/readme.txt", + "isAccessServiceOf": { + "type": "Distribution", + "format": "https://www.iana.org/assignments/media-types/application/json", + "isDistributionOf": { + "type": "Dataset", + "title": "Legal Entity", + "id": "https://www.ekgf.org/data/dataset/legal-entity", + "conformsTo": "https://github.com/EKGF/dprod/tree/develop/examples/legal-entity/ontology.ttl", + } + } + } + } ] \ No newline at end of file diff --git a/examples/equity-trade/example.jsonld b/examples/equity-trade/example.jsonld index a4f628c..a830da7 100644 --- a/examples/equity-trade/example.jsonld +++ b/examples/equity-trade/example.jsonld @@ -1,5 +1,5 @@ { -"@context": "https://ekgf.github.io/dprod/dprod.jsonld", +"@context": "https://www.omg.org/spec/DPROD/dprod-context.jsonld", "id": "equity trade-xxx", "@id": "https://y.com/products/equity-trade-xxx", "@type": "DataProduct", diff --git a/examples/observability-ports/README.md b/examples/observability-ports/README.md index b42b9f8..23aa293 100644 --- a/examples/observability-ports/README.md +++ b/examples/observability-ports/README.md @@ -32,7 +32,7 @@ Here is an example of a data product with an observability port: ```json { - "@context": "https://ekgf.github.io/dprod/dprod.jsonld", + "@context": "https://www.omg.org/spec/DPROD/dprod-context.jsonld", "dataProducts": [ { "id": "https://y.com/data-product/uk-bonds", diff --git a/examples/sba-pool-rates/example.jsonld b/examples/sba-pool-rates/example.jsonld index 9134158..af00a77 100644 --- a/examples/sba-pool-rates/example.jsonld +++ b/examples/sba-pool-rates/example.jsonld @@ -1,4 +1,4 @@ -{ "@context": "https://ekgf.github.io/dprod/dprod.jsonld", +{ "@context": "https://www.omg.org/spec/DPROD/dprod-context.jsonld", "id": "sba-pool-rates", "@id": "https://y.com/products/sba-pool-rates", "@type": "DataProduct", diff --git a/ontology/dprod/.copier-answers.env b/ontology/dprod/.copier-answers.env index ef7e72e..f360025 100644 --- a/ontology/dprod/.copier-answers.env +++ b/ontology/dprod/.copier-answers.env @@ -1,14 +1,14 @@ # Changes here will be overwritten by Copier ONTOLOGY_FILE=dprod -ONTOLOGY_IRI="https://ekgf.github.io/dprod/" +ONTOLOGY_IRI="https://www.omg.org/spec/DPROD/" ONTOLOGY_PREFIX="dprod:" -ONTOLOGY_GRAPH_IRI="https://ekgf.github.io/dprod/" +ONTOLOGY_GRAPH_IRI="https://www.omg.org/spec/DPROD/" SHAPE=True SHAPE_FILE=dprod-sh -SHAPE_BASE_IRI="https://ekgf.github.io/dprod/shapes" +SHAPE_BASE_IRI="https://www.omg.org/spec/DPROD/shapes" SHAPE_BASE_PREFIX="dprod-sh:" -SHAPE_GRAPH_IRI="https://ekgf.github.io/dprod/shapes" +SHAPE_GRAPH_IRI="https://www.omg.org/spec/DPROD/shapes" INSTANCES=False INSTANCES_FILE=instances diff --git a/ontology/dprod/.copier-answers.yml b/ontology/dprod/.copier-answers.yml index 453e66d..0d11154 100644 --- a/ontology/dprod/.copier-answers.yml +++ b/ontology/dprod/.copier-answers.yml @@ -13,13 +13,13 @@ instances_file: instances.ttl instances_file_exists: false instances_graph_iri: http://data.example.org ontology_file: dprod.ttl -ontology_graph_iri: https://ekgf.github.io/dprod/ -ontology_iri: https://ekgf.github.io/dprod/ +ontology_graph_iri: https://www.omg.org/spec/DPROD/ +ontology_iri: https://www.omg.org/spec/DPROD/ ontology_prefix: 'dprod:' project_name: dprod shape: true -shape_base_iri: https://ekgf.github.io/dprod/shapes +shape_base_iri: https://www.omg.org/spec/DPROD/shapes shape_base_prefix: 'dprod-sh:' shape_file: dprod-sh.ttl -shape_graph_iri: https://ekgf.github.io/dprod/shapes +shape_graph_iri: https://www.omg.org/spec/DPROD/shapes diff --git a/ontology/dprod/README.md b/ontology/dprod/README.md index 585cbb2..bc82f30 100644 --- a/ontology/dprod/README.md +++ b/ontology/dprod/README.md @@ -1,6 +1,6 @@ # DPROD - Ontology for Data Product Descriptions -This folder contains the Ontology for Data Product Descriptions according to data mesh principles. It is mainly based on the [Data Product Descriptor Specification](https://dpds.opendatamesh.org/resources/specifications/1.0.0-DRAFT/) +This folder contains the Ontology for Data Product Descriptions according to data mesh principles. It is mainly based on the [Data Product Descriptor Specification](https://dpds.opendatamesh.org/specifications/dpds/1.0.0/) ## File Overview diff --git a/ontology/dprod/artifacts/ontology-documentation.html b/ontology/dprod/artifacts/ontology-documentation.html index 63385b7..bca89fe 100644 --- a/ontology/dprod/artifacts/ontology-documentation.html +++ b/ontology/dprod/artifacts/ontology-documentation.html @@ -185,7 +185,7 @@

Classes

>

Data Product

-

https://ekgf.github.io/dprod/DataProduct

+

https://www.omg.org/spec/DPROD/DataProduct

@@ -255,7 +255,7 @@

Data Product

>

Port

-

https://ekgf.github.io/dprod/Port

+

https://www.omg.org/spec/DPROD/Port

@@ -339,7 +339,7 @@

Object Properties

>

output port

-

https://ekgf.github.io/dprod/outputPort

+

https://www.omg.org/spec/DPROD/outputPort

@@ -407,7 +407,7 @@

output port

>

promise

-

https://ekgf.github.io/dprod/promise

+

https://www.omg.org/spec/DPROD/promise

@@ -472,7 +472,7 @@

promise

>

expectation

-

https://ekgf.github.io/dprod/expectation

+

https://www.omg.org/spec/DPROD/expectation

@@ -537,7 +537,7 @@

expectation

>

contract

-

https://ekgf.github.io/dprod/contract

+

https://www.omg.org/spec/DPROD/contract

@@ -605,7 +605,7 @@

Datatype Properties

>

fully qualified name

-

https://ekgf.github.io/dprod/fullyQualifiedName

+

https://www.omg.org/spec/DPROD/fullyQualifiedName

@@ -673,7 +673,7 @@

fully qualified name

>

domain

-

https://ekgf.github.io/dprod/domain

+

https://www.omg.org/spec/DPROD/domain

diff --git a/ontology/dprod/dprod-ontology.ttl b/ontology/dprod/dprod-ontology.ttl index 1db2f38..af8226a 100644 --- a/ontology/dprod/dprod-ontology.ttl +++ b/ontology/dprod/dprod-ontology.ttl @@ -1,9 +1,9 @@ -# baseURI: https://ekgf.github.io/dprod/ +# baseURI: https://www.omg.org/spec/DPROD/ # imports: http://www.w3.org/ns/dcat# # prefix: dprod -@base . -@prefix dprod: . +@base . +@prefix dprod: . @prefix dcat: . @prefix dct: . @prefix owl: . @@ -54,7 +54,7 @@ dprod:DataProduct dprod:DataProductLifecycleStatus a owl:Class, rdfs:Class ; dct:description - "The development status of the data product taken from a controlled list (e.g. Ideation, Design, Build, Deploy, Consume)."@en ; + "The development status of the data product taken from a controlled list (e.g. Ideation, Design, Build, Deploy, Consume, Retire)."@en ; rdfs:comment "The lifecycle of the data product as defined by EDM Council CDMC"@en ; rdfs:isDefinedBy dprod: ; rdfs:label "data product lifecycle status" ; @@ -221,5 +221,5 @@ dprod:securitySchemaType rdfs:isDefinedBy dprod: ; rdfs:domain dcat:DataService ; # rdfs:range rdf:resource ; # better let user decide whether they want SecuritySchemaType class or own class or skos - rdf:label "security schema type" ; + rdfs:label "security schema type" ; . diff --git a/ontology/dprod/dprod-shapes.ttl b/ontology/dprod/dprod-shapes.ttl index fe50f71..d552f31 100644 --- a/ontology/dprod/dprod-shapes.ttl +++ b/ontology/dprod/dprod-shapes.ttl @@ -1,13 +1,13 @@ -# baseURI: https://ekgf.github.io/dprod/shapes/ +# baseURI: https://www.omg.org/spec/DPROD/shapes/ # imports: http://www.w3.org/ns/dcat# # imports: http://www.w3.org/ns/shacl# -# imports: https://ekgf.github.io/dprod/ +# imports: https://www.omg.org/spec/DPROD/ # prefix: dprod-shapes -@base . -@prefix dprod-shapes: . -@prefix dprod: . +@base . +@prefix dprod-shapes: . +@prefix dprod: . @prefix dcat: . @prefix dct: . @prefix odrl: . @@ -17,7 +17,6 @@ @prefix rdfs: . @prefix sh: . @prefix xsd: . -@prefix sdo: . dprod-shapes: a owl:Ontology ; @@ -40,11 +39,11 @@ dprod-shapes: owl:versionInfo "OMG Request For Comments Errata 2" ; sh:declare [ sh:prefix "dprod" ; - sh:namespace "https://ekgf.github.io/dprod/" ; + sh:namespace "https://www.omg.org/spec/DPROD/" ; ] ; sh:declare [ sh:prefix "dprod-shapes" ; - sh:namespace "https://ekgf.github.io/dprod/shapes/" ; + sh:namespace "https://www.omg.org/spec/DPROD/shapes/" ; ] ; sh:declare [ sh:prefix "dcat" ; @@ -125,7 +124,7 @@ dprod-shapes:InformationSensitivityClassificationShape dprod-shapes:DataProductLifecycleStatusShape a sh:NodeShape; rdfs:label "data product lifecycle status shape" ; - dct:description "The development status of the data product taken from a controlled list (e.g. Ideation, Design, Build, Deploy, Consume)."@en ; + dct:description "The development status of the data product taken from a controlled list (e.g. Ideation, Design, Build, Deploy, Consume, Retire)."@en ; sh:targetClass dprod:DataProductLifecycleStatus; rdfs:isDefinedBy dprod-shapes:; . @@ -362,7 +361,7 @@ dprod-shapes:DataService-protocol a sh:PropertyShape; rdfs:isDefinedBy dprod-shapes:; sh:path dprod:protocol; - sh:class dcat:Protocol; + sh:class dprod:Protocol; dct:description "A protocol (possibly one of many options) used to communicate with this data service."@en ; rdfs:label "data service protocol shape" ; . @@ -371,7 +370,7 @@ dprod-shapes:DataService-securitySchemaType a sh:PropertyShape; rdfs:isDefinedBy dprod-shapes:; sh:path dprod:securitySchemaType; - sh:class dcat:SecuritySchemaType; + sh:class dprod:SecuritySchemaType; dct:description "The security schema type used for authentication and communication with this Data Service."@en ; rdfs:label "data service security schema type shape" ; . diff --git a/requirements.txt b/requirements.txt index e9b9d1a..8779ef7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,7 @@ -jinja2>=3.0.2 -markdown>=3.3.4 -rdflib>=7.0.0 -pip>=21.2.4 -wheel>=0.37.0 -six>=1.15.0 -setuptools>=58.0.4 -future>=0.18.2 +jinja2>=3.1,<4 +markdown>=3.7,<4 +rdflib>=7.1.4,<9 +pyld>=2,<3 +pip>=23 +wheel>=0.42 +setuptools>=70 diff --git a/respec/template.html b/respec/template.html index c7008a6..d973f80 100644 --- a/respec/template.html +++ b/respec/template.html @@ -11,7 +11,7 @@ const respecConfig = { // Working Groups ids at https://respec.org/w3c/groups/ // group: "Semantic Data Products Working Group", - latestVersion: "https://ekgf.github.io/dprod/", + latestVersion: "https://www.omg.org/spec/DPROD/", specStatus: "base", editors: [ { @@ -73,7 +73,7 @@ branch: "main", repoURL: "https://github.com/EKGF/dprod", }, - license: "mit", + license: "cc-by", logos: [{ src: "./assets/dprod.jpg", alt: "DPROD", @@ -131,7 +131,7 @@ }, dprod: { title: "Data Product Ontology", - href: "https://ekgf.github.io/dprod/", + href: "https://www.omg.org/spec/DPROD/", authors: [ "Tony Seale", "Natasa Varytimou", @@ -256,13 +256,12 @@