gpt4 book ai didi

merge - Neo4j:MERGE 创建重复节点

转载 作者:行者123 更新时间:2023-12-04 10:24:48 25 4
gpt4 key购买 nike

我的数据库模型有用户和 MAC 地址。一个用户可以有多个MAC地址,但一个MAC只能属于一个用户。如果某个用户设置了他的 MAC,并且该 MAC 已经链接到另一个用户,则现有关系将被删除,并在新所有者和该 MAC 之间创建新关系。换句话说,MAC 在用户之间移动。

这是我用来分配 MAC 地址的 Cypher 查询的一个特定实例:

MATCH (new:User { Id: 2 })
MERGE (mac:MacAddress { Value: "D857EFEF1CF6" })
WITH new, mac
OPTIONAL MATCH ()-[oldr:MAC_ADDRESS]->(mac)
DELETE oldr
MERGE (new)-[:MAC_ADDRESS]->(mac)

该查询在我的测试中运行良好,但在生产中,由于某些奇怪的原因,它有时会创建重复的 MacAddress节点(以及用户与每个节点之间的新关系)。也就是说,一个特定的用户可以有多个 MacAddress具有相同的节点 Value .

我可以说它们是不同的节点,因为它们具有不同的节点 ID。我也确定 Value s 完全一样,因为我可以做 collect(distinct mac.Value)在它们上面,结果是一个包含一个元素的集合。上面的查询是代码中唯一创建 MacAddress 的查询节点。

我正在使用 Neo4j 2.1.2。这里发生了什么?

谢谢,

最佳答案

您确定这是您正在运行的全部查询吗? MERGE有一个非常常见的陷阱,它合并了您提供的所有内容。所以这是人们期望的:

neo4j-sh (?)$ MERGE (mac:MacAddress { Value: "D857EFEF1CF6" });
+-------------------+
| No data returned. |
+-------------------+
Nodes created: 1
Properties set: 1
Labels added: 1
1650 ms
neo4j-sh (?)$ MERGE (mac:MacAddress { Value: "D857EFEF1CF6" });
+--------------------------------------------+
| No data returned, and nothing was changed. |
+--------------------------------------------+
17 ms
neo4j-sh (?)$ match (mac:MacAddress { Value: "D857EFEF1CF6" }) return count(mac);
+------------+
| count(mac) |
+------------+
| 1 |
+------------+
1 row
200 ms

到现在为止还挺好。这就是我们所期望的。现在看这个:
neo4j-sh (?)$ MERGE (mac:MacAddress { Value: "D857EFEF1CF6" })-[r:foo]->(b:SomeNode {label: "Foo!"});
+-------------------+
| No data returned. |
+-------------------+
Nodes created: 2
Relationships created: 1
Properties set: 2
Labels added: 2
178 ms
neo4j-sh (?)$ match (mac:MacAddress { Value: "D857EFEF1CF6" }) return count(mac);
+------------+
| count(mac) |
+------------+
| 2 |
+------------+
1 row
2 ms

等等,WTF发生在这里?我们再次只指定了相同的 MAC 地址,为什么会创建重复项?

documentation on MERGE指定“MERGE 不会部分使用现有模式 — 它是全部或全部。如果需要部分匹配,这可以通过将一个模式拆分为多个 MERGE 子句来实现”。所以因为当我们运行这条路径时 MERGE整个路径尚不存在,它会在其中创建所有内容,包括重复的 mac 地址节点。

关于 MERGE 创建的重复节点的常见问题,100 次中有 99 次,这就是正在发生的事情。

关于merge - Neo4j:MERGE 创建重复节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26046640/

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