本文介紹在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)