Именно из-за этих двух строк
WITH a, b, row, dt
WHERE row.Url = "false" AND row.FileHash = "false" AND row.Outcome2 = "FAILED_TO"
WHERE ... AND row.Outcome2 = "FAILED_TO
буквально удаляет другие строки, где row.Outcome2 = "TO"
.
Вместо этого вы можете сделать что-то вроде следующего. Вместо WHERE row.outcome2
создайте коллекцию [1]
для каждого случая, когда найдены либо FAILED_TO
, либо TO
. Затем, позже, используйте это в FOREACH
l oop, чтобы создать это отношение, если соответствующая коллекция имеет значение.
Поскольку 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