RIF in terms of SQL views and Datalog:

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