Neo4j MERGE在代码中创建重复项,但不在控制台中创建重复项

Neo4j MERGE在代码中创建重复项,但不在控制台中创建重复项,neo4j,cypher,libneo4j-client,Neo4j,Cypher,Libneo4j Client,为了避免重复关系,我在Neo4j中使用了匹配和合并操作。我的程序执行以下操作:每当两个节点“接近”时,它就会创建从节点a到B的关系,反之亦然。我只需要这些关系中的一个,在程序中很难控制它,所以我用数据库来代替 假设节点3和81彼此相关。如果我跑 OPTIONAL MATCH (n:Node {id:3}), (m:Node {id:81}) MERGE (n)-[r:REL {relT: "SOR" , simT:2205}]->(m) 从控制台两次,第二个查询不做任何事情,这是预期的行

为了避免重复关系,我在Neo4j中使用了匹配和合并操作。我的程序执行以下操作:每当两个节点“接近”时,它就会创建从节点a到B的关系,反之亦然。我只需要这些关系中的一个,在程序中很难控制它,所以我用数据库来代替

假设节点3和81彼此相关。如果我跑

OPTIONAL MATCH (n:Node {id:3}), (m:Node {id:81})
MERGE (n)-[r:REL {relT: "SOR" , simT:2205}]->(m)
从控制台两次,第二个查询不做任何事情,这是预期的行为。但是,当我使用neo4j客户端记录这些关系时(如前所述,它发送两次查询),会创建两个关系。我认为这与我使用的客户机无关,因为合并显然是由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 ()));
std::vector vParams=
{node1Id,node2Id,relT,simT};
neo4j_结果\u流\u t*结果=
neo4j_跑步(
联系,,
“可选匹配(n:Node{id:{node1Id}),(m:Node{id:{node2Id})MERGE(n)-[r:REL{relT:{relT},simT:{simT}]->(m)”,
neo4j_图(vParams.data(),vParams.size());

这让我想知道一些事情。。。我要寄一份准备好的声明吗?合并与准备好的语句一起工作吗?据我所知,我没有发送任何准备好的语句,我只是绑定变量并发送整个查询。

我不确定这是否是问题的原因,但如果您希望确保两个节点之间只有一个关系实例(无论方向如何),
MERGE
子句应指定无方向关系模式

例如:

OPTIONAL MATCH (n:Node {id:3}), (m:Node {id:81})
MERGE (n)-[r:REL {relT: "SOR" , simT:2205}]-(m);

请注意,该模式没有指定关系方向。这会导致
MERGE
检查任一方向(而不是单个方向)的现有关系。

哪个版本的Neo4j?@InverseFalcon Neo4j版本是3.3.0请共享用于生成问题中的表输出的查询。