如何查找neo4j中的节点属性并将其更新为新文本

mum43rcc  于 2022-10-21  发布在  其他
关注(0)|答案(2)|浏览(229)

在我的NEO4J DB中,我希望编写一个查询,该查询将找到包含子字符串的节点的所有属性并更新该子字符串。
即:
我有10000个节点,例如:

CREATE (n:Person {name: 'andyLovesNEO4J', title: 'NEO4J.BLAH'})

但属性名称都不同。我希望找到包含‘NEO4J’的属性,并将该值更新为与它们相对应的‘SQL’。基本上,更新包含该子字符串的字符串。

xzv2uavs

xzv2uavs1#

与Charchit类似,您可以使用此APOC函数,但不使用展开。您可以将属性更新为APOC函数内的键和值的列表。

MATCH (p:Person)
WITH p, keys(p) AS keys
CALL apoc.create.setProperties(p,[k in keys|k], [k in keys | replace(p[k], 'NEO4J', 'SQL')])
YIELD node
RETURN node;
gblwokeq

gblwokeq2#

您可以尝试以下操作:

MATCH (p:Person)
UNWIND keys(properties(p)) AS keys
CALL apoc.create.setProperty(p, keys, replace(p[keys], 'NEO4J', 'SQL'))
YIELD node
RETURN DISTINCT node

获取节点,展开属性键,然后使用apoc.create.setProperty设置属性的新值。
如果您希望找到所需的节点,并且只更新必要的密钥,请尝试执行以下操作:

MATCH (p) WHERE ANY (k IN keys(p) WHERE apoc.map.get(properties(p),k) CONTAINS 'NEO4J')
WITH p, [k IN keys(p) WHERE apoc.map.get(properties(p),k) CONTAINS 'NEO4J' | k] as keys
CALL apoc.create.setProperties(p,[k in keys|k], [k in keys | replace(p[k], 'NEO4J', 'SQL')])
YIELD node
RETURN node;

在这里,我们删除了Person标签,以便选中每个节点,并筛选并保留相关属性。我使用jose_bacoy在回答中建议的setProperties函数,以避免不必要的复杂性。

相关问题