背景
我有一些节点已经记录了一个特定的属性,并且我希望它们被记录为INT --我已经修改了系统的输入代码,现在将它们记录为INT,但是我希望检查Neo4J是否有异常。
数据
我现在有了一个混合数据,其中一些是作为"int“创建的,有些是作为STR创建的,有些甚至是空的(在我的数据结构中是可以的)。
CREATE (n:logs{value: "example", records: "30"})
, (n:logs{value: "example", records: 30})
, (n:logs{value: "example", records: null})
RETURN n
问题
我试图验证系统现在是否将“记录”属性写成INT而不是字符串,所以我尝试了以下查询;
WITH datetime("2021-06-18T06:00:00").epochMillis AS threshold
MATCH(n:logs)
WHERE n.records <> tointeger(n.records)
COUNT(n)
由于某种原因,这将返回1-我的空记录。但不是STR,正如我所预料的。
然后尝试如下(6月18日是我的输入系统更新的日期);
WITH datetime("2021-06-18T06:00:00").epochMillis AS threshold
MATCH(n:logs)
WHERE n.records = tointeger(n.records)
COUNT(n)
它返回0--这也是我不知道为什么。
所以我的问题是,我做错了什么,我怎样才能到达我需要去的地方。最终是这样的;
forwards
我想第二条应该是
MATCH(n:logs)
WHERE n.records <> tointeger(n.records)
SET n.records = tointeger(n.records)
其他信息
edition
发布于 2021-06-23 15:44:37
要更新为整数的查询是正确的。
为了澄清您的假设,请在您的neo4j桌面或浏览器中运行以下查询,您将看到发生了什么。
1. RETURN toInteger("2021-06-18T06:00:00")
2. RETURN toInteger(null)
它们都将返回NULL。这意味着你下面的说法是不正确的。
由于某种原因,
返回1-我的空记录。但不是STR,正如我所预料的。
您确实返回了1,但这是记录的字符串值('30')而不是空值。
然后当您在下面运行查询时
,其中n.records =to整数(n.records)并返回0--这也不知道为什么。
这是因为字符串日期类型的整数值也是空的。因此,它将不返回匹配的记录。
如果希望计数所有具有非整数属性的节点,包括空值,则可以在查询下面运行。
MATCH(n:logs)
WHERE n.records <> tointeger(n.records) OR n.records is null
RETURN count(distinct n) as cnt
Result: 2
请记住,如果n.records = "2021-06-18T06:00:00“,则需要将其转换为一个时代值(时间的整数值(秒或自1970年1/1/1970以来的millis )。如果不是,则not整型(n.records)为null,在查询中将不匹配。
如下所示:
MATCH (n:logs)
WHERE tointeger(n.records) is null
SET n.records = datetime(n.records).epochMillis
RETURN n
然后执行原始查询(这是正确的!),以清除其他非整数值。
MATCH(n:logs)
WHERE n.records <> tointeger(n.records)
SET n.records = tointeger(n.records)
https://stackoverflow.com/questions/68100990
复制相似问题