Linked Open Knowledge Format (LOKF) — a semantic profile of Google's Open Knowledge Format, defined once in LinkML
Project description
Linked Open Knowledge Format (LOKF) — v0.1
A semantic profile of Google's Open Knowledge Format (OKF). LOKF keeps OKF's markdown-plus-frontmatter authoring model but binds every concept, field, and relationship to schema.org, W3C DCAT, and W3C PROV-O, so a bundle of markdown files is also valid JSON-LD that expands losslessly to RDF. The format is defined once in LinkML; the JSON-LD context, JSON Schema, SHACL shapes, and OWL ontology are all generated from that single source.
One sentence: write OKF markdown, get a queryable knowledge graph for free.
Documentation: https://www.nolan-nichols.com/lokf/
Why
OKF v0.1 is deliberately minimal — the only required field is type, links are
untyped, and there's no shared vocabulary. LOKF adds exactly three things while
keeping OKF's ergonomics:
- Shared meaning — types and fields map to public ontology terms.
- Typed relationships —
dependsOn,derivedFrom,isPartOf, … each pinned to an RDF predicate, instead of one untyped markdown link. - A real graph — the same bundle is queryable with SPARQL, validatable with SHACL, and reason-able with OWL.
It stays bidirectionally compatible: every LOKF bundle is a valid OKF bundle, and every OKF bundle is valid LOKF with default mappings.
Files
| Path | What it is | Hand-edited? |
|---|---|---|
lokf.yaml |
The LinkML schema — the single source of truth. | ✅ edit this |
SPEC.md |
The human-readable specification. | ✅ |
lokf.context.jsonld |
Generated JSON-LD @context (+ type→@type, id→@id aliases). Attach to concepts to get Linked Data. |
⚙️ generated |
lokf.schema.json |
Generated JSON Schema — validates frontmatter / bundles. | ⚙️ generated |
lokf.shacl.ttl |
Generated SHACL shapes — validates the RDF graph. | ⚙️ generated |
lokf.owl.ttl |
Generated OWL ontology — reasoning & alignment. | ⚙️ generated |
examples/acme-knowledge/ |
A conformant 6-concept reference bundle. | ✅ |
examples/*.nt |
RDF triples produced from the example frontmatter. | ⚙️ generated |
Anatomy of a LOKF concept
metrics/weekly-active-users.md — ordinary OKF markdown; every key has a defined
RDF meaning:
---
type: Metric # -> rdf:type lokf:Metric
id: https://acme.example/knowledge/metrics/weekly-active-users # -> @id (subject)
title: Weekly Active Users # -> schema:name
unit: users # -> schema:unitText
timestamp: 2026-06-30T12:00:00Z # -> schema:dateModified
derivedFrom: [ .../tables/user-events ] # -> prov:wasDerivedFrom
dependsOn: [ .../glossary/active-user ] # -> dcterms:requires
measures: [ .../glossary/active-user ] # -> lokf:measures
---
# Definition
Distinct users with a qualifying event in a trailing 7-day window.
Attach lokf.context.jsonld and this expands to RDF triples using
schema:, prov:, dcterms:, and lokf: predicates — no separate file.
Regenerate the artifacts
Everything downstream of lokf.yaml is generated. One command reproduces every
artifact, re-assembles the reference bundle, re-validates it, and re-emits the RDF:
uv sync
just build # == uv run lokf-build
Or run the individual generators by hand:
# JSON-LD context (aliased type->@type, id->@id for authoring)
uv run gen-jsonld-context lokf.yaml > lokf.context.base.jsonld
uv run gen-json-schema lokf.yaml > lokf.schema.json
uv run gen-shacl lokf.yaml > lokf.shacl.ttl
uv run gen-owl lokf.yaml > lokf.owl.ttl
The published lokf.context.jsonld is the generated context with two standard
JSON-LD keyword aliases applied so unmodified OKF frontmatter is valid Linked Data:
import json
c = json.load(open("lokf.context.base.jsonld"))
c["@context"]["type"] = "@type" # OKF's required field designates the RDF class
c["@context"]["id"] = "@id" # the concept IRI is the RDF subject
json.dump(c, open("lokf.context.jsonld", "w"), indent=2)
Validate a bundle
# `just build` assembles examples/acme-knowledge.bundle.json from the markdown, then:
uv run linkml-validate -s lokf.yaml -C KnowledgeBundle examples/acme-knowledge.bundle.json
# -> No issues found
# Or validate a single concept against its class
uv run linkml-validate -s lokf.yaml -C Metric metric.json
Markdown → RDF in one command
The lokf CLI projects a concept — or a whole bundle directory — straight to
RDF. No context wiring, no glue code:
# a single concept -> Turtle on stdout
uv run lokf convert examples/acme-knowledge/metrics/weekly-active-users.md --format ttl
# the same thing behind the just recipe
just gen-rdf-turtle examples/acme-knowledge/metrics/weekly-active-users.md
--format also takes nt, jsonld, xml, n3, and trig; --output FILE
writes to disk instead of stdout. Point convert at the bundle directory
(examples/acme-knowledge) to project all six concepts at once.
Prefer to stay in Python? lokf.rdf.serialize is the same projection the CLI
calls:
from lokf import rdf
# a concept file, or the bundle directory — either resolves IRIs correctly
print(rdf.serialize("examples/acme-knowledge/metrics/weekly-active-users.md", "ttl"))
This is the whole thesis: OKF authoring in, RDF knowledge graph out.
Status
LOKF v0.1 is a draft profile and is not affiliated with or endorsed by
Google. "Open Knowledge Format" / "OKF" refer to the format published by Google
Cloud (github.com/GoogleCloudPlatform/knowledge-catalog); LOKF extends it under
its open terms.
License
CC-BY-4.0 — see LICENSE.
It's a spec + vocabulary; if you'd rather put the scripts under a code license,
swap in MIT or Apache-2.0.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file lokf-0.1.0.tar.gz.
File metadata
- Download URL: lokf-0.1.0.tar.gz
- Upload date:
- Size: 462.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1d1d87bbec42c5a949dba161563ff5fa5d590942d6f29f37708ba915a177c27e
|
|
| MD5 |
b9b5c292bce6f2b3835b0817cec7905f
|
|
| BLAKE2b-256 |
9b7be6795f8351e4c8b93ddc9b1f12e8a80ce881103600f40a1878755195824c
|
Provenance
The following attestation bundles were made for lokf-0.1.0.tar.gz:
Publisher:
publish.yml on nicholsn/lokf
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
lokf-0.1.0.tar.gz -
Subject digest:
1d1d87bbec42c5a949dba161563ff5fa5d590942d6f29f37708ba915a177c27e - Sigstore transparency entry: 2063530439
- Sigstore integration time:
-
Permalink:
nicholsn/lokf@3068c771d28ceaa0dde41070598729ed3dd7fc8f -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/nicholsn
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@3068c771d28ceaa0dde41070598729ed3dd7fc8f -
Trigger Event:
release
-
Statement type:
File details
Details for the file lokf-0.1.0-py3-none-any.whl.
File metadata
- Download URL: lokf-0.1.0-py3-none-any.whl
- Upload date:
- Size: 169.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f7770a3c1f193197ad14da4a27d3b1e4cea7f01388ccc58aa51cdfc4fd544be9
|
|
| MD5 |
47cffe11a5ab90902320b2137580ba0b
|
|
| BLAKE2b-256 |
8eea098fc68bbf63c6baf4b778fb1e0c4fd30574ef8a2822aa5aa6acd6eb84ef
|
Provenance
The following attestation bundles were made for lokf-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on nicholsn/lokf
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
lokf-0.1.0-py3-none-any.whl -
Subject digest:
f7770a3c1f193197ad14da4a27d3b1e4cea7f01388ccc58aa51cdfc4fd544be9 - Sigstore transparency entry: 2063530444
- Sigstore integration time:
-
Permalink:
nicholsn/lokf@3068c771d28ceaa0dde41070598729ed3dd7fc8f -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/nicholsn
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@3068c771d28ceaa0dde41070598729ed3dd7fc8f -
Trigger Event:
release
-
Statement type: