如何确定Apache AGE中Cypher查询结果的数据类型?
在Apache AGE中确定agtype列的实际数据类型并转换
问题背景
执行以下Cypher查询获取客户数据:
SELECT * FROM cypher("customers", $$ MATCH (p:person) RETURN p.first_name, p.last_name $$ ) as (first_name agtype, last_name agtype)
返回结果:
first_name | last_name -------------+----------- John | Doe Matthew | Martinez Melissa | Moore
所有返回列在PostgreSQL中均为agtype类型,但AGE内部会跟踪其实际数据类型(如int、string等)。需要解决两个问题:
- 如何确定
agtype列的实际内部类型? - 如何将
agtype正确转换为对应PostgreSQL类型(如将内部为string的first_name转VARCHAR,内部为int的zip_code转INT)?
一、确定agtype的实际内部类型
可以通过两种方式获取agtype值的实际类型:
1. 使用PostgreSQL端的agtype_type_of()函数
该函数直接返回agtype值的内部类型,示例查询:
SELECT agtype_type_of(first_name) AS first_name_type, agtype_type_of(last_name) AS last_name_type FROM cypher("customers", $$ MATCH (p:person) RETURN p.first_name, p.last_name $$ ) as (first_name agtype, last_name agtype);
返回结果会显示类似string(对应文本类型)、int(对应整数类型)等明确类型标识。
2. 在Cypher语句中使用type()函数
如果需要一次性获取节点所有属性的类型,可以结合keys()和type()函数:
SELECT * FROM cypher("customers", $$ MATCH (p:person) UNWIND keys(p) AS prop_key RETURN prop_key, type(p[prop_key]) AS prop_type $$ ) as (prop_key agtype, prop_type agtype);
此查询会列出person节点的所有属性名及其对应的内部类型。
二、将agtype转换为对应PostgreSQL类型
有两种可靠的转换方式:
1. 直接使用PostgreSQL类型转换语法
如果已经明确agtype的内部类型,可以直接用::进行转换:
-- 将first_name、last_name转换为VARCHAR SELECT first_name::varchar AS first_name, last_name::varchar AS last_name FROM cypher("customers", $$ MATCH (p:person) RETURN p.first_name, p.last_name $$ ) as (first_name agtype, last_name agtype); -- 将内部为INT的zip_code转换为PostgreSQL INT类型 SELECT zip_code::int AS zip_code FROM cypher("customers", $$ MATCH (p:person) RETURN p.zip_code $$ ) as (zip_code agtype);
2. 使用AGE的agtype_cast()函数(更稳妥)
该函数会先检查类型兼容性,转换失败时抛出更明确的错误,适合不确定类型或需要严格校验的场景:
-- 转换文本类型agtype为VARCHAR SELECT agtype_cast(first_name, 'varchar') AS first_name, agtype_cast(last_name, 'varchar') AS last_name FROM cypher("customers", $$ MATCH (p:person) RETURN p.first_name, p.last_name $$ ) as (first_name agtype, last_name agtype); -- 转换整数类型agtype为INT SELECT agtype_cast(zip_code, 'int') AS zip_code FROM cypher("customers", $$ MATCH (p:person) RETURN p.zip_code $$ ) as (zip_code agtype);
内容的提问来源于stack exchange,提问作者moeed865
相关产品推荐
相关产品推荐

