diff --git a/drivers/jdbc/samples/AgeBasic.java b/drivers/jdbc/samples/AgeBasic.java new file mode 100644 index 000000000..f6f296445 --- /dev/null +++ b/drivers/jdbc/samples/AgeBasic.java @@ -0,0 +1,134 @@ +import org.apache.age.jdbc.base.Agtype; +import org.postgresql.jdbc.PgConnection; + +import java.sql.*; + +public class AgeBasic { + + public static PgConnection connection; + static final String DB_URL = "jdbc:postgresql://localhost:5432/demo"; + static final String USER = "postgres"; + static final String PASS = "pass"; + + public static void main(String[] args) { + + // Open a connection + try { + makeConnection(); + + if (graphExist("demo_graph")) + dropGraph(); + + createGraph(); + getResult(); + getObjectsFromResult(); + + // after all + dropGraph(); + closeConnection(); + } + catch (Exception e) { + System.out.println(e.getMessage()); + } + + } + + /** + * Creating a connection with the database + * Loading AGE extension & configuring database for AGE + */ + public static void makeConnection() throws SQLException { + connection = DriverManager.getConnection(DB_URL, USER, PASS).unwrap(PgConnection.class); + connection.addDataType("agtype", Agtype.class); + + // configure AGE + Statement statement = connection.createStatement(); + statement.execute("CREATE EXTENSION IF NOT EXISTS age;"); + statement.execute("LOAD 'age'"); + statement.execute("SET search_path = ag_catalog, \"$user\", public;"); + } + + /** + * Using Agtype parser on the ResultSet to get the result in Agtype. + */ + public static void getResult() throws SQLException { + Statement stmt = connection.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT * from cypher('demo_graph', $$ MATCH (n) RETURN n $$) as (n agtype);"); + + // Returning result as Agtype + System.out.println("\nRESULT AS AGTYPE"); + while (rs.next()) { + Agtype returnedAgtype = rs.getObject(1, Agtype.class); + System.out.println(returnedAgtype.getValue()); + } + } + + /** + * Using Agtype to extract specific objects from the Agtype result. + */ + public static void getObjectsFromResult() throws SQLException { + Statement stmt = connection.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT * from cypher('demo_graph', $$ MATCH (n) RETURN n $$) as (n agtype);"); + + System.out.println("\nEXTRACTING OBJECTS FROM RESULT"); + while (rs.next()) { + Agtype returnedAgtype = rs.getObject(1, Agtype.class); + String nodeLabel = returnedAgtype.getMap().getObject("label").toString(); + String nodeProp = returnedAgtype.getMap().getObject("properties").toString(); + + System.out.println("Vertex : " + nodeLabel + ", \tProps : " + nodeProp); + } + } + + /** + * Creating a 'demo_graph'. + * Then adding some Nodes. + * Then connecting them with some relation. + */ + public static void createGraph() throws SQLException { + Statement statement = connection.createStatement(); + + // Nodes labeled as PERSON + statement.execute("SELECT create_graph('demo_graph');"); + statement.execute("SELECT * FROM cypher('demo_graph', $$ CREATE (n:Person {name : 'imran', bornIn : 'Pakistan'}) $$) AS (a agtype);"); + statement.execute("SELECT * FROM cypher('demo_graph', $$ CREATE (n:Person {name : 'ali', bornIn : 'Pakistan'}) $$) AS (a agtype);"); + statement.execute("SELECT * FROM cypher('demo_graph', $$ CREATE (n:Person {name : 'usama', bornIn : 'Pakistan'}) $$) AS (a agtype);"); + statement.execute("SELECT * FROM cypher('demo_graph', $$ CREATE (n:Person {name : 'akbar', bornIn : 'Pakistan'}) $$) AS (a agtype);"); + statement.execute("SELECT * FROM cypher('demo_graph', $$ CREATE (n:Person {name : 'james', bornIn : 'US'}) $$) AS (a agtype);"); + statement.execute("SELECT * FROM cypher('demo_graph', $$ CREATE (n:Person {name : 'david', bornIn : 'US'}) $$) AS (a agtype);"); + statement.execute("SELECT * FROM cypher('demo_graph', $$ CREATE (n:Person {name : 'max', bornIn : 'US'}) $$) AS (a agtype);"); + + // Nodes labeled as COUNTRY + statement.execute("SELECT * FROM cypher('demo_graph', $$ CREATE (n:Country{name : 'Pakistan'}) $$) AS (a agtype);"); + statement.execute("SELECT * FROM cypher('demo_graph', $$ CREATE (n:Country{name : 'US'}) $$) AS (a agtype);"); + + // creating relationship (n:PERSON)-[r:BORNIN]-(n:COUNTRY) + statement.execute("SELECT * FROM cypher('demo_graph', $$ MATCH (a:Person), (b:Country) WHERE a.bornIn = b.name CREATE (a)-[r:BORNIN]->(b) RETURN r $$) as (r agtype);"); + } + + /** + * After done querying drop the whole graph. + * Dropping the GRAPH with CASCADE:true. Deletes the whole data in the graph. + */ + public static void dropGraph() throws SQLException { + Statement statement = connection.createStatement(); + statement.execute("SELECT * FROM ag_catalog.drop_graph('demo_graph', true);"); + } + + public static boolean graphExist(String graph_name) throws SQLException { + + PreparedStatement ps = connection.prepareStatement("SELECT * FROM ag_catalog.ag_graph WHERE name = ?"); + ps.setString(1, graph_name); + ps.executeQuery(); + ResultSet rs = ps.getResultSet(); + return !(!rs.isBeforeFirst() && rs.getRow() == 0); + } + + /** + * At last close the connection before exit. + */ + public static void closeConnection() throws SQLException { + connection.close(); + } + +} \ No newline at end of file