Datalog è un linguaggio query basato sul Prolog. È un linguaggio basato sulla programmazione logica, che è un paradigma di programmazione basato su delle regole.
Ogni regola è composta da una testa (LHS) e da un corpo (RHS) seguendo la sintassi:
P :- P1, P2, ..., Pn
Dove ogni
Ciascuna
Per eseguire una query (detta goal in datalog) si usa la sintassi:
? :- P1, P2, ..., Pn
Che restituirà un insieme per le variabili trovate. In caso non ci siano variabili un goal restituisce true o false.
Consideriamo in questa pagina la base di dati contenente le tabelle
Padre(X, Y) :- Persona(X, _, 'M'), Genitore(X, Y)
Madre(X, Y) :- Persona(X, _, 'F'), Genitore(X, Y)
Un fatto di questa base di dati può essere:
Genitore("Carlo", "Antonio")
Un esempio di Goal può essere:
? :- Padre("Carlo", X)
Che restituirà
Possiamo vedere una corrispondenza tra Datalog e l'algebra relazionale. Le variabili in testa sono l'equivalente delle proiezioni, i predicati sono l'equivalente delle selezioni e l'insieme di predicati è l'equivalente dei join tra loro.
Per esempio l'espressione corrispondente di
Definiamo il database estensionale (EDB) come l'insieme delle tabelle presenti nel DB, e il database intensionale (IDB) come l'insieme dei predicati che sono a sinistra in una regola, che sono quindi la conoscenza dedotta a partire da EDB. Si impone che:
Nella definizione delle regole si possono usare predicati speciali, come operatori di confronto (
Alcuni letterali del corpo possono essere negati tramite l'espressione not. L'uso della negazione in Datalog aumenta il potere espressivo del linguaggio, tuttavia richiede cautela poiché può portare a risultati infiniti.
Senza la negazione Datalog permette di rappresentare gli operatori
P(X, Y) :- R(X, Y)
P(X, Y) :- S(X, Y)
Per ottenere la differenza serve il not:
P(X, Y) :- R(X, Y), not S(X, Y)
Per evitare risultati infiniti la negazione dev'essere safe, quindi tutte le variabili di un letterale negato devono comparire in un letterale positivo del corpo della regola. Questo esclude regole come:
S(X, Y) :- R(X), not Q(Y)
Inoltre, la negazione dev'essere stratificata, quindi non ci devono essere cicli di dipendenza tra letterali negati. Questo esclude regole come:
P(X) :- R(X), not P(x)
È possibile effettuare query ricorsive, dove il letterale della testa si presenta all'interno del corpo della regola. Per esempio:
Antenato(X, Y) :- Genitore(X, Y)
Antenato(X, Y) :- Antenato(X, Z), Genitore(Z, Y)
Si può immaginare che questo processo sia eseguito iterativamente:
Siccome Datalog dispone di query ricorsive, è chiuso transitivamente. Questo non vale per l'algebra relazionale e di conseguenza Datalog ha più potere espressivo dell'algebra relazionale.