Spring data neo4j @index (unique = true) не работает

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

@Property(name = "name")
@Index(unique = true)
private String usreName;

К вашему сведению, я использую версию сервера Neo4j: 3.3.6 (сообщество) с Spring Boot 2.
но если я сам создаю ограничение в браузере Neo4j, оно работает.

CREATE CONSTRAINT ON (user:User) ASSERT user.userName IS UNIQUE

Есть ли способ заставить Spring Data Neo4J создавать уникальные свойства, не создавая их самостоятельно в базе данных?

Я успешно интегрировал Liquigraph, который представляет собой инструмент, который выполняет журнал изменений .xml с командами Neo4j Cypher (тот, который вы используете "СОЗДАТЬ ОГРАНИЧЕНИЕ НА (пользователь: Пользователь) ASSERT user.userName IS UNIQUE"). Взгляните на мой ответ ниже и проголосуйте за него! Спасибо

Paolo De Dominicis 12.01.2021 18:45
2
1
1 617
4

Ответы 4

Причина

In Spring Data Neo4j 4, index management concerns were removed from the mapping framework entirely.

(от Управление индексами в Spring Data Neo4j)

Решение

@Autowired
private SessionFactory sessionFactory;

@PostConstruct
public void createIndexesAndConstraints() {
    Session session = sessionFactory.openSession();
    Result result = session.query("CREATE INDEX ON :User(userName)", Collections.EMPTY_MAP);
}

@HadiMohammadi На ваш первый вопрос: Neo4jOperations устарел и тем временем был удален. Приносим извинения за возможные неудобства. Выполните запрос построения индекса с помощью Neo4j session. Теперь это отражено в обновленном ответе.

ThirstForKnowledge 15.09.2018 01:47

@HadiMohammadi На второй вопрос: вы можете поместить фрагмент кода в произвольный класс, помеченный @Component. Во время запуска приложения Spring Boot компонент сканируется, и метод, аннотированный @PostConstruct, запускается один раз сразу после инициализации всех служб.

ThirstForKnowledge 15.09.2018 01:49

@HadiMohammadi На ваш третий вопрос: ответ дан в отдельном вопросе: StackOverflow: запуск-создание-индекса-на-когда-индекс-уже существует-в‌ -neo4j).

ThirstForKnowledge 28.09.2018 17:13

Спасибо @ThirstForKnowledg за ответ. Но у меня есть еще 3 вопроса:
1- Я использую Spring Boot 2, и я не вижу Neo4jOperations в моем пути к классам для его импорта.

2- Следует ли мне поместить это в свой узел сущности или в другой компонент?
3- Как насчет того, чтобы мое приложение было запущено два или более раз? Думаю, это вызовет исключение во второй или более раз.

Вам необходимо настроить автоматический менеджер индекса, если вы хотите, чтобы код приложения создавал ограничения. Вы можете найти наиболее подходящий вариант в документации: https://docs.spring.io/spring-data/neo4j/docs/current/reference/html/#reference:indexing:creation

Просто примечание по этой теме: подумайте об автоматическом создании индекса, например о поддержке DDL в Hibernate. Это помощник во время разработки. Вы не должны использовать assert и update в производственной среде, а только validate.

Вы можете настроить режим работы нашего автоиндексного менеджера через application.properties.

spring.data.neo4j.auto-index=validate # or
# spring.data.neo4j.auto-index=update
# spring.data.neo4j.auto-index=assert

Режим по умолчанию - none. Кроме того, применимо то, что говорит @meistermeier.

Кроме того, Neo4jOperations устарел в SDN 4 и был удален в SDN 5. Вместо этого используйте Session для операций "рядом" с базой данных.

@meistermeier @MichaelSimons К сожалению, активация автоиндексного менеджера в режиме update или assert у меня не работает ни через application.properties, ни через ogm.properties. Используя Neo4j 3.4.7, я не получаю никаких связанных предупреждений / информационных сообщений или исключений, индексы просто не создаются, несмотря на аннотации @NodeEntity и @Index(unique = true). Кажется, что запись свойства игнорируется. Выполнение CALL db.indexes(); и CALL db.constraints(); не дает результата.

ThirstForKnowledge 27.09.2018 23:54

Другие вопросы по теме