diff --git a/CITATION.cff b/CITATION.cff index 95e47d1..dfec3aa 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -2,7 +2,7 @@ cff-version: 1.2.0 message: "If you use VCF-RDFizer in your research, please cite it using the metadata below." title: "VCF-RDFizer" type: software -version: "3.1.0" +version: "3.2.0" authors: - name: "VCF-RDFizer maintainers" repository-code: "https://github.com/ecrum19/VCF-RDFizer" diff --git a/README.md b/README.md index 0151555..c6e03df 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ VCF-RDFizer is a Docker-first CLI wrapper for: 2. Optional RDF compression/decompression, into queryable HDT and COTTAS artifacts 3. Semantic validation of a compressed RDF graph against its source VCF 4. Data linking, which writes a provenance-tracked side-graph of external links +5. Policy attachment, which applies ODRL policies to files, regions and variants and writes checked release views The conversion targets the **VCF Core vocabulary**, published at [https://w3id.org/vcf-core/vocab#](https://w3id.org/vcf-core/vocab#) (prefix @@ -924,6 +925,26 @@ Links go into `sample.links.nt`; the base graph is unchanged. The See [Data linking](docs/datalinking.md) for all three worked examples, reference and network safeguards, provenance, and the remaining design limitations. +### Policy attachment plug-in + +`vcf-rdfizer-policy` attaches ODRL policies to a converted graph and writes one +release view per request, without Docker. A policy can target a file, a region +or a variant, and withholding a record withholds everything it owns (its call, +alleles and genotypes). Selectors are SPARQL declared in Turtle, so adding one +needs no code. `check` confirms that a view withholds exactly what the policy +says, optionally against the source VCF text: + +```bash +vcf-rdfizer-policy evaluate --rdf converted/P00*.nt.gz --policy policy.ttl \ + --assignee https://example.org/party/alz-consortium --purpose DUO:0000007 -o views/alz +vcf-rdfizer-policy check --view views/alz --rdf converted/P00*.nt.gz \ + --policy policy.ttl --vcf P00*.vcf +``` + +This is governed release, not anonymization: a released genotype still +identifies the person it came from. See [Policy attachment](docs/policy-demonstrator.md) +and the runnable cohort in [`examples/policy/`](examples/policy/README.md). + ### Custom RML Mappings `--rules` accepts any RML mapping, so you can change what RDF the pipeline @@ -1007,6 +1028,8 @@ launches Docker, and reads back the JSON/CSV reports each stage writes. | `vcf_rdfizer_rules.py` | `vcf-rdfizer-rules` CLI: scaffold, document, and validate custom RML mappings. | | `vcf_rdfizer_link.py`, `vcf_rdfizer_linking/` | Linker authoring CLI and shared token/interval/API runner. | | `vcf_rdfizer_data/linkers/` | Packaged examples of all three plug-in tiers. | +| `vcf_rdfizer_policy.py`, `vcf_rdfizer_policies/` | `vcf-rdfizer-policy` CLI and its select → partition → decide engine. | +| `vcf_rdfizer_data/policy/` | The VCF Core profile, a DUO subset and the `vcfp:` vocabulary. | | `vcf_rdfizer_gzip.py` | Uncompressed size of a gzip/BGZF VCF without decompressing it. Used by the host preflight estimate and, inside the image, by `run_conversion.sh`. | | `src/vcf_as_tsv.sh` | VCF -> per-input `records`/`header_lines`/`file_metadata` TSV, in one `awk` pass. | | `src/run_conversion.sh` | Runs RMLStreamer, normalizes Spark part files, merges them into one `.nt`/`.nt.gz` aggregate, records conversion metrics. | @@ -1044,6 +1067,7 @@ how each part of the tool works, why, and where it stops working. | [Roadmap](docs/roadmap.md) | Planned work, known defects, and rejected options | | [Data linking](docs/datalinking.md) | Runnable examples of all three plug-in tiers, authoring, safeguards, and provenance | | [Data linking design](docs/datalinking-design.md) | Broader proposal and remaining work | +| [Policy attachment](docs/policy-demonstrator.md) | Implemented v0.1.0: ODRL policies on files, regions and variants, release views, and checks | | [Privacy policy design](docs/privacy-policy-design.md) | Proposal: ODRL-based granular disclosure control over the graph | - [`ACKNOWLEDGEMENTS.md`](ACKNOWLEDGEMENTS.md) - funding and attribution @@ -1098,7 +1122,7 @@ Safe termination: If you use VCF-RDFizer in a publication, please cite: -VCF-RDFizer maintainers. (2026). *VCF-RDFizer* (Version 3.1.0) [Computer software]. GitHub. https://github.com/ecrum19/VCF-RDFizer +VCF-RDFizer maintainers. (2026). *VCF-RDFizer* (Version 3.2.0) [Computer software]. GitHub. https://github.com/ecrum19/VCF-RDFizer BibTeX: @@ -1107,7 +1131,7 @@ BibTeX: author = {{VCF-RDFizer maintainers}}, title = {VCF-RDFizer}, year = {2026}, - version = {3.1.0}, + version = {3.2.0}, url = {https://github.com/ecrum19/VCF-RDFizer}, note = {Computer software} } diff --git a/conda-recipe/README.md b/conda-recipe/README.md index 60f5198..1c9127b 100644 --- a/conda-recipe/README.md +++ b/conda-recipe/README.md @@ -7,11 +7,11 @@ do not submit this package to `staged-recipes`. ## Before submitting to conda-forge -1. Commit the version bump, then create and push a Git tag (for example `v3.1.0`). +1. Commit the version bump, then create and push a Git tag (for example `v3.2.0`). 2. Download the source tarball and compute sha256: ```bash curl -L -o vcf-rdfizer.tar.gz \ - https://github.com/ecrum19/VCF-RDFizer/archive/refs/tags/v3.1.0.tar.gz + https://github.com/ecrum19/VCF-RDFizer/archive/refs/tags/v3.2.0.tar.gz shasum -a 256 vcf-rdfizer.tar.gz ``` 3. Replace `version` and `sha256` in the feedstock's `recipe/meta.yaml`. diff --git a/conda-recipe/meta.yaml b/conda-recipe/meta.yaml index ea05eff..d9e4e21 100644 --- a/conda-recipe/meta.yaml +++ b/conda-recipe/meta.yaml @@ -1,5 +1,5 @@ {% set name = "vcf-rdfizer" %} -{% set version = "3.1.0" %} +{% set version = "3.2.0" %} package: name: {{ name|lower }} @@ -7,7 +7,7 @@ package: source: url: https://github.com/ecrum19/VCF-RDFizer/archive/refs/tags/v{{ version }}.tar.gz - sha256: 0fa8dfd1e4d35c39594a5183a7c36569cee5857974f69b6db746dd705fae03ca + sha256: REPLACE_WITH_GITHUB_TARBALL_SHA256 build: noarch: python diff --git a/pyproject.toml b/pyproject.toml index fffcc40..549b082 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "vcf-rdfizer" -version = "3.1.0" +version = "3.2.0" description = "Docker-first VCF to RDF conversion targeting the VCF Core vocabulary, with compressed queryable representations (HDT, COTTAS), semantic validation, and data linking" readme = "README.md" requires-python = ">=3.10" diff --git a/vcf_rdfizer_data/VOCABULARY_PROVENANCE.json b/vcf_rdfizer_data/VOCABULARY_PROVENANCE.json index 80f71c0..210fffd 100644 --- a/vcf_rdfizer_data/VOCABULARY_PROVENANCE.json +++ b/vcf_rdfizer_data/VOCABULARY_PROVENANCE.json @@ -1,9 +1,9 @@ { "source_repository": "https://github.com/ecrum19/vcf-rdfizer-vocabulary", - "source_commit": "5bfd19d3c8fc377cd7eda689f3f8cad0d8d9bf8b", + "source_commit": "8a5f23ae552f519f1a14a9370e6d9d3f14934027", "note": "Vendored so SHACL validation works from an installed package, with no vocabulary checkout. test_shacl_default_unit.py re-checks these digests against a sibling checkout when one is present.", "files": { - "ontology/vcf-core-vocabulary.bundle.ttl": "20fd2d8820eb3c8d2796175a6e89212bc5ce04f607ab092addc631e4eff2489c", + "ontology/vcf-core-vocabulary.bundle.ttl": "b645b363a395dcd7e4bec990aab655814b589f21af6db4dff171299aaf2aa16e", "shacl/vcf-4.1.shacl.ttl": "5eafc441f2bae5c3b19d80dfc34eff0c2c6cefd61b569eadd38900f4343721f9", "shacl/vcf-4.2.shacl.ttl": "186131c85a483eaec457b545a9e1d310b6eccc2c9fadc95aaa37b34946d7e226", "shacl/vcf-4.3.shacl.ttl": "026105bb56660348239e3ada633e5d00a82f74df28b98798e0db2d1906b63470", diff --git a/vcf_rdfizer_data/ontology/vcf-core-vocabulary.bundle.ttl b/vcf_rdfizer_data/ontology/vcf-core-vocabulary.bundle.ttl index af6fa11..f956e8e 100644 --- a/vcf_rdfizer_data/ontology/vcf-core-vocabulary.bundle.ttl +++ b/vcf_rdfizer_data/ontology/vcf-core-vocabulary.bundle.ttl @@ -33,8 +33,8 @@ vcfc: a owl:Ontology ; dct:description "Vocabulary for representing the logical VCF 4.5 model in RDF: files, headers, records, alleles, values, genotype data, and VCF-specific structural-variant syntax. It supports both expanded per-sample and condensed, sample-ordered representations, and delegates broader variation semantics through FALDO, VRS, SO, GENO, and ChEBI alignments. BCF 2.2 byte layout is out of scope."@en ; dct:license ; dct:creator "Elias Crum" ; - owl:versionIRI ; - owl:versionInfo "2.1.2" ; + owl:versionIRI ; + owl:versionInfo "2.1.3" ; dct:modified "2026-09-08"^^xsd:date ; owl:priorVersion ; dct:replaces ; @@ -846,7 +846,7 @@ vcfc:VCF45File a owl:Class ; rdfs:subClassOf vcfc:VCFFile ; rdfs:label "VCF 4.5 rdfs:label "VCF Core allele and value-indexing module"@en ; dct:description "VCF-specific allele carriers and indexed values for Number=A/R/G/LA/LR/LG/P/M fields."@en ; owl:imports ; - owl:versionInfo "2.1.2" . + owl:versionInfo "2.1.3" . vcfc:Allele a owl:Class ; rdfs:label "VCF allele"@en ; @@ -1011,7 +1011,7 @@ vcfc:paddingAnchorPosition a owl:DatatypeProperty ; rdfs:label "VCF Core genotype module"@en ; dct:description "Parsed GT, phasing, phase-set, local-allele, and sample-filter carriers for VCF 4.5."@en ; owl:imports , ; - owl:versionInfo "2.1.2" . + owl:versionInfo "2.1.3" . vcfc:Genotype a owl:Class ; rdfs:label "VCF genotype"@en ; @@ -1115,7 +1115,7 @@ vcfc:allelePhaseSet a owl:ObjectProperty ; rdfs:label "allele phase set"@en ; owl:imports , , ; - owl:versionInfo "2.1.2" . + owl:versionInfo "2.1.3" . vcfc:SymbolicAlleleType a owl:Class ; rdfs:label "symbolic allele type"@en ; @@ -1295,7 +1295,7 @@ vcfc:blockAllele a owl:ObjectProperty ; rdfs:label "block allele"@en ; rdfs:doma rdfs:label "VCF Core reserved-key registry for VCF 4.5"@en ; dct:source ; owl:imports ; - owl:versionInfo "2.1.2" ; + owl:versionInfo "2.1.3" ; vcfc:specificationVersion "VCFv4.5" . vcfc:specificationVersion a owl:AnnotationProperty ;