2016-03-01 37 views
-1

有关于MERGE关系的ON CREATE和ON MATCH的解决方案吗?Neo4J RelationShips MERGE ONCREATE ONMATCH

例如:

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) 

我想不同的创建日期和关系的更新日期

感谢

回答

0

你只需要设置属性:

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

太棒了!是否有可能在MERGE上创造条件?只为复杂条件创造关系? – Amos

+0

我已为您的后续问题添加了答案。但@ NicoleWhite的答案确实回答了你原来的问题。 – cybersam

0

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

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

    此示例假装,这是所希望的伪逻辑:

    • 如果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()) 
      
+0

谢谢!!!!!!!!!!!!!!!!! – Amos