如何在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]
Neo4j 5.0介绍:
Inf
、Infinity
和NaN
。NaN
的isNaN()函数。[原创]
没有办法指定文字,但这应该可以:
MATCH (a)
WHERE TOFLOAT(a.CONCENTRATION) <> a.CONCENTRATION
RETURN a
LIMIT 10;
如果参数不能(根据需要)转换为数字,TOFLOAT()
将返回NULL。但是,即使可以转换参数,结果也不会等于参数,除非它一开始是数字。
[更新1]
@chaserino漂亮的新答案促使我做了更多的实验。
尽管NaN
、Infinity
和-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;