在使用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查询中使用,因为它们会影响Postgres事务系统。一个可能的解决方案是使用CTE来保护查询。有关更多详细信息,请参阅“使用CTE与CREATE、REMOVE和SET”子节。
查询:
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
SQL表达式中的Cypher
Cypher不能在表达式中使用—查询必须存在于查询的FROM子句中。但是,如果将Cypher查询放置在子查询中,它将像任何SQL样式查询一样工作。
使用Cypher和‘=’
当编写已知返回一列和一行的cypher查询时,可以使用‘=’比较运算符。
查询:
SELECT t.name FROM schema_name.sql_person AS t
where t.name = (SELECT aFROM cypher('graph_name', $$MATCH (v)RETURN v.name$$) as (name varchar(50))ORDER BY nameLIMIT 1);
结果:
name age
‘Andres’ 36
3 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
3 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(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
3 row(s) returned
使用公有云服务
一些公有云的提供了免安装的数据库服务,无需自己部署。以MemFireCloud为例
直接连接
每个MemFire Cloud应用内置一个完整的Postgres数据库,你可以使用任何支持Postgres的工具来连接到数据库。你可以在控制台内的数据库设置中获取连接信息:
- 来到左侧菜单栏的
设置
部分 - 点击
数据库
- 启用数据库直连
- 找到应用的
连接信息
开启直连
白名单
MemFire Cloud内置白名单功能,开启白名单后,只允许白名单内的IP地址段访问你的数据库。关闭白名单后,访问你数据库的IP地址不受限制,即任何IP地址只要有连接信息都可以与你的数据库进行直连。 在进行白名单配置时,要遵循CIDR规则。MemFire Cloud中白名单功能 默认是关闭的,需用户手动开启。
配置白名单
通过数据库客户端连接数据库,可以执行图操作
CREATE EXTENSION age;
LOAD 'age';
SET search_path = ag_catalog, "$user", public;