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 正确答案的评论中的后续问题:
MERGE
不允许任何条件。如果无法匹配,它将始终创建指定的模式。
这是一个示例,说明如何使用 OPTIONAL MATCH
和 FOREACH
作为变通方法来实现 "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())
是否有解决方案来区分关系 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 正确答案的评论中的后续问题:
MERGE
不允许任何条件。如果无法匹配,它将始终创建指定的模式。这是一个示例,说明如何使用
OPTIONAL MATCH
和FOREACH
作为变通方法来实现 "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())