我在 Neo4j 中使用 MATCH 和 MERGE 操作以避免重复关系。我的程序执行以下操作:每当两个节点“关闭”时,它都会创建从节点 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 解释的。我检查了创建的关系属性是否相等,但它们似乎相同(表中的第一行和最后一行):
任何人都可以给我有关如何解决此问题的任何提示?
编辑: 我在 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 是否适用于准备好的语句?据我所知,我没有发送任何准备好的语句,我只是绑定变量并发送整个查询。