Query Comparison: SQL vs FlureeQL
Simple SELECT
SQL:
SELECT name, email FROM users WHERE id = 1;
FlureeQL:
{ "select": { "?user": ["schema:name", "schema:email"] }, "where": { "@id": "ex:users/1", "schema:name": "?name", "schema:email": "?email" }}
JOIN
SQL:
SELECT u.name, o.totalFROM users uJOIN orders o ON u.id = o.user_id;
FlureeQL:
{ "select": ["?userName", "?total"], "where": [ { "@id": "?order", "ex:customer": "?user", "ex:total": "?total" }, { "@id": "?user", "schema:name": "?userName" } ]}
No explicit JOIN—graph traversal is natural.
GROUP BY with COUNT
SQL:
SELECT user_id, COUNT(*)FROM ordersGROUP BY user_id;
FlureeQL:
{ "select": ["?user", "(count ?order)"], "where": { "@id": "?order", "ex:customer": "?user" }, "groupBy": "?user"}
Subquery
SQL:
SELECT * FROM usersWHERE id IN (SELECT user_id FROM orders WHERE total > 100);
FlureeQL:
{ "select": { "?user": ["*"] }, "where": [ { "@id": "?order", "ex:customer": "?user", "ex:total": "?total" }, ["filter", "(> ?total 100)"] ]}
The graph model eliminates the need for subqueries.