Worked example — pseudonymisation, before and after.
BEFORE (PII-laden, joinable across datasets, risky):
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
:alice_at_example_com a foaf:Person ;
foaf:name "Alice" ;
foaf:mbox <mailto:alice@example.com> ;
:department "Engineering" .
The IRI itself leaks the email. Anyone joining this graph with a public contact list re-identifies Alice.
AFTER (opaque identifier, PII split into a separate graph):
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
# The 'public' graph keeps only the non-identifying facts:
<urn:user:9c3fb1d8> a foaf:Person ;
:department "Engineering" .
# A SEPARATE named graph holds the PII, behind a stricter ACL:
# GRAPH :pii_graph {
# <urn:user:9c3fb1d8> foaf:name "Alice" ;
# foaf:mbox <mailto:alice@example.com> .
# }
Two changes did the work:
- The subject became an opaque
<urn:user:...> IRI — no email, no name, no hint of who it points to.
- The PII triples moved into a different named graph with its own retention and access policy.
For the playground below, the minimal pass is the opaque <urn:user:...> subject; wrapping in GRAPH :pii_graph { ... } is the bonus compartmentalisation step.