如果要在节点中存储FR类型的double,则只能使用String
值来执行此操作,因为双值显示如下:12,58(而不是美国类型的12.58)。
因此,如果你想在密码查询中进行一些计算,那么很难使用FR类型加倍,因为它们是String
,而String
+ String
会导致串联,不是真正的补充。
要检查此问题,您只需创建两个节点:
CREATE (a:TestNode{value : "12,45"}), (b:TestNode{value : "15"})
RETURN (a.value + b.value) AS result
显而易见的解决方案是将所有内容存储在基础中,并在Java端进行计算,但它需要过多的重构,问题是某些值存储为FR double(如1254,7898) ,有些存储为UK double(如12,789.45),有些存储为US double(这些存储使用基本类型double存储)。
我正在寻找纯粹的Cypher解决方案,以避免海量数据和代码重构。
答案 0 :(得分:0)
有趣的问题。您可以在CASE
表达式中处理格式不同的双精度数。首先,将其转换为字符串。如果它同时包含.
和,
,那么它就是英国。如果它包含,
但不包含.
则为FR。否则它应该是原生的双倍。然后,您可以替换,
并转换为float。
MATCH (a:TestNode)
RETURN
CASE
// UK formatted, 12,3456.45
WHEN toString(a.value) =~ ".*\\..*" AND toString(a.value) =~ ".*\\,.*"
// remove , and convert to float
THEN toFloat(replace(toString(a.value), ',', ''))
// FR formatted 1234,23
WHEN toString(a.value) =~ ".*\\,.*" AND NOT toString(a.value) =~ ".*\\..*"
// replace, with . and convert to float
THEN toFloat(replace(toString(a.value), ',', '.'))
// else it should be a double
ELSE toFloat(a.value)
END
但此查询只能RETURN
value
作为float / double。我不知道如何在更复杂的查询中包含CASE
内容。