0

所以我正在处理电子邮件数据。我被要求为节点之间的关系添加一个 count 属性,第二个要求是为每个关系和每个节点添加第一次看到和最后一次看到,但接收者除外(数据在内部,因此接收者不需要第一次或最后一次看到)。

所以我开始使用以下导入。如果发件人在第一次导入中,这似乎可以正常工作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 seenand属性。last seen

4

2 回答 2

1

此逻辑应适用于首次和非首次通过:

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,因为如果可变属性具有新值,那只会导致创建新节点。

于 2020-01-09T19:40:03.540 回答
0

在这种情况下,拆分数据负载,分离创建节点的阶段,然后将它们连接起来可能会很有意义,即:

  • 第一遍 - 合并所有 CSV 中的发件人和收件人
  • 第二遍 - 匹配发送者和接收者,然后根据所需逻辑加入关系

像这样,您知道在添加关系之后发送者和接收者已经存在

于 2020-01-09T19:25:17.153 回答