全部產品
Search
文件中心

PolarDB:SQL運算式

更新時間:Jan 10, 2025

本文介紹在SQL查詢的不同部分中嵌入Cypher查詢。

在CTE(通用資料表運算式)中使用Cypher

在通用資料表運算式(CTE)中使用Cypher沒有任何限制。

樣本

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;

返回結果如下:

       name        | age 
-------------------+-----
 "Andres"          | 36
 "Tobias"          | 25
 "Peter"           | 35
(3 rows)

在JOIN操作中使用Cypher

Cypher查詢可以是JOIN子句的一部分。

說明

包含CREATE、SET和REMOVE子句的Cypher查詢不能在帶有JOIN的SQL查詢中使用,因為它們會影響Postgres事務系統。

樣本

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;

返回結果如下:

 id | names_match | ages_match 
----+-------------+------------
 1  | True        | True
 2  | False       | True
 3  | True        | False 
(3 rows)

在SQL運算式中使用Cypher

Cypher不能直接用於SQL運算式,查詢必須存在於FROM子句中。然而,如果Cypher查詢被放置在子查詢中,它將像任何SQL風格的查詢一樣工作。

使用Cypher與=

在編寫已知會返回一列一行的 Cypher 查詢時,可以使用=比較操作符。

SELECT t.name FROM schema_name.sql_person AS t
where t.name = (
    SELECT a
    FROM cypher('graph_name', $$
       MATCH (v)
        RETURN v.name
    $$) as (name varchar(50))
    ORDER BY name
    LIMIT 1);

返回結果如下:

       name        | age 
-------------------+-----
 "Andres"          | 36
(1 row)

使用Postgres的IN子句

當編寫一個已知返回一列但可能有多個行的Cypher查詢時,可以使用IN操作符。

SELECT t.name, t.age FROM schema_name.sql_person as t
where t.name in (
    SELECT *
    FROM cypher('graph_name', $$
        MATCH (v:Person)
        RETURN v.name
    $$) as (a agtype));

返回結果如下:

       name        | age 
-------------------+-----
 "Andres"          | 36
 "Tobias"          | 25
 "Peter"           | 35
(3 rows)

使用Postgres的EXISTS子句

當編寫可能返回多列和多行的Cypher查詢時,可以使用EXISTS操作符。

SELECT t.name, t.age
FROM schema_name.sql_person as t
WHERE EXISTS (
    SELECT *
    FROM cypher('graph_name', $$
   MATCH (v:Person)
        RETURN v.name, v.age
    $$) as (name agtype, age agtype)
    WHERE name = t.name AND age = t.age
);

返回結果如下:

       name        | age 
-------------------+-----
 "Andres"          | 36
 "Tobias"          | 25
(2 rows)

查詢多個圖

SQL語句查詢的圖數量沒有限制。您可以同時查詢多個圖。

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;

返回結果如下:

 name       | age     | license_number 
------------+---------+-----------------
 "Andres"   | 36      | 1234567890 
(1 row)