Применение уникальности отношений с Neo4j


Я использую Spring data neo4j 2.1.0.BUILD-SNAPSHOT и сервер Neo4j 1.6.1. У меня есть дружеские отношения между двумя пользовательскими узлами, и я хочу гарантировать, что только одно отношение будет создано для каждой пары user1, user2 (порядок не считается).

Общее предложение-проверить на уровне приложения, существует ли уже связь, прежде чем создавать другую, но я думаю, что это не позволяет избежать проблем параллелизма: ограничение должно управляться в базе данных уровень.

Лучшее решение, которое я могу придумать, это использовать аннотацию @Indexed с уникальным свойством, введенным в Neo4j 1.6, и создать уникальное ограничение на основе идентификаторов user1 и user2, что-то вроде

@Indexed(unique = true)
private String uniqueConstraint;
public String getUniqueConstraint(){
    if(user1.id > user2.id){
        return user1.id + "|" + user2.id;
    }
    return user2.id + "|" + user1.id;
}

Кстати, я знаю, что последний выпуск Spring data neo4j поддерживает эту проверку на узлах с Neo4jTemplate.getOrCreateNode (), но я не уверен, что он работает с отношениями. Однако API rest должен быть там. уникальное отношение

Итак, у меня есть два вопросы:

1 Есть ли лучшая альтернатива?

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

Спасибо

1 2

1 ответ:

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

Для этого он еще не использует поддержку уникальности в Neo4j.

И да, с REST-сервером этот подход может столкнуться с условиями параллелизма / гонки.

Встроенная версия поддерживает блокировку (например, на одном из 2 узлов - или обоих), а затем создает связь с этой блокировкой. место. Чтобы не было второй нити, делающей то же самое в одно и то же время.

Это может быть нормально, если вы сделаете это оптимистично. То есть проверять после создания и удалять потом. Вы также можете использовать REST-API напрямую для поддержки этого поведения. Мы, вероятно, добавим поддержку для этого SDN 2.1 не могли бы вы поднять вопрос (ссылка на этот пост) в http://spring.neo4j.org/issues ?