Ontology project RO-Crate profile v1
This document is the persistent human-readable profile description identified by
https://hakjuoh.github.io/protege-mcp/profiles/project-v1/.
The profile defines a small, standards-facing ontology project identity. It does not make
.protege-mcp/project.yaml an exchange standard: RO-Crate is the portable metadata layer, while
project.yaml remains a Protégé MCP execution and quality-control overlay.
The key words MUST, MUST NOT, REQUIRED, SHALL, SHALL NOT, SHOULD, SHOULD NOT, RECOMMENDED, MAY, and OPTIONAL are interpreted as described by RFC 2119 and RFC 8174.
Supported RO-Crate versions
An attached crate MUST declare exactly one of these policy format identifiers and use the matching Recommendation context, specification identifier, and metadata filename:
| Policy format | JSON-LD context | Descriptor conformsTo |
Metadata filename | Profile entity type |
|---|---|---|---|---|
ro-crate-1.0 |
https://w3id.org/ro/crate/1.0/context |
https://w3id.org/ro/crate/1.0 |
ro-crate-metadata.jsonld |
CreativeWork |
ro-crate-1.1 |
https://w3id.org/ro/crate/1.1/context |
https://w3id.org/ro/crate/1.1 |
ro-crate-metadata.json |
CreativeWork |
ro-crate-1.2 |
https://w3id.org/ro/crate/1.2/context |
https://w3id.org/ro/crate/1.2 |
ro-crate-metadata.json |
includes Profile |
ro-crate-1.3 |
https://w3id.org/ro/crate/1.3/context |
https://w3id.org/ro/crate/1.3 |
ro-crate-metadata.json |
includes Profile |
RO-Crate 1.1 is the broad-compatibility default because it is the newest complete version shared by
the reviewed Java and Python library support matrices. This is a compatibility decision, not a claim
of measured market share. A consumer MAY infer 1.2 or 1.3 from exactly one recognized normative
@context when no version was requested explicitly; ambiguous or absent signals fall back to 1.1.
Versions 1.0 and 1.1 predate the formal
RO-Crate Profile model introduced in 1.2; they use the shared dct:conformsTo relationship and a
CreativeWork contextual entity as a compatibility representation. Consumers MUST NOT silently
rewrite one version as another.
Required graph
The flattened @graph MUST contain:
- the version-specific metadata descriptor, typed
CreativeWork, whoseaboutreferences./and whoseconformsToreferences the selected RO-Crate specification; - a root entity with
@id: ./, typedDataset, with a human-readablenameanddescription, adatePublishedvalue that is one calendar-valid ISO 8601 date string (year, year-month, day, or day-plus-time forms with strict range resolution; week, ordinal, and basic formats are not accepted by this profile), alicense(contextual-entity reference or textual statement), anidentifierequal toproject_id, andconformsToreferencing this profile plus every declared additional profile —description,datePublished, andlicenseare root-entity MUSTs in every supported Recommendation, and the profile enforces them because the descriptor asserts specification conformance; - one contextual entity for every declared profile, with an absolute
@idand aname; its type follows the version table above; mainEntityandhasPartreferences from the root to the root ontology artifact;- a root-artifact entity typed
File, withencodingFormatandaboutreferencing the root ontology IRI; and - an entity whose
@idis the root ontology IRI, typedDataset, whoseconformsToreferences the OWL 2 overview.
Additional crate entities and properties MAY be supplied. In the flattened form this profile
validates, every @graph entry MUST be a JSON object with a non-empty @id that is unique within
the crate and a non-empty @type. The profile’s portable core intentionally does not require
Protégé MCP validation assets, import locks, release output, or credentials to be listed. A more
specific profile MAY add those requirements.
Context and storage rules
The metadata document MUST be stored under the selected version’s metadata filename from the table
above; validation checks the on-disk name, not only the descriptor entity. Every @context entry
MUST be a string: the selected Recommendation context MUST be present, and no other supported
Recommendation context may appear beside it, so an offline consumer can never be ambiguous about
which specification governs the crate. Inline (object-form) context entries are rejected because
they could silently redefine core RO-Crate terms that offline validation cannot re-resolve.
Additional string entries are permitted but are not dereferenced.
RDF dataset identity
The interoperable identity contract is W3C RDFC-1.0 canonicalization followed by SHA-256. Its scope is
root-ontology: ontology and version IRIs, ontology annotations, asserted axioms (including axiom
annotations), and direct owl:imports coordinates are included; imported ontology content is excluded.
The canonical N-Quads byte sequence — the canonical quads in Unicode code point order, each terminated
by a line feed — is hashed and reported as sha256:<lowercase hex>. The implementation is pinned to
the official W3C rdf-canon test vectors, including code point (not UTF-16) ordering of quads whose
first difference is a supplementary character.
This digest identifies the RDF dataset and is intended for cross-application comparison. It is distinct from Protégé MCP fingerprint v2, which remains an OWL/editor revision and optimistic-concurrency token. Consumers MUST NOT substitute either value for the other.
A producer MUST NOT publish a digest for a dataset its RDF rendering cannot serialize losslessly. The host OWL RDF renderer silently drops rootless anonymous-individual structures (unanchored reference cycles, anonymous inverse-property pairs, negative assertions among unanchored anonymous individuals, self-referential anonymous type expressions, sameAs/differentFrom-linked anonymous cycles, anonymous annotation cycles), so this implementation verifies the serialized dataset directly — every property and annotation assertion must appear under its predicate — and the required QC stage fails closed instead of reporting a digest that ignores part of the dataset. Structures the renderer emits faithfully (anchored cycles, self-loops, trees, diamonds) keep fingerprinting.
Known upstream limitation: Titanium 2.0.0 assigns blank-node labels from internal hashes whose inputs are sorted in UTF-16 code unit order. When two quads mentioning the same blank node first differ at a supplementary character, the assigned labels can deviate from a fully conformant RDFC-1.0 implementation even though the emitted quad ordering itself is code point conformant. Within one toolchain the digest remains deterministic.
Validation and security
Validation is offline and bounded: metadata is limited to 4 MiB, 20,000 graph entities, 100 levels of JSON nesting, strict duplicate-key rejection, and the configured canonicalization deadline (120 seconds by default). Validation MUST NOT dereference contexts, profiles, imports, or arbitrary entity IRIs.
The implementation lives in the dependency-clean ro_crate package of the core module. Its public API
has no Protégé, OWLAPI, MCP, or project-policy imports (pinned by a seam test) so it can be extracted to
an independent Git project without changing the profile contract.