如何正确获取Neo4j Cypher查询返回的count结果及解析Integer类型
错误访问方式的原因
你访问的_fieldLookup是Neo4j驱动Record对象的内部私有属性,作用是存储返回字段名到_fields数组下标的映射,不是存储字段值。你看到的{ 'count(other)': 0 }含义是count(other)这个返回字段的值存放在_fields数组的第0位,而非该字段的计算结果为0,这是你取值错误的核心原因,你的Cypher查询语句本身没有问题。
Integer类型的low/high字段说明
Neo4j的Cypher整数类型默认是64位有符号整数,而JavaScript原生Number类型最多只能安全表示53位有符号整数,为了避免大数溢出丢失精度,官方驱动会默认把所有返回的整数值封装为自定义的Integer对象:
low:存储64位整数的低32位数值high:存储64位整数的高32位数值
当返回结果的high为0时,说明该数值小于2^32,直接取low字段的值就是正确结果,也可以直接调用该对象内置的toNumber()方法快速转为JavaScript原生数字。
正确的取值方式
推荐使用驱动提供的公共get方法取值,不要直接访问带下划线前缀的内部私有属性,这类属性没有跨版本兼容性保障:
- 按索引取值(仅适合返回字段顺序固定的场景):
const friendCount = result.records[0].get(0).toNumber() - 按字段名取值(更稳定,优先推荐):
首先给Cypher返回的计算字段设置别名,避免字段名带特殊符号:
之后直接通过别名取值:MATCH (self:USER {userID: $userID})-[r:FRIEND]-(other:USER) RETURN count(other) AS friendCountconst friendCount = result.records[0].get('friendCount').toNumber()
返回结构通用规则
Neo4j官方驱动的返回结果符合以下通用规则:
- 执行查询后返回的Result对象下的
records数组存储所有返回行,每一行对应一个Record对象 - Record对象对外暴露的标准取值入口为
get(索引 | 字段名),返回对应字段的原始值 - 数值、节点、关系等特殊类型都会被封装为驱动内置的自定义类对象,都提供了转原生类型的内置方法
内容的提问来源于stack exchange,提问作者John Sorensen
相关产品推荐
相关产品推荐

