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

kgsdhlau  于 11个月前  发布在  其他
关注(0)|答案(5)|浏览(145)

有没有一种方法可以通过cypher返回一个整数?
我正在使用neo4j和JavaScript驱动程序。然而,当我执行count()时,我得到{low: 10, high: 0}。我想强制它返回一个低整数,而不是上面的对象。这可以通过cypher实现吗?
请注意,我不想在neo4j JavaScript驱动程序中这样做,而更喜欢在cypher中这样做,因为我知道这将是一个很低的数字。

h4cxqtbf

h4cxqtbf1#

从1.6版本的驱动程序开始,可以将其配置为仅返回本机数字而不是自定义对象。配置选项会影响驱动程序返回的所有整数。如果数据库包含范围[Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER]之外的整数,则启用此选项可能会导致精度损失和返回不正确的数值

const driver = neo4j.driver(
  'neo4j://localhost',
  neo4j.auth.basic('neo4j', 'neo4j'),
  { disableLosslessIntegers: true }
)

字符串
请记住,MAX_SAFE_INTEGER2^53-1 = 9,007,199,254,740,991
资料来源:

  • Github上的Neo4j JS驱动程序-数字和数据类型
  • Github上的Neo4j JS驱动程序-启用本地号码
pu82cl6c

pu82cl6c2#

Cypher只适用于Long和Double值。JavaScript无法充分表示64位Long。
这里有来自Neo4j JavaScript驱动程序的建议,用于在向Neo4j查询提供参数时处理此问题,以及处理返回的长整型。

8i9zcol2

8i9zcol23#

使用neo4j.integer.toNumber。所以基本上,当你想表示这样的值时,可以使用类似于

variable.toNumber()

字符串
你会得到一个很好的旧int值。

rkttyhzu

rkttyhzu4#

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

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

ljsrvy3e

ljsrvy3e5#

在我的对象的构造函数中,我使用这个函数found here来转换为JS友好的数字。到目前为止效果很好!

function toNumber({ low, high }) {
  let res = high

  for (let i = 0; i < 32; i++) {
    res *= 2
  }

  return low + res
}

字符串

相关问题