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 ;