Neo4j: второе слияние для отношений не работает должным образом - PullRequest
2 голосов
/ 13 января 2020

Я работаю с данными электронной почты. У меня есть 2 результата в поле Outcome2, и они FAILED_TO и TO. Первый FAILED_TO работает нормально, если произошел сбой события, когда узлы созданы и все свойства обновлены или добавлены. Но часть TO не работает. Новые узлы не создаются. Теперь это было создано позже в заявлении. Это может быть простым исправлением. Любая помощь будет принята с благодарностью. И я хотел бы избежать апо c, если это вообще возможно.

// 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

1 Ответ

2 голосов
/ 13 января 2020

Именно из-за этих двух строк

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...