有没有办法通过cypher返回一个整数?
我正在使用neo4j和javascript驱动程序。但是当我执行count()
时,我得到{low: 10, high: 0}
。我想强制它返回一个低整数而不是上面的对象。这可能通过密码吗?
请注意,我不想在neo4j javascript驱动程序中执行此操作,而更喜欢在cypher中执行此操作,因为我知道它的数量很少...
答案 0 :(得分:3)
Cypher仅适用于Long和Double值。 Javascript无法充分代表64位Longs。
来自Neo4j javascript驱动程序的advice here用于在为Neo4j查询提供参数以及处理返回的long时处理此问题。
答案 1 :(得分:3)
从驱动程序的1.6版本开始,可以将其配置为仅返回本机数字,而不是自定义Integer对象。配置选项会影响驱动程序返回的所有整数。 启用此选项可能会导致精度损失和错误的数值返回,如果数据库包含的整数超出[Number.MIN_SAFE_INTEGER,Number.MAX_SAFE_INTEGER]范围。
var driver = neo4j.driver(
'neo4j://localhost',
neo4j.auth.basic('neo4j', 'neo4j'),
{ disableLosslessIntegers: true }
)
来源:https://github.com/neo4j/neo4j-javascript-driver#a-note-on-numbers-and-the-integer-type
请记住,MAX_SAFE_INTEGER为2 ^ 53-1 = 9,007,199,254,740,991
答案 2 :(得分:1)
您可以为转换编写简单的处理程序:
var transformIntegers = function(result) {
return new Promise( (resolve,reject) => {
try {
result.records.forEach( function(row, i) {
row._fields.forEach( function(val, j) {
result.records[i]._fields[j] = neo4j.isInt(val)
? (neo4j.integer.inSafeRange(val) ? val.toNumber() : val.toString())
: val;
})
})
resolve(result);
} catch (error) {
reject( error );
}
});
};
作为一个例子:
session
.run('MATCH (A) RETURN ID(A) AS id, toInteger(10^20) as unsafe LIMIT 1')
.then( transformIntegers )
.then( function(result) {
console.log(result.records[0]);
session.close();
driver.close();
})
.catch( function(error) {
console.log(error);
});
答案 3 :(得分:0)
使用neo4j.integer.toNumber
。因此,基本上,当您要表示这样的值时,请使用
variable.toNumber()
您将获得不错的旧int
值。
答案 4 :(得分:0)
在我的对象的构造函数中,我正在使用发现here的此函数将其转换为JS友好数字。到目前为止效果很好!
function toNumber({ low, high }) {
let res = high
for (let i = 0; i < 32; i++) {
res *= 2
}
return low + res
}