Как склеить связанные списки в Cypher - PullRequest
0 голосов
/ 20 марта 2020

У меня есть связанный список 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)

Я создаю паблику c API Graphql для отслеживания контакта с делом COVID-19: https://github.com/mmmoli/contacttracing.app-graphql-api/blob/master/src/appConfigs/schema.ts#L55

Любая помощь будет потрясающей!

Вдохновение из сообщения Макса о мошенничестве: https://maxdemarzi.com/2019/08/19/finding-fraud/

??

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

Это когда вы впервые создаете базу данных (т.е. записи не были отсортированы для запуска) или эта запись появляется позже, и вы пытаетесь обновить / вставить новую запись? Если я правильно понимаю, вы хотите вставить узел в цепочке для журнала. Как насчет

EDIT : включено дополнительное ограничение, чтобы убедиться, что при сопоставлении цепочки найден один набор узлов, между которыми можно вставить новую запись

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)
0 голосов
/ 20 марта 2020

Я до сих пор придумал это:

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

Но это пока не работает.

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