Statements
Table of Contents
- Statements (Overview)
CREATEStatementDROPStatementSETStatement(IN|UP)SERTStatementDELETEStatement
Statements (Overview)
In addition to queries, gSQL++ needs to support statements for a) managing the definition of graphs, and b) for controlling the context used in query compilation & evaluation.
CREATE Statement
The CREATE statement is used for creating dataverses and other persistent artifacts within a dataset. In Graphix, if users want to create a AsterixDB managed graph whose metadata / name is persisted across requests, they would use the CREATE GRAPH statement as opposed to defining a temporary graph using the WITH GRAPH clause.
CREATE Statement
CREATE GRAPH Statement
Graph Constructor
Vertex Constructor
Vertex Constructor Detail
Vertex Definition
Edge Constructor
Edge Constructor Detail
Edge Definition
A graph in Graphix is specified by using the graph constructor production. A graph constructor is used to specify the schema of a graph containing one or more vertices, and zero or more edges.
To specify a vertex in a graph schema, the vertex constructor production is used. A vertex constructor consists of a) a single label (specified using a vertex pattern), b) a primary key, and c) a vertex body specified after the AS keyword. The edge constructor production is used to specify an edge in a graph schema, and consists of a) a source vertex label (specified using a vertex pattern), b) a destination vertex label (again, specified using a vertex pattern), c) an edge label (specified using an edge pattern), d) a direction (using arrows, again from the edge pattern), e) a source key, f) a destination key, and g) an edge body. The source key and destination key will be used when connecting the edge itself to its source vertex and destination vertex.
An example CREATE GRAPH is given below:
CREATE GRAPH Gelp.GelpGraph AS
VERTEX (:Business)
PRIMARY KEY (business_id)
AS Gelp.Businesses,
VERTEX (:User)
PRIMARY KEY (user_id)
AS Gelp.Users,
VERTEX (:Review)
PRIMARY KEY (review_id)
AS (
FROM
Gelp.Reviews R
WHERE
R.review_time IS NOT UNKNOWN
SELECT VALUE
R
),
EDGE (:Review)-[:ABOUT]->(:Business)
SOURCE KEY (review_id)
DESTINATION KEY (business_id)
AS (
FROM
Gelp.Reviews R
WHERE
R.review_time IS NOT UNKNOWN
SELECT
R.review_id,
R.business_id
),
EDGE (:Review)-[:MADE_BY]->(:User)
SOURCE KEY (review_id)
DESTINATION KEY (user_id)
AS (
FROM
Gelp.Reviews R
WHERE
R.review_time IS NOT UNKNOWN
SELECT
R.review_id,
R.user_id
),
EDGE (:User)-[:FRIENDS_WITH]->(:User)
SOURCE KEY (user_id)
DESTINATION KEY (friend)
AS (
FROM
Gelp.Users U,
U.friends F
SELECT
F AS friend,
U.user_id AS user_id
);
Although vertex and edge patterns are used to specify our graph schema, the following constraints are imposed on any defined graph:
- A vertex must have exactly one label.
- An edge must have exactly one label.
- The source vertex of an edge must have exactly one label.
- The destination vertex of an edge must have exactly one label.
- An edge must be directed.
- An edge must reference a vertex that is defined within that schema.
DROP Statement
The DROP statement is the inverse of the CREATE statement, and is used to drop dataverses, datatypes, indexes, functions, synonyms, and graphs.
DROP GRAPH Statement
SET Statement
The SET statement allows users to give additional context to both Graphix and the AsterixDB optimizer. For AsterixDB specific parameters, see here. For Graphix specific parameters, see here.
SET Statement
(IN|UP)SERT Statement
The INSERT statement is used to insert new data into a dataset. The UPSERT statement is “add or replace” data into / from a dataset. These statements remain unchanged from SQL++.
INSERT / UPSERT Statement
gSQL++ does not directly support the creation of vertices and edges, as each vertex and edge body represents a view of your logical model. Such an action is akin to inserting a record into a SQL++ (or SQL) view– inserting new vertices or edges is an action that depends on the element bodies composing your graph schema. Users can still, however, leverage gSQL++ to aid in modifying the vertices and edges in your graph. The example below utilizes an anti-join to locate users that should have a FRIENDS_WITH edge between them, and then adds to the Friends dataset if no such edge is found:
INSERT INTO Friends
FROM
GRAPH GelpGraph
(u1:User)
LET
targetFriendID = 5
WHERE
u1.user_id NOT IN (
FROM
GRAPH GelpGraph
(uu1:User)-[:FRIENDS_WITH]->(uu2:User)
WHERE
uu1 = u1 AND
uu2.user_id = targetFriendID
SELECT VALUE
uu1.user_id
)
SELECT
u1.user_id AS user_id,
targetFriendID AS friend;
DELETE Statement
The DELETE statement is used to delete data from a target dataset. This statement remains unchanged from SQL++.
DELETE Statement
gSQL++ also does not directly support the deletion of vertices and edges. Users can, however, use a gSQL++ query to locate the exact record(s) they want to delete. Suppose that we want to delete all users that have made reviews for a fake business. We can accomplish this deletion using a correlated sub-query:
DELETE FROM Users AS u
WHERE
EXISTS (
FROM
GRAPH GelpGraph
(gu:User)-(:Review)-(gb:Business)
WHERE
"fake" IN gb.annotations AND
u = gu
SELECT
1
);