このトピックでは、CypherクエリをSQLクエリのさまざまな部分に埋め込む方法について説明します。
CTE式でのCypherの使用
CTE (Common Table Expression) で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クエリは、Postgresトランザクションシステムに影響するため、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 rows)SQL式でのCypherの使用
CypherクエリをSQL式で直接使用することはできません。 クエリはFROM句に存在する必要があります。 ただし、Cypherクエリがサブクエリに配置されている場合は、通常のSQLクエリのように機能します。
=でCypherを使用する
1つの列と1つの行を返すことがわかっている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句の操作
1つの列を返すことがわかっているが、複数の行を持つ可能性がある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句の操作
複数の列と行が返される可能性のある暗号クエリを作成する場合は、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)