使用FR或UK类型的双重操作

时间:2015-11-26 15:52:00

标签: neo4j cypher

描述

如果要在节点中存储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解决方案,以避免海量数据和代码重构。

1 个答案:

答案 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内容。