在Apache AGE中为同名顶点属性存不同类型值是否会引发应用错误?
Apache AGE同名顶点属性存不同类型值的问题
Apache AGE允许用户为同标签顶点的同名属性存储不同类型的值,比如下面的示例:
示例1:创建pages为数值类型的顶点
SELECT * FROM cypher('books', $$ CREATE (v:Book {title: 'A book', pages: 10}) RETURN v $$) as (v agtype);
执行结果:
v -------------------------------------------------------------------------------------------------- {"id": 844424930131969, "label": "Book", "properties": {"pages": 10, "title": "A book"}}::vertex (1 row)
示例2:创建pages为字符串类型的顶点
SELECT * FROM cypher('books', $$ CREATE (v:Book {title: 'Another book', pages: '10'}) RETURN v $$) as (v agtype);
执行结果:
v ---------------------------------------------------------------------------------------------------------- {"id": 844424930131970, "label": "Book", "properties": {"pages": "10", "title": "Another book"}}::vertex (1 row)
关于应用构建中的错误风险
虽然所有属性值都会以agtype格式返回,但这种同一属性混合存储不同类型的做法大概率会在应用构建和运行阶段引发问题,主要原因包括:
- 应用代码通常会假设同标签顶点的同名属性类型一致,比如若代码预期
pages是数值类型,读取到字符串值时会直接触发类型转换异常; - 当需要对属性进行运算(比如统计总页数)或比较(比如筛选页数大于50的书籍)时,混合类型会导致运算逻辑直接失败;
- 会额外增加代码复杂度,需要为每个属性添加类型判断和兼容逻辑,大幅提升bug出现的概率;
- 后续维护时,其他开发人员容易默认属性类型统一,误用后引发难以排查的问题。
内容的提问来源于stack exchange,提问作者Carla
相关产品推荐
相关产品推荐

