在 Cypher 中,我可以在更新属性值之前检查属性是否为列表

问题描述 投票:0回答:2

我们正在更新数据库中的数据,对于某些节点,由于遗留数据,我们可能会找到字符串或列表形式的属性。我想将字符串转换为空列表并保持列表不变。 我尝试过这样的事情:

MATCH (a:part) WHERE NOT EXISTS((a.serials)[0]) SET a.serials=[] 返回 a

但它只是抛出一个错误。

有什么想法吗?

neo4j cypher
2个回答
2
投票

Cypher 没有内置函数,但您可以使用一个小技巧,即检查向属性添加元素是否会将其大小增加 1 ,例如

MATCH (n:Award)
RETURN size(n.years + 11) = size(n.years)+1 AS isList

+
符号、添加元素、连接或求和。因此,为了区分字符串和数组,我们需要添加两位数字。


NEO4J5 更新

Neo4j 5.10 引入了列表类型的类型谓词表达式,示例:

CREATE (n:Node {id: 1}) SET n.roles = ['roleA', 'roleB']
RETURN n.roles IS :: LIST<ANY>

更多信息在这里:https://neo4j.com/docs/cypher-manual/current/values-and-types/type-predicate/#type-predicate-lists


1
投票

您将需要使用 APOC 库来检查属性类型:

MATCH (a:part) 
WHERE NOT  apoc.meta.isType(a.serials) = "LIST"
SET a.serials=[] 
return a

您可以查看文档以获取更多信息:https://neo4j.com/labs/apoc/4.1/overview/apoc.meta/apoc.meta.isType/

© www.soinside.com 2019 - 2024. All rights reserved.