An issue anyone using the FluidDB API (in any form) will run across fairly
quickly is the occasionally vexed issue of what we actually mean by a tag.
Conceptually, it's very straightforward: a tag is exactly like the tags
we all know and love from del.icio.us,
Flickr, GMail etc.,
with the twist that they can have values.
So a tag has a name (like njr/rating, terry/toread etc.),
and optionally has a value (which can be of almost any type) too.
Additionally, tags have some other properties, like a rather full
permissions system (that controls who can see, edit and attach them
to objects) and some metadata, like an optional description.
The potential confusion arises because sets of tags sharing the same
name are (for good reason) often managed together, and in some cases
share metadata in FluidDB.
We can see this if we look at the process of tagging an object in
a little detail.
In the client library,
fdb.py
that I published earlier, you can add a tag to an object very simply
if you know its ID. For example, if I wanted to add an
njr/rating of 10
tag to the object with the id
a984efb2-67d8-4b5c-86d0-267b87832fa4g,
I could just say
import fdb db = fdb.FluidDB (fdb.Credentials (filename='/Users/njr/.fluidDBcredentials')) o = db.tag_object_by_id ('a984efb2-67d8-4b5c-86d0-267b87832fa4', 'rating', 10) assert o = 0
This corresponds very closely to the conceptual model I use and encourage
others to use, and works even if there have never been any
njr/rating tags in the system before.
Under the covers, however, the native HTTP API sees things slightly
differently.
Before I can tag something with a tag such as
njr/rating
I first have to tell the system I want to use tags with this name.
The underlying API refers to this process as
tag creation, though I prefer to think of it
as abstract tag creation,
or tag declaration.
So the way fdb.py actually works, is that
when you ask it to tag an object with a given tag (and perhaps a value),
it goes ahead and tries to do that for you.
But if that tag hasn't previously been declared (i.e., if the abstract
form of it hasn't been created), this will fail. In this case,
the library backs up and creates the abstract
tag and then tries again.
It does this using another fdb call:
db.create_abstract_tag ('rating', description=None, indexed=True):
As you can see, we can also give a description for an (abstract) tag,
which in effect applies to all the real ("concrete") tags we create
when we tag objects, and can also specify whether FluidDB should index
the tag (making it searchable).
So we could say:
db.create_abstract_tag ('rating', description="njr's rating for things, on a scale of 0-10")
Similarly, I will soon impement some untag methods in
fdb.py, but these shouldn't be
confused with the delete_abstract_tag
function that already exists.
The delete_abstract_tagmethod doesn't simply
simply remove tag from an object, but actually
deletes all tags with the given tag name (and the abstract tag itself)
from the system.
The reason FluidDB cares so much about abstract tags
(or, if you prefer, sets of tags sharing the same tag name)
is that this is the level at which the permissions system acts.
In FluidDB, there is fairly fine-grain control, allowing the owner
of an (abstract) tag to decide who is allowed to read, apply, and alter
tags with a given name to objects.
More on that later.
No comments:
Post a Comment