gpt4 book ai didi

neo4j - 合并语句以匹配多个属性

转载 作者:行者123 更新时间:2023-12-04 21:38:01 25 4
gpt4 key购买 nike

我想弄清楚如何使用密码查询有效地添加新节点。我正在尝试合并多个数据源,因此需要寻找可能的匹配数据。我有 3 个可能存在也可能不存在的数据点。如果任何数据点匹配,我想重用现有节点。如果没有数据点匹配,我想创建一个新节点。

如果节点不存在,则创建节点是 MERGE 的确切用例。 MERGE 不允许 WHERE 子句,否则这将非常简单。由于我正在匹配数据点 a 或数据点 b 或数据点 c,我无法弄清楚如何使用 MERGE 作为它的所有属性。

这是无效的,但应该表达我的目标:

MERGE (n:TYPE)
WHERE n.propertyA = "A" OR n.propertyB = "B" OR n.propertyC = "C"
ON MATCH SET n.propertyA = "A", n.propertyB = "B", n.propertyC = "C"
ON CREATE SET n.timestamp = <now>, n.propertyA = "A", n.propertyB = "B", n.propertyC = "C"
RETURN n;

我在想我也许可以使用批处理或事务。由于我仍在学习 Cypher,因此我将不胜感激。

最佳答案

不确定您是否可以在单个语句中完成,我将关注此问题以查看是否有更优化的路线。
您可以分两次进行,第一个将查找并更新现有节点,第二个将查找并创建缺少的节点:

OPTIONAL MATCH (existing:TYPE) WHERE existing.propertyA = 'A' OR existing.propertyB = 'B' OR existing.propertyC = 'C'
WITH existing
WHERE existing IS NOT NULL SET existing.propertyA = 'A', existing.propertyB = 'B', existing.propertyC = 'C'
RETURN existing;

OPTIONAL MATCH (existing:TYPE) WHERE existing.propertyA = 'ZZ' OR existing.propertyB = 'ZZ' OR existing.propertyC = 'ZZ'
WITH existing
WHERE existing IS NULL MERGE (newNode:TYPE {propertyA: 'ZZ', propertyB: 'ZZ', propertyC: 'ZZ'})
RETURN newNode

但是,请注意,这不会保留现有值 - 例如如果您从一个源属性 A & B(并且 C 为空)加载,然后从第二个源加载并且 A 为空但 B & C 已设置,则更新语句将匹配节点,但会将 A 重置为空(当然,除非您确保更新仅设置非空值)。

关于neo4j - 合并语句以匹配多个属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33360208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com