From: | Dmitriy Letuchy <dm(dot)l(at)mail(dot)ru> |
---|---|
To: | pgsql-hackers(at)postgresql(dot)org |
Subject: | postgreSQL as deductive DBMS |
Date: | 2005-05-16 09:42:24 |
Message-ID: | E1DXc7E-000JXW-00.dm-l-mail-ru@f20.mail.ru |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
Hello all,
I have some ideas how to increase expressive power of the PostgreSQL query language. It is not a secret that SQL is very poor to express many important queries, and we have to use means of procedural extensions of SQL to realize them. However this is not good idea to split query language into two parts (declarative and procedural) at least because query language must finally operate with the objects of data domain, not with the bits the objects consist of. Thus another alternative to increase expressive power of query language is to develop its declarative (i.e. nonprocedural) part. And here we come to deductive database (DDB) with its logic language Datalog.
Every logic query is a set of inverse implications, which describe what to find (i.e. exactly declarative approach) and not how to find (i.e. exactly procedural approach). We can translate logic query into set of SQL commands and then run them to get result. Some samples with the DLQ compiler can be downloaded from www.datalab.kharkov.ua (DLQ is our original version of Datalog which was developed with the purpose to tie closely RDB and DDB).
Now some words about what must be done to realize described feature. The simple quickest way but the way without future is to write language handler. Other more correct way is to slightly extend DML part of SQL and more essentially extend DDL. For example, we have relation Inheritance with two attributes ClassID and ParentID. Now we want to define all descendants or all ancestors. For this goal we define predicate inheritance_all with the next two rules (i.e. inverse implications):
inheritance_all(ClassID, ParentID) :- inheritance(ClassID, ParentID);
inheritance_all(ClassID, ParentID) :- inheritance(ClassID, X),
inheritance_all(X, ParentID).
We put this rules into database and call, for example, the next SQL commands:
-- find all descendents
SELECT * FROM ddb_name.inheritance_all(_, _)
-- find all descendents from ParentID = 1
SELECT * FROM ddb_name.inheritance_all(_, 1)
where ddb_name is the name of deductive database where our rules are kept, _" designates anonymous variable (see Prolog notation for details).
Regards, Dmitriy
From | Date | Subject | |
---|---|---|---|
Next Message | Mark Cave-Ayland | 2005-05-16 11:12:55 | Re: Cost of XLogInsert CRC calculations |
Previous Message | Дмитрий Летучий | 2005-05-16 08:57:12 | postgreSQL as deductive DBMS |