- From: Eric Prud'hommeaux <eric@w3.org>
- Date: Tue, 27 Jul 2010 09:26:21 -0400
- To: public-rdb2rdf-wg@w3.org
Just so we can all speak each others' languages, here's a definition
of a view in SQL, Datalog (Horn Rules without functions) and RIF¹.
Imagine two tables, Employees and Departments:
Employees(emp_id, fname, lname, dept)
Departments(dpt_id, deptname, manager)
CREATE TABLE Employees(emp_id INT PRIMARY KEY, fname STRING, lname STRING, dept INT)
CREATE TABLE Departments(dpt_id INT PRIMARY KEY, deptname STRING, manager INT)
In SQL, we can create a view of employees and their managers,
EmpManager:
CREATE VIEW EmpManager AS
SELECT (e.emp_id, e.fname, e.lname, m.fname, m.lname)
FROM Employees AS e
JOIN Departments AS d ON d.dpt_id=e.dept
JOIN Employees AS m ON m.emp_id=d.manager
We can write this in Datalog:
EmpManager(EMP_ID, E_FNAME, E_LNAME, M_FNAME, M_LNAME) :-
Employees(EMP_ID, E_FNAME, E_LNAME, DEPT),
Departments(DEPT, _, MANAGER),
Employees(MANAGER, M_FNAME, M_LNAME, _)
or in RIF's n-ary predicate syntax:
Document(
Base(<http://mydb.example/#>)
Group (
Forall ?emp_id ?e_fname ?e_lname ?e_dept
?e_dept, ?deptName, ?manager
?manager ?d_fname ?d_lname ?d_dept (
EmpManager(?emp_id, ?e_fname, ?e_lname, ?m_fname, ?m_lname) :-
Employees(?emp_id, ?e_fname, ?e_lname, ?dept),
Departments?(dept, ?deptName, ?manager),
Employees(?manager, ?m_fname, ?m_lname, m_dept)
)
)
)
¹ If Employees or Departments did not have unique keys (labeled
"PRIMARY KEY" in the SQL definitions), these wouldn't be strictly
identical views as the SQL operational semantics preserves
cardinality over multisets, while the others use set semantics for
their predicates and specifically avoid an operational semantics.
For interested parties, the RIF semantics are defined at
http://www.w3.org/TR/rif-bld/#Direct_Specification_of_RIF-BLD_Semantics
--
-ericP
Received on Tuesday, 27 July 2010 13:26:56 UTC