Neo4j MERGE 在代码中创建重复项,但在控制台中不创建重复项
Neo4j MERGE creates duplicates in code but not in console
我在 Neo4j 中使用 MATCH 和 MERGE 操作以避免重复关系。我的程序执行以下操作:每当两个节点 "close" 时,它都会创建从节点 A 到 B 的关系,反之亦然。我只想要这些关系中的一个,而且很难在程序中控制它,所以我改用数据库。
假设节点 3 和 81 相互关联。如果我运行
OPTIONAL MATCH (n:Node {id:3}), (m:Node {id:81})
MERGE (n)-[r:REL {relT: "SOR" , simT:2205}]->(m)
从控制台两次,第二个查询没有执行任何操作,这是预期的行为。但是,当我使用 neo4j-client 记录这些关系时(如前所述,它发送查询两次),会创建两个关系。我认为这与我使用的客户端无关,因为 MERGE 显然是由 neo4j 解释的。我检查了创建的关系属性是否相等,但它们似乎相同(table 中的第一行和最后一行):
任何人都可以给我任何关于如何解决这个问题的提示吗?
编辑:
我在 C 代码中使用的代码是:
std::vector<neo4j_map_entry_t> vParams =
{ node1Id, node2Id, relT, simT };
neo4j_result_stream_t *results =
neo4j_run (
connection,
"OPTIONAL MATCH (n:Node {id: {node1Id}}), (m:Node {id: {node2Id}}) MERGE (n)-[r:REL {relT: {relT}, simT: {simT}}]->(m)",
neo4j_map (vParams.data (), vParams.size ()));
这让我想知道一些事情...我发送的是准备好的声明吗? MERGE 是否适用于准备好的语句?据我所知,我没有发送任何准备好的语句,我只是绑定变量并发送整个查询。
我不确定这是否是您问题的原因,但如果您想确保两个节点之间只有一个关系实例(无论方向性如何),您的 MERGE
子句应该指定无方向的关系模式。
例如:
OPTIONAL MATCH (n:Node {id:3}), (m:Node {id:81})
MERGE (n)-[r:REL {relT: "SOR" , simT:2205}]-(m);
请注意,该模式未指定关系方向。这会导致 MERGE
检查任一方向(而不是单一方向)的现有关系。
我在 Neo4j 中使用 MATCH 和 MERGE 操作以避免重复关系。我的程序执行以下操作:每当两个节点 "close" 时,它都会创建从节点 A 到 B 的关系,反之亦然。我只想要这些关系中的一个,而且很难在程序中控制它,所以我改用数据库。
假设节点 3 和 81 相互关联。如果我运行
OPTIONAL MATCH (n:Node {id:3}), (m:Node {id:81})
MERGE (n)-[r:REL {relT: "SOR" , simT:2205}]->(m)
从控制台两次,第二个查询没有执行任何操作,这是预期的行为。但是,当我使用 neo4j-client 记录这些关系时(如前所述,它发送查询两次),会创建两个关系。我认为这与我使用的客户端无关,因为 MERGE 显然是由 neo4j 解释的。我检查了创建的关系属性是否相等,但它们似乎相同(table 中的第一行和最后一行):
任何人都可以给我任何关于如何解决这个问题的提示吗?
编辑: 我在 C 代码中使用的代码是:
std::vector<neo4j_map_entry_t> vParams =
{ node1Id, node2Id, relT, simT };
neo4j_result_stream_t *results =
neo4j_run (
connection,
"OPTIONAL MATCH (n:Node {id: {node1Id}}), (m:Node {id: {node2Id}}) MERGE (n)-[r:REL {relT: {relT}, simT: {simT}}]->(m)",
neo4j_map (vParams.data (), vParams.size ()));
这让我想知道一些事情...我发送的是准备好的声明吗? MERGE 是否适用于准备好的语句?据我所知,我没有发送任何准备好的语句,我只是绑定变量并发送整个查询。
我不确定这是否是您问题的原因,但如果您想确保两个节点之间只有一个关系实例(无论方向性如何),您的 MERGE
子句应该指定无方向的关系模式。
例如:
OPTIONAL MATCH (n:Node {id:3}), (m:Node {id:81})
MERGE (n)-[r:REL {relT: "SOR" , simT:2205}]-(m);
请注意,该模式未指定关系方向。这会导致 MERGE
检查任一方向(而不是单一方向)的现有关系。