neo4j返回一个整数而不是{high:0,low:10}

时间:2017-03-07 10:07:45

标签: neo4j cypher

有没有办法通过cypher返回一个整数?

我正在使用neo4j和javascript驱动程序。但是当我执行count()时,我得到{low: 10, high: 0}。我想强制它返回一个低整数而不是上面的对象。这可能通过密码吗?

请注意,我不想在neo4j javascript驱动程序中执行此操作,而更喜欢在cypher中执行此操作,因为我知道它的数量很少...

5 个答案:

答案 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
}