2017-02-08 1 views
0

Я реализую приложение, которое использует базу данных диаграммы Neo4j.Являются ли описанные пользователем процедуры Neo4j лучшим способом реализации двусвязных списков в моей базе данных графа?

У меня есть требование реализовать двусвязные списки на моем графике. Выполнение этого в Cypher можно выполнить с помощью больших и сложных запросов. Я думаю, что лучший способ сделать это - реализовать функцию двойного связывания с помощью пользовательских процедур.

Имеет ли это смысл?

ответ

0

Во-первых, предостережение:

В 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) 
+0

Великий ответ, спасибо за указатель на Apoc, то есть именно то, что я искал. –

+0

Вопрос: Я не видел никаких методов добавления, удаления или вставки элементов в двусвязный список, доступные в apoc? –

+0

Связанный список здесь не является четко определенной «вещью» в Neo4j, это всего лишь компоновка узлов и отношений, которая просто является связанной структурой списков. Вам нужно будет создавать и повторно использовать запросы, которые вручную обрабатывают удаление и вставку узлов и соответственно изменяют отношения, и вам, вероятно, потребуется заблокировать задействованные узлы (вы можете сделать это, удалив несуществующее свойство на узлах для взаимодействия блокировка записи), если есть вероятность одновременных изменений. Из-за этой сложности на самом деле может быть хорошей идеей рассмотреть определенные пользователем процедуры. – InverseFalcon

Смежные вопросы