Во-первых, предостережение:
В Neo4j, вдвойне связанный список не будет покупать вам много. Вы уже можете пересекать отношения в противоположном направлении, поэтому, если это чисто для обхода, это совсем не требуется, и вы не должны видеть улучшение производительности, если в вашей модели данных не участвуют особые случаи.
Если вам не нужно знать, как создать дважды связанный список, то смотрите ниже:
Вы, вероятно, хотите процедуры АПБО для этого, apoc.nodes.link() in the Creating Data section это процедура, которая занимает в коллекции узлов и позволяет вы создаете отношения между каждым из узлов в стиле связанных списков.
К сожалению, у APOC нет функции для изменения списка, поэтому вы можете снова запустить apoc.nodes.link(), поэтому вам придется следить за запросом для одних и тех же узлов, но в обратном порядке , или запрос для сопоставления на любых двух узлах, которые связаны и объединяются во втором отношении.
Пример на Фильмы график:
MATCH (m:Movie)
WITH m
ORDER BY m.released ASC
WITH COLLECT(m) as movies
CALL apoc.nodes.link(movies, 'Next')
MATCH (m:Movie)-[:Next]->(n:Movie)
MERGE (n)-[:Prev]->(m)
Великий ответ, спасибо за указатель на Apoc, то есть именно то, что я искал. –
Вопрос: Я не видел никаких методов добавления, удаления или вставки элементов в двусвязный список, доступные в apoc? –
Связанный список здесь не является четко определенной «вещью» в Neo4j, это всего лишь компоновка узлов и отношений, которая просто является связанной структурой списков. Вам нужно будет создавать и повторно использовать запросы, которые вручную обрабатывают удаление и вставку узлов и соответственно изменяют отношения, и вам, вероятно, потребуется заблокировать задействованные узлы (вы можете сделать это, удалив несуществующее свойство на узлах для взаимодействия блокировка записи), если есть вероятность одновременных изменений. Из-за этой сложности на самом деле может быть хорошей идеей рассмотреть определенные пользователем процедуры. – InverseFalcon