Neo4j 使用FR或UK类型的双精度运算 描述

Neo4j 使用FR或UK类型的双精度运算 描述,neo4j,cypher,Neo4j,Cypher,如果要在节点中存储FR typed double,只能使用字符串值,因为双精度值的显示方式如下:12,58(而不是US type的12.58) 因此,如果您想在密码查询中进行一些计算,很难使用FR类型的双精度,因为它们是String,而String+String会导致串联,而不是真正的加法 例子 要检查此问题,只需创建两个节点: CREATE (a:TestNode{value : "12,45"}), (b:TestNode{value : "15"}) RETURN (a.value + b

如果要在节点中存储FR typed double,只能使用
字符串
值,因为双精度值的显示方式如下:12,58(而不是US type的12.58)

因此,如果您想在密码查询中进行一些计算,很难使用FR类型的双精度,因为它们是
String
,而
String
+
String
会导致串联,而不是真正的加法

例子 要检查此问题,只需创建两个节点:

CREATE (a:TestNode{value : "12,45"}), (b:TestNode{value : "15"})
RETURN (a.value + b.value) AS result
解决? 显而易见的解决方案是将所有内容存储为double,并在Java端进行计算,但这需要太多重构,问题是有些值存储为FR double(如12547898),有些存储为UK double(如12789.45),有些存储为US double(这些值使用原语类型double存储)


我正在寻找一个纯密码解决方案,以避免大量数据和代码重构。

有趣的问题。您可以在
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

但是此查询只能
以浮点/双精度返回
值。我不知道如何在更复杂的查询中包含
CASE
这一点。

在更复杂的查询中包含这一点可以通过WITH实现,我认为,由于CASE子句应该始终使用别名,因此可以在WITH子句中使用它