Как объединить вместо создания с Neo4jTemplate

В настоящее время я перебираю массив, где каждый индекс содержит два узла и отношение (Part_1 -> Part_2), и я использую метод Neo4jTemplate.save() для сохранения его в базе данных. Однако некоторые индексы имеют повторяющиеся узлы, которые будут иметь отношения с другими узлами (Part_2 -> Part_3). Моя версия в настоящее время создает новый узел и связь каждый раз вместо слияния, если узел уже существует.

Я прочитал это сообщение , но я не понимаю, как это реализовать, чтобы два одинаковых узла имели одинаковый идентификатор. Мой текущий код работает так:

  1. Создайте два узла
  2. Создайте их отношения
  3. Добавить связь с узлом
  4. Сохраните его, используя Neo4jTemplate.save()

Что мне нужно изменить на MERGE вместо CREATE? Нужно ли мне выполнять проверку, прежде чем я буду сохраняться, или есть способ проверить, сохраняясь в SDN 4?

РЕДАКТИРОВАТЬ:

Я решил использовать метод Neo4jTemplate.query() для написания запросов Cyper, однако я не знаю, как правильно создать параметры для объединения нескольких узлов. Я могу правильно создать оператор MERGE для одного узла:

Map‹String, Object› params = new HashMap‹String, Object›();
Map‹String, Object› node = new HashMap‹String, Object›();

node.put("name", "Part_1");
params.put("props", node_1);
String query = "MERGE( n1:Part {name:{props}.name})" ;

template.query(запрос, параметры);

Моя цель — вызвать слияние на двух узлах, а затем снова вызвать слияние, чтобы создать отношение в одном выражении. Мой код сейчас выглядит так:

Map‹String, Object› params = new HashMap‹String, Object›();
List‹Map‹String, Object›› maps;
Map‹String, Object› node1 = new HashMap‹String, Object› ();
Map‹String, Object› node2 = new HashMap‹String, Object›();

node1.put("name1", "Part_1");
node2.put("name2", "Part_2");
maps = Arrays.asList(node_1, node_2)

params.put("props", maps);
String query = "MERGE( n1:Part {name:{props}.name1})
MERGE( n2:Part {name:{props}.name2)
MERGE(n1)-[:СОЗДАН]->(n2)";

template.query(запрос, параметры);

Все примеры, которые я видел до сих пор с несколькими узлами в параметрах просто просто перебирайте все это при вызове. Я не нашел примеров, в которых есть параметры, в которых вы можете указать определенный узел, на который вы ссылаетесь. Как создать параметр, в котором я ссылаюсь на определенный узел? Заранее спасибо!


person jlam1618    schedule 13.08.2015    source источник


Ответы (1)


Трудно предположить, что нужно изменить, не видя вашего кода, но похоже, что вы каждый раз сохраняете новые экземпляры сущности.

Объект, переданный Neo4jTemplate.save(entity), должен быть обновлен с помощью идентификатора после его записи в базу данных. SDN попытается обновить узлы, у которых уже есть идентификатор, поэтому я предлагаю повторно использовать экземпляры сущностей вместо создания новых.

Если вы не хотите самостоятельно управлять этими сущностями, вы можете попытаться загрузить сущности на шаге 1, а затем создать их только в том случае, если они еще не существуют.

person ATG    schedule 13.08.2015
comment
Проблема с загрузкой их всех сразу заключается в том, что мне придется отслеживать, что уже было создано, а что нет, а затем учитывать их отношения. Я хочу, чтобы neo4j выполнял всю эту работу, поскольку у него есть реализация (MERGE), которая может это сделать. Есть ли у вас предложения по моему новому подходу? Использовать Cypher для этого довольно просто, однако я изо всех сил пытался правильно создать параметры. - person jlam1618; 14.08.2015
comment
Извините за задержку ответа. У вас это уже работает? Если нет, я посмотрю на это для вас чуть позже. - person ATG; 18.08.2015
comment
Да, у меня все заработало. Мне потребовалось некоторое время, чтобы правильно отформатировать параметры, но сейчас я использую метод Neo4jTemplate.query() для сохранения своих данных. Однако, спасибо! - person jlam1618; 19.08.2015