Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

FQL: Facebook Query Language

L'elasticità di una query SQL e la mole di dati Facebook. Una presentazione su Facebook Query Language
L'elasticità di una query SQL e la mole di dati Facebook. Una presentazione su Facebook Query Language
Link copiato negli appunti

Comunque lo vogliate vedere Facebook è soprattutto un grande contenitore di informazioni. Conosce la nostra data di nascita, il nostro stato sentimentale, religione, lavoro e tante altre cose che abbiamo accettato di comunicargli. È prevedibile, dunque, che una tale mole di informazioni necessiti di un sistema quanto più elastico possibile per essere interrogato agevolmente. Le conoscenze tecniche degli ingegneri di Palo Alto han fatto sì che ciò avvenisse, mettendo a nostra disposizione FQL.

L'acronimo, che ricorda molto da vicino il più famoso SQL, si basa sugli stessi principi di quest'ultimo, più ovvie limitazioni atte a garantire l'integrità dei dati. Abbiamo detto poco fa che FQL ricorda molto da vicino SQL, se non ci credete ecco lo scheletro di una semplice query:

SELECT [campi]
FROM [tabella]
WHERE [condizioni]

La clausola FROM serve a specificare su che tabella effettueremo la query ed in FQL, per motivi di efficienza, è possibile specificare una sola tabella al suo interno. Se volessimo conoscere nome e cognome di un utente partendo dal suo uid dovremmo capire qual è la tabella in cui tali informazioni sono memorizzate e scriverla come parametro del FROM.

Come abbiamo già fatto precedentemente cerchiamo di imparare a sfruttare la documentazione ufficiale. A questo indirizzo è disponibile la lista di tutte le tabelle che è possibile interrogare con FQL, una di queste si chiama user e come è ovvio aspettarsi contiene le informazioni sugli utenti. La tabella user sarà dunque il parametro del nostro FROM.

Cliccando sul link potremo consultare le specifiche della tabella e scoprire così che il nome e il cognome sono memorizzati rispettivamente nei campi first_name e last_name. Essendo nome e cognome le uniche informazioni alla quale siamo intressati, tali campi diventeranno i parametri della clausola SELECT.

La terza parte della query è composta dalla clausola WHERE. Anche in questo caso ci sono delle limitazioni fondamentali rispetto all'SQL classico, infatti, in FQL tale clausola è sempre obbligatoria e per motivi di efficienza la utilizzeremo solo con campi indicizzabili. All'interno delle pagine di documentazione relative alle tabelle FQL sono segnati con un asterisco tutti i campi indicizzabili, nel nostro caso, visualizzando la pagina di documentazione per la tabella user, scopriremo che i campi indicizzabili sono uid, name e username. Siccome la nostra query mira a conoscere nome e cognome di un utente di cui conosciamo la uid la dichiarazione completa sarà questa:

SELECT first_name, last_name
FROM user
WHERE uid=xyz

I risultati delle interrogazioni ci verranno forniti, a seconda del formato che sceglieremo, in JSON oppure in XML. In basso, le risposte nei due formati alla query di esempio. Da notare la compattezza e l'essenzialità del formato JSON rispetto al più verboso XML.

// risposta in JSON
[
   {
      "first_name" : "Mariano",
      "last_name":"Calandra"
   }
]
 // risposta in XML
 <?xml version="1.0" encoding="UTF-8"?>
   <fql_query_response xmlns="http://api.facebook.com/1.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" list="true">
        <user>
           <first_name>Mariano</first_name>
           <last_name>Calandra</last_name>
        </user>
   </fql_query_response>

Oltre alle tre clausole obbligatorie viste prima, possiamo raffinare le nostre query con due clausole anch'esse molto note: ORDER BY e LIMIT. La prima, come intuibile, permette di effettuare ordinamenti, crescenti o decrescenti su una determinata colonna, la seconda, data una query, mostrerà soltanto un determinato sottoinsieme di righe. Un uso accorto della clausola LIMIT ci permetterà di minimizzare lo spreco di traffico ad ogni interrogazione, restituendoci soltanto la quantità di righe a cui siamo interessati.

Gli operatori booleani 'maggiore', 'minore', 'uguale', 'maggiore o uguale' e 'minore o uguale' sono tutti presenti così come gli operatori logici AND, OR, NOT e le quattro operazioni aritmetiche fondamentali. Agli operatori classici, si aggiungono una serie di funzioni di utilità o di manipolazione delle stringhe:

  • now(): Restituisce il timestamp attuale
  • rand(): Genera un numero pseudo-casuale
  • strlen(str): Restituisce la lunghezza di str
  • concat(str1, str2): Concatena str1 e str2
  • substr(str, inizio, lunghezza): Restituisce una porzione di testo di str
  • lower(str) e upper(str): Trasforma str in minuscolo/maiuscolo

Ad esempio, a fini didattici, potrebbe essere interessante farci restituire i 5 status più vecchi che abbiamo scritto su Facebook e farceli ritornare completamente in maiuscolo. Consultiamo la lista di tutte le tabelle FQL e scopriamo che esiste una tabella status, clicchiamo e vediamo se è quello che ci serve. «Query this table to return one or more of a user's statuses [...]»: è proprio quello che cercavamo.

Continuando a leggere scopriremo che il campo message contiene lo status vero e proprio e il campo time contiene data e ora di pubblicazione. Il modo più veloce per realizzare l'esempio, quindi, consisterebbe nell'interrogare la tabella status, ordinare per tempo (time) crescente (in modo che gli status più vecchi vengano mostrati prima), chiedere di mostrarci solo i primi cinque risultati e poi trasformarli in maiuscolo.

SELECT upper(message)
FROM status
WHERE uid = xyz
ORDER BY time ASC
LIMIT 5

Informazioni più strutturate potrebbero necessitare di più sotto-interrogazioni per generare una risposta utile, se volessimo conoscere, ad esempio, il nome degli eventi a cui un dato utente sia stato invitato sarà necessario fare due interrogazioni innestate, una sulla tabella event_member e l'altra sulla tabella event. La query più interna interrogherà la tabella event_member alla ricerca degli eid (event identification, identificativo univoco di ogni evento) associati ad un determinato utente (specificato dal suo uid). La query più esterna interrogherà invece la tabella event e stamperà il nome (name) di tutti gli eventi che hanno un eid corrispondente con uno di quelli trovati nella query più interna.

SELECT name
FROM event
WHERE eid
IN (
       SELECT eid
       FROM event_member
       WHERE uid=xyz
)

Anche in questo caso (come con FBML), Facebook ci mette a disposizione un modo per fare pratica con FQL ancor prima di mettere su un ambiente di sviluppo. Ci basterà andare qui, scegliere come metodo fql.query e decidere poi il formato di risposta (Json/XML), a questo punto non ci resta altro da fare che scrivere la nostra interrogazione nel riquadro "query" e poi cliccare "Applica metodo" per leggerne i risultati.


Ti consigliamo anche