Neo4j的MERGE语句ON MATCH/ON CREATE操作设置属性是否有数量上限?
问题解答
Neo4j服务端属性数量限制
- Neo4j本身没有对单个节点的属性数量设置硬上限,仅存在存储层面的间接约束:单个属性值最大为
2^30-1字节,单个节点所有属性序列化后的总容量只要符合存储层要求就能正常读写,12个属性的量级远未触及该限制。 - 你遇到的属性超过12个就触发解码错误的问题,不属于Neo4j服务端的已知缺陷。
问题根因判断
该报错是Haskell的hasbolt库的Bolt协议实现缺陷导致的,和Neo4j服务端无关。你可以通过官方客户端做快速验证:
直接在Neo4j Browser或者cypher-shell中执行以下写入语句:
MERGE (x:SomeType{a:"val1",b:"val2",c:"val3"}) ON MATCH SET x.d = "val7", x.e = "val8", x.f = "val10", x.g = "val11", x.h = "val12", x.i = "val13", x.j = "val14", x.k = "val15", x.l = "val16", x.m = "val17", x.n = "val18", x.o = "val19", x.p = "val20" ON CREATE SET x.d = "val4", x.e = "val5", x.f = "valx", x.g = "valy", x.h = "valz", x.i = "val11", x.j = "val12", x.k = "val13", x.l = "val14", x.m = "val15", x.n = "val16", x.o = "val17", x.p = "val18"
写入完成后再执行查询语句:
MATCH (x:SomeType{a:"val1",b:"val2",c:"val3"}) RETURN x
官方客户端可以正常返回节点的所有属性,不会出现解码错误。
排查方向
- 优先检查hasbolt库对Bolt协议中Map类型的解码逻辑,确认是否存在硬编码的Map长度限制、变长整数解析错误、字节序处理异常的问题。
- 可以抓取12个属性和13个属性时返回的Bolt二进制报文,对比差异定位解码逻辑的异常点。
内容的提问来源于stack exchange,提问作者esjmb
相关产品推荐
相关产品推荐

