I have been thinking about Semantic Assertions for several years. It is easy to let things get complex fast.
Currently, I am looking at a very simple data module. With what could have been additional fields being additional rows instead. Hopefully this will work out to make querying faster.
First, every tag instance must have an instance_id, a tag, and a tagged_instance. The tagged_instance itself points to another tag instance that the first instance is modifying/clarifying/defining/grouping or it points to a tag instance with an tagged_instance of zero which is a terminal tag at least within that system. It could however be a link to tags stored in other systems.
So the default mode becomes tagging of tagging instances. The exception, a tagged_instance of 0 covers traditional tagging and tagging of tags. For traditional tagging, the target (typically a url) gets assigned a number first on a row with a tagged_instance of 0 and the target url in the tag field, then that instance is tagged. Tags also are defined with a tag instance that has a tagged_instance of zero, but are combined with plain text in the tag field. Taggers are simply a select set of tags that are tagged with a specially designated tag.
There are a lot pieces that I left out for this round. Hope to write about this again soon.