Neo4j 使用FR或UK类型的双精度运算 描述
如果要在节点中存储FR typed double,只能使用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
字符串
值,因为双精度值的显示方式如下: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子句中使用它