GraphpostgresQL -- a graph interface to relational data
GraphpostgresQL is inspired by Facebook's graphql
. By using table
introspection, GraphpostgresQL is able to follow foreign keys and index into
complex datatypes like json
, jsonb
and hstore
.
A Proof of Concept
GraphpostgresQL is alpha quality and has undergone neither extensive optimization nor comprehensive testing. To use it for production workloads would needlessly tempt fate.
Install GraphpostgresQL
Using psql
, load the graphql
schema file:
\i graphql.sql
All definitions are created under the graphql
schema. GraphpostgresQL
doesn't load any extensions or alter the search_path
. If an older version of
GraphpostgresQL is loaded, the new installation will overwrite it.
Using GraphpostgresQL
To generate a query, use graphql.to_sql(text)
:
SELECT graphql.to_sql($$
user("f3411edc-e1d0-452a-bc19-b42c0d5a0e36") {
full_name,
friendship
}
$$);
Which should result in something like:
SELECT to_json("sub/2") AS "user"
FROM "user",
LATERAL (
SELECT json_agg("user") AS friendship
FROM "user"
JOIN friendship ON (("user".id) = (friendship.second))
WHERE (friendship.first)
= ('f3411edc-e1d0-452a-bc19-b42c0d5a0e36'::uuid)
) AS "sub/1",
LATERAL (
SELECT "user".full_name, "sub/1".friendship
) AS "sub/2"
WHERE (("user".id) = ('f3411edc-e1d0-452a-bc19-b42c0d5a0e36'::uuid))
To run a query, use graphql.run(text)
instead of graphql.to_sql(text)
.
Removing GraphpostgresQL
It's easy to remove GraphpostgresQL:
DROP SCHEMA IF EXISTS graphql CASCADE;
Roadmap
In GraphpostgresQL64, we'll introduce expanded selectors (nested selection in JSON columns, for example), an interface that accepts keyword parameters, and the ability to store and re-execute queries.
In GraphpostgresQL3D, we'll introduce a PL/V8 implementation, with extensible parsing, hooks and overall more modular implementation.