Neo4j:关系的第二次合并工作不正常

Neo4j:关系的第二次合并工作不正常,neo4j,cypher,Neo4j,Cypher,我正在处理电子邮件数据。我在Outcome2领域有两个结果,它们是失败到和失败到。第一个FAILED\u TO可以正常工作,如果出现失败事件,则会创建节点并更新或添加所有属性。但是TO部分不起作用。不创建新节点。这是后来在语句中创建的。这可能是一个简单的解决方案。任何帮助都将不胜感激。如果可能的话,我想避免apoc // NO ATTACHMENT OR LINK - FOLLOWING IMPORTS USING PERIODIC COMMIT 1000 LOAD CSV WITH HEADE

我正在处理电子邮件数据。我在
Outcome2
领域有两个结果,它们是
失败到
失败到
。第一个
FAILED\u TO
可以正常工作,如果出现失败事件,则会创建节点并更新或添加所有属性。但是
TO
部分不起作用。不创建新节点。这是后来在语句中创建的。这可能是一个简单的解决方案。任何帮助都将不胜感激。如果可能的话,我想避免apoc

// NO ATTACHMENT OR LINK - FOLLOWING IMPORTS
USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM ("file:///sessions/new_neo_test_3.csv") AS row
WITH row, datetime(row.DateTime) AS dt
MERGE (a:Sender {name: row.From, domain: row.Sender_Sub_Fld})
ON CREATE SET a.firstseen = dt
SET a.lastseen = dt
MERGE (b:Recipient {name: row.To})
ON CREATE SET b.firstseen = dt
SET b.lastseen = dt
WITH a, b, row, dt
WHERE row.Url = "false" AND row.FileHash = "false" AND row.Outcome2 = "FAILED_TO"
MERGE (a)-[rel1:FAILED_TO]->(b)
ON CREATE SET rel1.firstseen = dt
SET rel1.lastseen = dt
SET rel1.timesseen = coalesce(rel1.timesseen, 0) + 1
WITH a,b,row,dt,rel1
WHERE row.Url = "false" AND row.FileHash = "false" AND row.Outcome2 = "TO"
MERGE (a)-[rel2:TO]->(b)
ON CREATE SET rel2.firstseen = dt
SET rel2.lastseen = dt
SET rel2.timesseen = coalesce(rel2.timesseen, 0) + 1
return a,b

因为这两条线

WITH a, b, row, dt
WHERE row.Url = "false" AND row.FileHash = "false" AND row.Outcome2 = "FAILED_TO"
中的。。。而row.Outcome2=“FAILED\u TO
会删除
row.Outcome2=“TO”
所在的其他行

相反,您可以执行以下操作。当找到
失败
失败
失败
时,为每种情况创建一个
[1]
集合,而不是
WHERE row.outcome2
。然后,在
FOREACH
循环中使用该集合来创建该关系(如果相应的集合具有值)

因为
roe.Woutcome2
只能是一个值,或者是另一个值,所以实际上每行只能执行
FOREACH
子句中的一组语句

USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM ("file:///sessions/new_neo_test_3.csv") AS row
WITH row, datetime(row.DateTime) AS dt
MERGE (a:Sender {name: row.From, domain: row.Sender_Sub_Fld})
ON CREATE SET a.firstseen = dt
SET a.lastseen = dt
MERGE (b:Recipient {name: row.To})
ON CREATE SET b.firstseen = dt
SET b.lastseen = dt
WITH a, b, row, dt 
, CASE WHEN row.Outcome2 = 'FAILED_TO' THEN [1] ELSE [] END AS fail
, CASE WHEN row.Outcome2 = 'TO' THEN [1] ELSE [] END AS success
WHERE row.Url = "false" AND row.FileHash = "false"
FOREACH ( x in fail | 
  MERGE (a)-[rel1:FAILED_TO]->(b)
    ON CREATE SET rel1.firstseen = dt
  SET rel1.lastseen = dt
  SET rel1.timesseen = coalesce(rel1.timesseen, 0) + 1
)
FOREACH ( x in success | 
  MERGE (a)-[rel2:TO]->(b)
    ON CREATE SET rel2.firstseen = dt
  SET rel2.lastseen = dt
  SET rel2.timesseen = coalesce(rel2.timesseen, 0) + 1
)
RETURN a, b

这是一个极好的答案,适用于我的用例。你不知道有多少种方法可以让它发挥作用。谢谢。@Dave Bennett