【问题标题】:Neo4J RelationShips MERGE ONCREATE ONMATCHNeo4J RelationShips MERGE ONCREATE ONMATCH
【发布时间】:2016-03-01 17:41:06
【问题描述】:

在关系 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)

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

谢谢

【问题讨论】:

    标签: neo4j cypher oncreate relationships


    【解决方案1】:

    你只需要设置属性:

    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();
    

    【讨论】:

    • 太棒了!是否也可以在 MERGE 上设置 where 条件?仅在复杂条件下创建关系?
    • 我已经为您的后续问题添加了答案。但@NicoleWhite 的回答确实回答了你原来的问题。
    【解决方案2】:

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

    1. MERGE 不允许任何条件。如果无法匹配,它将始终创建指定的模式。
    2. 下面是一个示例,说明如何通过使用OPTIONAL MATCHFOREACH 作为解决方法来实现等效的“条件合并”。

      这个例子假装这是所需的伪逻辑:

      • 如果AskBy 关系不存在:

        • 如果 (make-believe) 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())
        

    【讨论】:

      猜你喜欢
      • 2011-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多