密码中的大整数,neo4j

large integers in cypher, neo4j

我有一个包含一些十六进制整数的数据集,例如“4726E440”。 我想将此数字添加为节点的属性。 如果我执行:

CREATE (n {id:toInt("4726E440")});

neo4j 给我这个错误:

integer, 4726E440, is too large

有没有办法处理这种整数(除了将它们保存为字符串)?

不是 100% 确定,但这看起来像是您正在尝试将包含浮点数 4724*10^440 的字符串转换为 int 值。那个明显太大了

如果你想使用十六进制文字,你需要在它们前面加上 0x,例如

return toInt(0x4726E440)

returns 1193731136 - 所以它仍在范围内。

如果您想知道 Neo4J 中数字大小的实际限制是什么,this 论坛 post 可能会让您感兴趣。

基本上,Neo4J 使用带符号的 64 位整数,最大值为 2**63 - 1。目前似乎没有办法增加这个限制,如果你真的必须存储这个大小的数字,你将不得不求助于字符串或字节列表。

只是为了以其他答案为基础,您需要用密码将您的大数字包装在 toInteger() 中。以下数字应该 而不是 彼此相等,但 Neo4j 认为它们相等。 (代码在 Neo4j v4.2 中是 运行,首先通过浏览器界面,然后使用 python 驱动程序):

RETURN 2^63-2 AS Minus2, 2^63-1 AS Minus1, 2^63-2 = 2^63-1 AS Comparison
╒═════════════════════╤═════════════════════╤════════════╕
│"Minus2"             │"Minus1"             │"Comparison"│
╞═════════════════════╪═════════════════════╪════════════╡
│9223372036854776000.0│9223372036854776000.0│true        │
└─────────────────────┴─────────────────────┴────────────┘

但是,如果您在语句中将大数转换为整数,Cypher 会正确读取它:

RETURN toInteger(2^63)-2 AS Minus2, toInteger(2^63)-1 AS Minus1, toInteger(2^63)-2 = toInteger(2^63)-1 AS Comparison
╒═══════════════════╤═══════════════════╤════════════╕
│"Minus2"           │"Minus1"           │"Comparison"│
╞═══════════════════╪═══════════════════╪════════════╡
│9223372036854775805│9223372036854775806│false       │
└───────────────────┴───────────────────┴────────────┘