Let’s say a user wants to annotate a particular RDF data model with a statement. Let’s call that model “M”. Here’s the user’s annotation statement:
(Subject: Model M) -> (Predicate: was created by) -> (Object: user “OntologyStud“)
How then do we connect this statement to a series of other statements containing metadata about the annotation? It’s not enough to know just this single statement, we need to created linked statements saying which user asserted this, when, and so on.
Looking back at yesterday’s post on RDF data modeling, we would want to create some higher-level “grouper” node. The problem is that the grouper node can’t link to the subject, predicate, or object of this statement, because those resources may have any number of other statements associated with them. Certainly this annotation is not the only statement about “Model M”, so if we were to create a link from a grouper node to “Model M”, we wouldn’t be able to tell which of the statements about “Model M” was the annotation statement.
The solution is to reify. What is reification?
Reification, also called hypostatisation, is treating an abstract concept as if it were a real, concrete thing.
To reify a statement means to take an RDF statement (subject, predicate, object) and treat it as if it were a new resource. That way, instead of having resources point to things like usernames, particular property names, tags, and so on a resource can talk about a statement.
This is moving up one meta-level, and allows RDF statements to talk about themselves. It’s extremely useful when you want to add additional information to a statement. For example, you might want to add data about a statement:
- Who asserted this?
- How trustworthy is it?
- When was this said?
- What was the context surrounding this statement?
In our example, that’s just what we’re trying to do – take an annotation statement and add information about who said it, and when.
- Take the annotation statement “Model M -> was created by -> OntologyStud”.
- Reifiy that statement as a resource, let’s call that resource “Annotation 1”.
- Create a grouper node called “Annotation Instance 1”
- Create a new statement linking the annotation instance to the Annotation: “Annotation Instance 1” -> hasAnnotation -> “Annotation 1”
- Add any additional statements necessary by linking from “Annotation Instance 1”.