2

我在 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 是否适用于准备好的语句?据我所知,我没有发送任何准备好的语句,我只是绑定变量并发送整个查询。

4

1 回答 1

1

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

例如:

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

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

于 2018-01-25T18:57:01.393 回答