在 CTE/JOIN/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 row(s) returned

在 Join 表达式中使用 Cypher

Cypher 查询可以作为 JOIN 子句的一部分。

注意!
使用 CREATE、SET、REMOVE 子句的 Cypher 查询不能在带有 JOIN 的 SQL 查询中使用。

查询:

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 row(s) returned

Cypher 在 SQL 表达式中的使用

Cypher 不能在表达式中使用——查询必须存在于查询的 FROM 子句中。但是,如果将 Cypher 查询放在子查询中,它将像任何 SQL 风格的查询一样工作。

注意!
在 YMatrix AGE 中,使用 CREATE、SET、REMOVE 子句的 Cypher 查询不能在带有 INSERT、DELETE、UPDATE 等写语句中使用。例如:

Insert into t from
SELECT * FROM cypher('graph_name', $$> CREATE (a)> RETURN a>$$) AS (a agtype)

使用 Cypher 与 '='

当编写已知返回一列一行的 Cypher 查询时,可以使用 '=' 比较运算符。

SELECT t.name, t.age
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(s) returned

使用 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 row(s) returned

使用 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 row(s) returned

查询多个图

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(name agtype, age 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(s) returned