Noe4j: Как вы обрабатываете свойства первого и последнего просмотра при импорте, если не в первом операторе импорта? - PullRequest
0 голосов
/ 09 января 2020

Итак, я работаю с данными электронной почты. Мне было предложено добавить свойство количества раз, замеченное для отношений между узлами, и второе требование добавить первое увиденное и последнее увиденное к каждому отношению и каждому узлу, кроме получателя (данные являются внешними по отношению к внутренним, поэтому получателю не требуется первый или последний увиденный).

Итак, я начал работать со следующим импортом. Это выглядит нормально для NO ATTACHMENT OR LINK, если отправитель находится в первом импорте, но если отправитель не в первом импорте, часть first and last seen испорчена, потому что начальный набор находится в первом импорте.

// NO ATTACHMENT OR LINK - FIRST IMPORT
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, last_seen: datetime(row.DateTime) })
SET a.first_seen = coalesce(a.last_seen)
MERGE (b:Recipient { name: row.To, last_seen: datetime(row.DateTime) })
SET b.first_seen = coalesce(a.last_seen)
WITH a,b,row
WHERE row.Url = "false" AND row.FileHash = "false"
CALL apoc.merge.relationship(a, row.Outcome2, {}, {last_seen: datetime(row.DateTime)}, b, {}) YIELD rel as rel1
SET rel1.first_seen = coalesce(rel1.last_seen)
SET rel1.times_seen = coalesce(rel1.times_seen, 0) + 1
RETURN a,b

// NO ATTACHMENT OR LINK - REST OF IMPORTS
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.last_seen = dt
MERGE (b:Recipient {name: row.To})
SET b.last_seen = 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.last_seen = dt
SET rel.times_seen = coalesce(rel.times_seen, 0) + 1
RETURN a, b

В любом случае, для способа импорта этих данных есть лучший способ сделать это, чтобы мне не пришлось разбивать данные на первоначальный импорт и последующий импорт с другим оператором импорта. , И как мне обращаться со свойствами first seen и last seen, если я go об этом так.

Ответы [ 2 ]

1 голос
/ 09 января 2020

Этот лог c должен работать как для первого, так и для не первого прохода:

LOAD CSV WITH HEADERS FROM "file:///sessions/new_neo_test_1.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.first_seen = dt
SET a.last_seen = dt
MERGE (b:Recipient {name: row.To})
ON CREATE SET b.first_seen = dt
SET b.last_seen = 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.first_seen = COALESCE(rel.first_seen, dt)
SET rel.last_seen = dt
SET rel.times_seen = COALESCE(rel.times_seen, 0) + 1
RETURN a, b

Вам просто нужно использовать соответствующий путь к файлу, который, вероятно, должен быть передан как параметр вместо жесткого кодирования, как показано здесь.

После предложения MERGE необязательное предложение ON CREATE выполняется только в том случае, если MERGE что-то создало.

Кроме того, вы никогда не должны указывать изменяемые свойства (например, last_seen) в шаблоне MERGE, так как это приведет к созданию нового узла, если изменяемое свойство имеет новое значение.

0 голосов
/ 09 января 2020

В этом сценарии, вероятно, имеет смысл разделить нагрузку на данные и разделить фазы создания узлов, а затем объединить их, то есть:

  • Первый проход - MERGE Отправители и Получатели от всех ваших CSV
  • Второй проход - сопоставьте Отправителей и Получателей, а затем присоединитесь к отношениям, основанным на желаемых логиках c

Как вы знаете, что Отправители и Получатели уже там, когда вы добавляете отношения после

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...