Neo4j 在使用 apoc.merge.relationship() 时将 属性 添加到关系中

Neo4j add property to relationship when using apoc.merge.relationship()

我有以下导入:

// NO ATTACHMENT OR LINK
USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM ("file:///sessions/Hourly_Parsed/2019-12-10_00_hourly_parsed_mail_logs.csv") AS row
MERGE (a:Sender { name: row.From, domain: row.Sender_Sub_Fld, datetime: datetime(replace(row.DateTime, ' ', 'T'))})
MERGE (b:Recipient { name: row.To, datetime: datetime(replace(row.DateTime, ' ', 'T'))})
WITH a,b,row
WHERE row.Url = "false" AND row.FileHash = "false"
CALL apoc.merge.relationship(a, row.Outcome2, {}, {}, b) YIELD rel as rel1
RETURN a,b

如您所见,我已将日期时间 属性 添加到 SenderRecipient 节点。我想将此 属性 添加到关系中。我 运行 遇到的问题是我的 属性 是使用 apoc.merge.relationship() 创建的,因此我可以根据行列中的结果创建名称。

我可以在 CALL 部分下方添加一些内容以将 datetime: datetime(replace(row.DateTime, ' ', 'T')) 作为 属性 添加到关系中吗?

您可以在同一 apoc.merge.relationship 调用中向关系添加属性。这是该 apoc 调用的签名:

apoc.merge.relationship(startNode :: NODE?, relationshipType :: STRING?, identProps :: MAP?, props :: MAP?, endNode :: NODE?, onMatchProps = {} :: MAP?) :: (rel :: RELATIONSHIP?)

所以这应该适合你:

CALL apoc.merge.relationship(a, row.Outcome2, {}, {datetime:datetime(replace(row.DateTime, ' ', 'T'))}, b, {})

请记住,只有在创建新边时才会添加 datatime 属性。如果您在 apoc.merge.relationship 的最后一个参数中设置 属性,那么 属性 将添加到 MATCH。如果要在 MERGEMATCH 部分包含 属性,可以在 apoc.merge.relationship 的第 3 个参数中设置它。例如,如果您 运行

CALL apoc.merge.relationship(a, "CONNECTS_TO", {time: "today"}, {}, b, {})
CALL apoc.merge.relationship(a, "CONNECTS_TO", {time: "tomorrow"}, {}, b, {})

你最终会在 ab 之间得到两条 CONNECTS_TO 边,一条是 time: "today",一条是 time:"tomorrow"。但是,如果您 运行 以下

CALL apoc.merge.relationship(a, "CONNECTS_TO", {}, {time: "today"}, b, {})
CALL apoc.merge.relationship(a, "CONNECTS_TO", {}, {time: "tomorrow"}, b, {})

您最终将只有一个 CONNECTS_TO 边,其 time: "today" 作为其 属性。