首页 > 解决方案 > Neo4j:如何在我的密码语句中实现 apoc.atomic.update?

问题描述

我有一个用于第一次导入的 Cypher 导入和new_neo_test_1.csv具有以下列的文件:FromToSender_Sub_FldDateTimeUrlFileHash

LOAD CSV WITH HEADERS FROM ("file:///sessions/new_neo_test_1.csv") AS row
MERGE (a:Sender { name: row.From, domain: row.Sender_Sub_Fld, datetime: datetime(row.DateTime) })
MERGE (b:Recipient { name: row.To, datetime: datetime(row.DateTime) })
WITH a,b,row
WHERE row.Url = "false" AND row.FileHash = "false"
CALL apoc.merge.relationship(a, row.Outcome2, {}, {datetime: datetime(row.DateTime)}, b, {}) YIELD rel as rel1
RETURN a,b

我的目标是对其余的导入使用类似以下的内容。datetime如果节点已经存在,我想更新关系属性。有点像最后一次看到的财产。

我尝试apoc.atomic.update了以下类似的变体,但似乎无法使其正常工作。

LOAD CSV WITH HEADERS FROM ("file:///sessions/new_neo_test_2.csv") AS row 
MERGE (a:Sender { name: row.From, domain: row.Sender_Sub_Fld, datetime: datetime(row.DateTime) }) 
MERGE (b:Recipient { name: row.To, datetime: datetime(row.DateTime) }) 
WITH a,b,row 
WHERE row.Url = "false" AND row.FileHash = "false" 
CALL apoc.merge.relationship(a, row.Outcome2, {}, {}, b) YIELD rel as rel1 
CALL apoc.atomic.update(rel1, datetime, datetime(row.DateTime)) YIELD datetime as newdatetime 
RETURN a,b

或者,如果有其他建议可以解决我的问题,我们将不胜感激。

标签: neo4jcypherneo4j-apoc

解决方案


MERGE您应该只使用在非首次导入的子句中唯一标识节点的值。否则,您可能会导致创建新节点。例如,您的MERGE子句应该省略datetime属性(因为它们的值可能会在导入文件之间发生变化)。每次之后MERGE,都可以使用SET更新了datetime

这可能对您有用:

LOAD CSV WITH HEADERS FROM ("file:///sessions/new_neo_test_2.csv") AS row
WITH row, datetime(row.DateTime) AS dt
MERGE (a:Sender {name: row.From, domain: row.Sender_Sub_Fld})
SET a.datetime = dt
MERGE (b:Recipient {name: row.To})
SET b.datetime = dt
WITH a, b, row, dt
WHERE row.Url = "false" AND row.FileHash = "false" 
CALL apoc.merge.relationship(a, row.Outcome2, {}, {}, b) YIELD rel
SET rel.datetime = dt
RETURN a, b

注意:没有明显需要 using apoc.atomic.update,所以这个查询不需要。


推荐阅读