Neo4J RelationShips MERGE ONCREATE ONMATCH

Neo4J RelationShips MERGE ONCREATE ONMATCH

是否有解决方案来区分关系 MERGE 上的 ON CREATE 和 ON MATCH?

例如:

USING PERIODIC COMMIT 10000
LOAD CSV WITH HEADERS FROM 'http://ip/myfile.csv' AS row
MATCH (source:Ticket {Id: toInt(row.idticket)})
MATCH (target:User {Id: toInt(row.iduser)})
MERGE (source)-[rel:`AskBy` {}]->(target);

做这样的事情

USING PERIODIC COMMIT 10000
LOAD CSV WITH HEADERS FROM 'http://ip/myfile.csv' AS row
MATCH (source:Ticket {Id: toInt(row.idticket)})
MATCH (target:User {Id: toInt(row.iduser)})
MATCH (source)-[rel:`AskBy` {}]->(target);
ON CREATE SET (source)-[rel:`AskBy` {createDate: timespan()}]->(target)
ON MATCH SET (source)-[rel:`AskBy` {updateDate: timespan()}]->(target)

我想区分关系的创建日期和更新日期

谢谢

你只需要设置 属性:

MATCH (source:Ticket {Id: toInt(row.idticket)})
MATCH (target:User {Id: toInt(row.iduser)})
MERGE (source)-[rel:AskBy]->(target)
ON CREATE SET rel.createDate = timestamp()
ON MATCH SET rel.updateDate = timestamp();

回答您对@NicoleWhite 正确答案的评论中的后续问题:

  1. MERGE不允许任何条件。如果无法匹配,它将始终创建指定的模式。
  2. 这是一个示例,说明如何使用 OPTIONAL MATCHFOREACH 作为变通方法来实现 "conditional MERGE" 的等价物。

    此示例假装这是所需的伪逻辑:

    • 如果AskBy关系不存在:

      • 如果(假设)source.priority 值大于 10,则创建关系(与 createDate 属性)
      • 否则什么都不做
    • 否则设置其updateDate 属性.

      USING PERIODIC COMMIT 10000
      LOAD CSV WITH HEADERS FROM 'http://ip/myfile.csv' AS row
      MATCH (source:Ticket {Id: toInt(row.idticket)})
      MATCH (target:User {Id: toInt(row.iduser)})
      OPTIONAL MATCH (source)-[rel:AskBy]->(target)
      WITH source, rel, target,
        (CASE
          WHEN rel IS NULL AND source.priority > 10 THEN {create: [1]}
          WHEN rel IS NULL THEN NULL
          ELSE {set: [1]}
        END) AS todo
      FOREACH (x IN todo.create | CREATE (source)-[rel:AskBy {createDate: timestamp()}]->(target))
      FOREACH (x IN todo.set | SET rel.updateDate = timestamp())