提问者:小点点

Neo4j Cypher中NaN的字面表达式是什么?


如何在Cypher查询中将NaN表示为文字?

形势

我在数据库中有一个NaN值:

match (a) with max(a.CONCENTRATION) as m return m

将返回

m
---
NaN

Neo4j中的Cypher引用提到,这可能是存储特殊值的结果:

特殊值java. lang.Double.NaN被认为大于所有其他数字。

我所尝试的

但是,现在它在那里,我不知道如何在搜索中匹配它们,因为您会得到以下错误

输入

match (a) where a.CONCENTRATION = NaN return a limit 10

错误

Variable `NaN` not defined (line 1, column 35 (offset: 34))

其他参考

Neo4j中的Cypher引用没有提到NaN字面量,除非我错过了它。

我用谷歌搜索了“Cypher NaN”,但我得到的最接近的东西是如何添加inf/NaN,它没有直接解决(如何将无穷大、NaN或空值添加到Cypher/Neo4j中节点上的double[]属性)。


共2个答案

匿名用户

[更新2]

Neo4j 5.0介绍:

  • 浮点文字InfInfinityNaN
  • 用于确定指定值是否为NaN的isNaN()函数。

[原创]

没有办法指定文字,但这应该可以:

MATCH (a)
WHERE TOFLOAT(a.CONCENTRATION) <> a.CONCENTRATION
RETURN a
LIMIT 10;

如果参数不能(根据需要)转换为数字,TOFLOAT()将返回NULL。但是,即使可以转换参数,结果也不会等于参数,除非它一开始是数字。

[更新1]

@chaserino漂亮的新答案促使我做了更多的实验。

尽管NaNInfinity-Infinity仍然没有文字,但我确定Cypher可以在neo4j版本3.4.0中生成这些值(我没有测试早期版本)。然后您可以使用这些值进行比较。

例如,此查询显示了如何生成这些值:

RETURN 0.0/0.0, 1.0/0.0, -1.0/0.0

结果如下:

╒═════════╤═════════╤══════════╕
│"0.0/0.0"│"1.0/0.0"│"-1.0/0.0"│
╞═════════╪═════════╪══════════╡
│NaN      │Infinity │-Infinity │
└─────────┴─────────┴──────────┘

注意:对于Infinity,您实际上可以使用任何正分子,对于-Infinity,您可以使用任何负分子。

匿名用户

这适用于Neo4j 3.5:

匹配(a)其中TOSTRING(a. CONCENTRATION)='NaN'返回限制10;