Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CITATION.cff
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
28 changes: 26 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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. |
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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:

Expand All @@ -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}
}
Expand Down
4 changes: 2 additions & 2 deletions conda-recipe/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`.
Expand Down
4 changes: 2 additions & 2 deletions conda-recipe/meta.yaml
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
{% set name = "vcf-rdfizer" %}
{% set version = "3.1.0" %}
{% set version = "3.2.0" %}

package:
name: {{ name|lower }}
version: {{ version }}

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
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
4 changes: 2 additions & 2 deletions vcf_rdfizer_data/VOCABULARY_PROVENANCE.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
12 changes: 6 additions & 6 deletions vcf_rdfizer_data/ontology/vcf-core-vocabulary.bundle.ttl
Original file line number Diff line number Diff line change
Expand Up @@ -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 <https://creativecommons.org/licenses/by/4.0/> ;
dct:creator "Elias Crum" ;
owl:versionIRI <https://w3id.org/vcf-core/vocab/2.1.2> ;
owl:versionInfo "2.1.2" ;
owl:versionIRI <https://w3id.org/vcf-core/vocab/2.1.3> ;
owl:versionInfo "2.1.3" ;
dct:modified "2026-09-08"^^xsd:date ;
owl:priorVersion <https://w3id.org/vcf-core/vocab/2.0.0> ;
dct:replaces <https://w3id.org/vcf-rdfizer/vocab> ;
Expand Down Expand Up @@ -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 <https://w3id.org/vcf-core/vocab> ;
owl:versionInfo "2.1.2" .
owl:versionInfo "2.1.3" .

vcfc:Allele a owl:Class ;
rdfs:label "VCF allele"@en ;
Expand Down Expand Up @@ -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 <https://w3id.org/vcf-core/vocab>, <https://w3id.org/vcf-core/alleles> ;
owl:versionInfo "2.1.2" .
owl:versionInfo "2.1.3" .

vcfc:Genotype a owl:Class ;
rdfs:label "VCF genotype"@en ;
Expand Down Expand Up @@ -1115,7 +1115,7 @@ vcfc:allelePhaseSet a owl:ObjectProperty ; rdfs:label "allele phase set"@en ;
owl:imports <https://w3id.org/vcf-core/vocab>,
<https://w3id.org/vcf-core/alleles>,
<https://w3id.org/vcf-core/genotypes> ;
owl:versionInfo "2.1.2" .
owl:versionInfo "2.1.3" .

vcfc:SymbolicAlleleType a owl:Class ;
rdfs:label "symbolic allele type"@en ;
Expand Down Expand Up @@ -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 <https://raw.githubusercontent.com/samtools/hts-specs/master/VCFv4.5.tex> ;
owl:imports <https://w3id.org/vcf-core/vocab> ;
owl:versionInfo "2.1.2" ;
owl:versionInfo "2.1.3" ;
vcfc:specificationVersion "VCFv4.5" .

vcfc:specificationVersion a owl:AnnotationProperty ;
Expand Down
Loading