Neo4j 如何在Cypher中拼接链表

Neo4j 如何在Cypher中拼接链表,neo4j,cypher,neo4j-graphql-js,Neo4j,Cypher,Neo4j Graphql Js,我有一个日志条目的链接列表。每个条目都有一个日期。每个用户正好有一个日志 如果我收到过去的日期,最好的方法是什么来拼接新的日志条目 (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

我有一个
日志条目的链接列表
。每个条目都有一个日期。每个用户正好有一个日志

如果我收到过去的日期,最好的方法是什么来拼接新的日志条目

(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来跟踪新冠病毒-19病例的接触情况:

任何帮助都会很棒

从Max的欺诈帖子中得到的启示:


到目前为止,我已经想到了这一点:

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

但是它还没有完全起作用。

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

编辑:包含附加约束,以确保匹配的链找到一组要插入新条目的节点

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

谢谢@Marcus A。这不像我预期的那样有效。e2返回一个列表,并创建一组随机的:PREV_条目关系。使用可变长度搜索时,我忘记了过滤,因此它只返回包含新条目的e1和e2。编辑以检查e1是否晚于插入的条目。
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)