关于 YMatrix
部署数据库
使用数据库
管理集群
最佳实践
高级功能
高级查询
联邦查询
Grafana 监控
备份恢复
灾难恢复
图数据库
管理手册
性能调优
故障诊断
工具指南
系统配置参数
SQL 参考
在 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 |
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 不能在表达式中使用——查询必须存在于查询的 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 查询时,可以使用 '=' 比较运算符。
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 |
当编写已知返回一列但可能有多行的 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 |
当编写可能返回多列多行的 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 |