SQL表达式

本文介绍在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、SETREMOVE子句的Cypher查询不能在带有JOINSQL查询中使用,因为它们会影响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)

使用PostgresIN子句

当编写一个已知返回一列但可能有多个行的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)

使用PostgresEXISTS子句

当编写可能返回多列和多行的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)