0

我有一个LogEntries. 每个条目都有一个日期。每个用户恰好有 1 个日志。

如果我收到过去的日期,拼接新日志条目的最佳方式是什么?

(log:Log)
(e1:LogEntry {date: Date('2020-03-19')})
(e2:LogEntry {date: Date('2020-03-17')})
…

CREATE (log)-[:PREV_ENTRY]->(e1)
CREATE (e1)-[:PREV_ENTRY]->(e2)
CREATE (e2)-[:PREV_ENTRY]->(e3)
CREATE (e3)-[:PREV_ENTRY]->(e4)

我正在构建一个公共 graphql API 来跟踪 COVID-19 病例的联系: https ://github.com/mmmmoli/contacttracing.app-graphql-api/blob/master/src/appConfigs/schema.ts#L55

任何帮助都是极好的!

来自 Max 的欺诈帖子的灵感: https ://maxdemarzi.com/2019/08/19/finding-fraud/

4

2 回答 2

0

到目前为止,我已经想出了这个:

MATCH p=(log:Log {id: "log1"})-[:PREV_ENTRY*]->(e:LogEntry)
FOREACH (rel IN relationships(p) | 
  DELETE rel
)
WITH e, log
ORDER BY e.id DESC
WITH collect(e) AS entries, log, e
CALL apoc.nodes.link(entries, 'PREV_ENTRY')
WITH apoc.agg.first(e) AS latest, log
CREATE (log)-[:PREV_ENTRY]->(latest)
RETURN latest

但它还没有完全奏效。

于 2020-03-20T09:14:16.823 回答
0

这是您第一次创建数据库时(即条目未排序开始)还是该条目稍后出现并且您尝试使用新条目更新/插入?如果我理解正确,您想在日志链中插入一个节点。怎么样

编辑:包括附加约束以确保匹配链找到一组节点,在这些节点之间插入新条目

CREATE (eInsert:LogEntry:NewEntry {date: Date('2020-03-18')})
WITH eInsert

MATCH (log:Log {id: "log1"})
WITH log, eInsert

MATCH (log)-[:PREV_ENTRY*]->(e1)-[oldLink:PREV_ENTRY]->(e2:LogEntry)
WHERE e2.date < eInsert.date
  AND e1.date >= eInsert.date 
WITH e1, e2, eInsert, oldLink

CREATE (e1)-[:PREV_ENTRY]->(eInsert)-[:PREV_ENTRY]->(e2)
DELETE oldLink

那应该可以,但是为了完整起见,这是我用来创建示例链的脚本

CREATE (log:Log {id: 'log1'})
CREATE (e1:LogEntry {date: Date('2020-03-30')})
CREATE (e2:LogEntry {date: Date('2020-03-28')})
CREATE (e3:LogEntry {date: Date('2020-03-23')})
CREATE (e4:LogEntry {date: Date('2020-03-17')})
CREATE (e5:LogEntry {date: Date('2020-03-09')})

CREATE (log)-[:PREV_ENTRY]->(e1)
CREATE (e1)-[:PREV_ENTRY]->(e2)
CREATE (e2)-[:PREV_ENTRY]->(e3)
CREATE (e3)-[:PREV_ENTRY]->(e4)
CREATE (e4)-[:PREV_ENTRY]->(e5)
于 2020-03-20T20:07:22.487 回答