DEV Community

Kihara
Kihara

Posted on • Edited on

Unlocking the Power of Apache Age: Advanced Techniques for SQL/Cypher Hybrid Queries

Using Cypher in a CTE Expression

You can use a CTE (Common Table Expression) to define a Cypher query and then reference it in a SQL query. This can be useful for breaking down a complex query into smaller, more manageable pieces. For example:

WITH graph_query as (
  SELECT * FROM cypher('graph_name', $$
    MATCH (n)
    RETURN n.name, n.age
    $$) as (name agtype, age agtype)
)
SELECT * FROM graph_query;

Enter fullscreen mode Exit fullscreen mode

The above query will first execute the Cypher query in the CTE, which will return all nodes in the graph with their names and ages. The SQL query will then select all rows from the CTE, returning the same results.

Using Cypher in a Join expression

You can also use a Cypher query in the JOIN clause of a SQL query. This can be useful for combining data from the graph with data from a relational database. For example:

SELECT id,
  graph_query.name = t.name as names_match,
  graph_query.age = t.age as ages_match
FROM schema_name.sql_person AS t
JOIN cypher('graph_name', $$
  MATCH (n:Person)
  RETURN n.name, n.age, id(n)
  $$) as graph_query(name agtype, age agtype, id agtype)
ON t.person_id = graph_query.id;
Enter fullscreen mode Exit fullscreen mode

This query will join the sql_person table with the results of the Cypher query, which will return all nodes in the graph with their names, ages, and IDs. The join will be performed on the person_id column.

Using CTEs with CREATE, REMOVE, and SET: Cypher queries with CREATE, SET, or REMOVE clauses cannot be used in SQL queries with Joins, as they affect the Postgres transaction system. One possible solution is to protect the query with CTEs.

WITH graph_query as (
  SELECT * FROM cypher('graph_name', $$
    CREATE (n:Person {name: 'New Person'})
    RETURN n
    $$)
)
SELECT * FROM graph_query;

Enter fullscreen mode Exit fullscreen mode

The query above first execute the Cypher query in the CTE, which will create a new node in the graph with the name "New Person". The SQL query will then select all rows from the CTE, returning the new node.

Querying Multiple Graphs

There is no restriction to the number of graphs an SQL statement can query. Allowing users to query more than one graph at the same time.

SELECT graph_1.name, graph_1.age, graph_2.license_number
FROM cypher('graph_1', $$
    MATCH (v:Person)
    RETURN v.name, v.age
$$) as graph_1(col_1 agtype, col_2 agtype, col_3 agtype)
JOIN cypher('graph_2', $$
    MATCH (v:Doctor)
    RETURN v.name, v.license_number
$$) as graph_2(name agtype, license_number agtype)
ON graph_1.name = graph_2.name
Enter fullscreen mode Exit fullscreen mode

These are just a few examples of how you can use Cypher queries in SQL/Cypher Hybrid Queries. By using these advanced techniques, you can perform more complex and powerful queries on your graph data. Apache AGE offer a versatile and powerful platform for working with graph and relational data concurrentlyz. To learn more you can visit age website or github page.

Top comments (0)