From 71db146148ee42a59340eba2d90d6c866cf3d230 Mon Sep 17 00:00:00 2001 From: Josh Cornejo <10956002+joshcornejo@users.noreply.github.com> Date: Sat, 16 Aug 2025 08:48:32 +0100 Subject: [PATCH 1/4] Update example.jsonld Re done: https://github.com/EKGF/dprod/issues/83#issuecomment-3187667242 Signed-off-by: Josh Cornejo <10956002+joshcornejo@users.noreply.github.com> --- examples/data-rights/example.jsonld | 33 +++++++++++++++-------------- 1 file changed, 17 insertions(+), 16 deletions(-) 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", } ] } From 7ed3b322e48d85fc54657abed637de4c6545f388 Mon Sep 17 00:00:00 2001 From: Jacobus Geluk Date: Wed, 4 Mar 2026 17:36:39 +0000 Subject: [PATCH 2/4] chore: sync joshcornejo-patch-2 with ballot/4 for conflict resolution --- .editorconfig | 16 ++ .github/workflows/auto-add-to-project.yml | 18 ++ .github/workflows/build-spec.yml | 12 +- .vscode/extensions.json | 9 + .vscode/settings.json | 6 + CLAUDE.md | 66 ++++++ CONTRIBUTING.md | 86 +++++++ LICENSE | 47 ++-- build.sh | 2 +- examples/README.md | 19 +- .../core-data-product-extensions/README.md | 194 ++++++++-------- examples/data-lineage/README.md | 4 +- examples/data-quality/example.jsonld | 6 +- examples/data-schema/example.jsonld | 2 +- examples/dprod-example.json | 218 +++++++++--------- examples/equity-trade/example.jsonld | 2 +- examples/observability-ports/README.md | 2 +- examples/sba-pool-rates/example.jsonld | 2 +- ontology/dprod/.copier-answers.env | 8 +- ontology/dprod/.copier-answers.yml | 8 +- .../artifacts/ontology-documentation.html | 32 +-- ontology/dprod/dprod-ontology.ttl | 6 +- ontology/dprod/dprod-shapes.ttl | 14 +- requirements.txt | 15 +- respec/template.html | 31 ++- spec-generator/globals.py | 4 +- spec-generator/main.py | 48 ++-- 27 files changed, 557 insertions(+), 320 deletions(-) create mode 100644 .github/workflows/auto-add-to-project.yml create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 CLAUDE.md create mode 100644 CONTRIBUTING.md 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/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..82e4e7f 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-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/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..051bc2d 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: . diff --git a/ontology/dprod/dprod-shapes.ttl b/ontology/dprod/dprod-shapes.ttl index fe50f71..26727ab 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: . @@ -40,11 +40,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" ; 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..790f542 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 @@