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



是否有一种方法可以通过Cypher返回整数?

我正在与Neo4J和JavaScript驱动程序一起工作。但是,当我进行count()时,我会得到{low: 10, high: 0}。我想强迫它返回一个低整数,而不是上面的对象。这是否可以通过Cypher?

请注意,我不想在Neo4J JavaScript驱动程序中这样做,并且更喜欢在Cypher中执行此操作,因为我知道这将是一个较低的数字...

从驱动程序的1.6版本开始,可以将其配置为仅返回本地数字而不是自定义整数对象。配置选项会影响驱动程序返回的所有整数。启用此选项可能会导致返回精度和错误的数字值如果数据库包含范围之外的整数数字[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-numbers-and-the-integer-type

请记住,max_safe_integer为2^53-1 = 9,007,199,254,740,991

Cypher仅具有长和双重值。JavaScript无法充分代表64位朗。

NEO4J JavaScript驱动程序提供了建议,以便在向Neo4J查询提供参数时处理此问题,以及用于返回的返回的较量。

使用neo4j.integer.toNumber。因此,基本上,当您想表示这种价值时,请使用

之类的东西
variable.toNumber()

您将获得一个很好的旧int值。

您可以为转换编写简单的处理程序:

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);
  });

在我的对象的构造函数中,我在此处找到此功能将其转换为对js友好的数字。到目前为止的运作良好!

function toNumber({ low, high }) {
  let res = high
  for (let i = 0; i < 32; i++) {
    res *= 2
  }
  return low + res
}

最新更新