2013-03-25 2 views
1

Neo4j Uniquness на обновление уникального значения индекса

уникальностью = create_or_fail

прекрасно работает при создании нового узла, поскольку он бросает ответ 4xx, если дубликат ключа индекса/значение уже существует.

Однако, если узел уже существует и проиндексирован, а индексированное значение необходимо обновить, нет способа (который я знаю) обновить значение и сбой, если новое значение уже существует. Это связано с тем, что вызов Add Node to Index REST не генерирует ответ 4xx, если новое значение уже существует. насколько я могу видеть, что узел add to index даже не участвует в Uniqueness по индексам.

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

другое решение было бы добавить уникальности параметр в Add Node в индексный REST вызова http://docs.neo4j.org/chunked/1.9.M05/rest-api-indexes.html#rest-api-add-node-to-index

любые другие идеи по этому поводу?

благодаря

+0

Обычно уникальность параметры не обновляются. Какова ваша конкретная информация? Вы можете использовать семантику put-if-absent индекса rest-api, и если это удастся удалить старое значение для этого узла из индекса. –

+0

, если у вас есть уникальный указатель на адрес электронной почты пользователя, и пользователь, например, обновляет свой адрес. в этом случае вы не захотите создать новый пользовательский узел из-за того, что все существующие отношения должны быть воссозданы. Хорошо бы было иметь такой же параметр уникальности для вставки в индексный вызов. это вернет 200 успешных результатов и 4xx в конфликте. если это удастся, следующая команда в партии будет удалением из индекса. Поэтому, по вашему мнению, это не будет обновление. это вставка и удаление значения индекса и выполняется в пакетной транзакции. – KanTube

ответ

0

я случайно на этот вопрос, и вот что я выяснил для работы вокруг.

В процессе обновления выполните следующие действия в REST партии:

  1. Удалить все элементы индекса узла для требуемого индекса
  2. Создание нового узла с использованием CreateOrFail на желаемом индекса, за исключением вместо того, чтобы использовать ваш нормальные свойства просто использовать фиктивное свойство, например, DeleteMe=true
  3. Добавить узел к нужному указателю, потому что, если он получил это далеко предыдущий шаг удался свойство
  4. Update элементов узла
  5. Используйте Cypher заявление для удаления фиктивного узла Ex:

    START n=node:index_name(index_key={value}) WHERE (n.DeleteMe!)=true DELETE n

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