Today on the Facebook blog I spotted a post entitled FQL which contains the following excerpt
Two and a half months ago, a few of us were hanging out in the Facebook TV room,
laying on the Fatboys and
geeking out about how to move forward with the API for the Facebook Platform. We
had a beta version that was fully functional, but we kept wishing that the
interface were cleaner, more concise, and more consistent. Suddenly it occurred
to me – this problem had been solved over 30 years earlier by database
developers who came up with SQL – the Structured Query Language. What if we
could use the same time-tested interface as the way for developers to access
Facebook's data?
...
This isn't a simple problem – with millions of users and billions of
friend connections, photos, tags, etc., Facebook's data doesn't exactly fit into
your average database. And, even if it did, we still have to carefully apply all
of those complicated privacy rules. Facebook Query Language would have to take those SQL-style
queries from developers, figure out what data they're actually looking for,
figure out if they're allowed to actually see the data, figure out where the
data is stored, and then finally go and get the data to return back to the
developer. I knew building FQL would be hard, but that's why I couldn't wait to
do it.
This is one of those things I used to think was a great idea when I was on the XML team at Microsoft. Instead of exposing your data using APIs, why not expose your data as XML then allow people to perform XQuery operations over the data. In reality, this often isn't really feasible because you don't want people performing arbitrary queries over your data store that may request data too much data (SELECT * FROM blog_posts
) or are expensive computationally.
Looking at the FQL developers guide it states that a typical queries look like
SELECT name, pic FROM user WHERE uid=211031 OR uid=4801660
SELECT name, affiliations FROM user
WHERE uid IN (SELECT uid2 FROM friend WHERE uid1=211031)
AND "Facebook" IN affiliations.name AND uid < 10
SELECT src, caption, 1+2*3/4, caption, 10*(20 + 1) FROM photo
WHERE pid IN (SELECT pid FROM photo_tag WHERE subject=211031) AND
pid IN (SELECT pid FROM photo_tag WHERE subject=204686) AND
caption
and return results as XML. I've assumed that what is supported is a simple subset of SQL, perhaps written with Lex & Yacc or ANTLR but it still seems somewhat problematic to move away from the constrained interface of an API and provide access via a query language. It is definitely a lot cooler and more consistent to work with a query language than an API though. Later on when I have some free time, I'll see if I can deduce the grammer for FQL by trying out queries in the Facebook API test console. It looks like there goes one of my evenings this week.
Nice work.