Noe4j:当不在第一个 import 语句中时,你如何处理 import 中的 first seen 和 last seen 属性?
Noe4j: How do you handle first seen and last seen properties on import when not in first import statement?
所以我正在处理电子邮件数据。我被要求为节点之间的关系添加一个 属性 的次数计数,第二个要求是为每个关系和每个节点添加第一次看到和最后一次看到,但接收者(数据是外部到内部的,所以收件人不需要第一次或最后一次看到)。
所以我开始使用以下导入。如果发件人在第一次导入中,这似乎对 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
属性。
在这种情况下,拆分数据负载并分离创建节点然后将它们连接起来的阶段可能很有意义,即:
- 第一步 - 合并所有 CSV 中的发件人和收件人
- 第二遍 - 匹配发送方和接收方,然后根据所需逻辑加入关系
像这样,当您在
之后添加关系时,您知道发送者和接收者已经存在
此逻辑应该适用于第一遍和非第一遍:
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
您只需要使用适当的文件路径,它可能应该作为 parameter 传递而不是硬编码,如此处所示。
在 MERGE clause, the optional ON CREATE 子句之后,仅当 MERGE
创建了某些内容时才会执行。
此外,你永远不应该在 MERGE
模式中指定可变属性(如 last_seen
),因为如果可变 属性 具有一个新值。
所以我正在处理电子邮件数据。我被要求为节点之间的关系添加一个 属性 的次数计数,第二个要求是为每个关系和每个节点添加第一次看到和最后一次看到,但接收者(数据是外部到内部的,所以收件人不需要第一次或最后一次看到)。
所以我开始使用以下导入。如果发件人在第一次导入中,这似乎对 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
属性。
在这种情况下,拆分数据负载并分离创建节点然后将它们连接起来的阶段可能很有意义,即:
- 第一步 - 合并所有 CSV 中的发件人和收件人
- 第二遍 - 匹配发送方和接收方,然后根据所需逻辑加入关系
像这样,当您在
之后添加关系时,您知道发送者和接收者已经存在此逻辑应该适用于第一遍和非第一遍:
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
您只需要使用适当的文件路径,它可能应该作为 parameter 传递而不是硬编码,如此处所示。
在 MERGE clause, the optional ON CREATE 子句之后,仅当 MERGE
创建了某些内容时才会执行。
此外,你永远不应该在 MERGE
模式中指定可变属性(如 last_seen
),因为如果可变 属性 具有一个新值。