本文介绍在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)该文章对您有帮助吗?