Spring Data Neo4j 5 обновляет динамические свойства - PullRequest
0 голосов
/ 03 мая 2018

У меня есть следующая сущность:

@NodeEntity
public class Value {

    @Properties(prefix = "property", allowCast = true)
    private Map<String, Object> properties;

}

Я добавил следующие свойства:

Map<String, Object> properties1 = new HashMap<>();
properties.put("key1", "one");
properties.put("key2", "two");

value.setProperties(properties1);

Прямо сейчас на уровне базы данных у меня есть узел Value с двумя свойствами:

property.key1 = "one"
property.key2 = "two"

Теперь я хотел бы обновить свойства этого узла Value. Для этого я создал другие свойства:

Map<String, Object> properties2 = new HashMap<>();
properties.put("key1", "three");

После обновления узла на уровне базы данных у меня есть следующие свойства:

property.key1 = "three"
property.key2 = "two"

Как вы можете видеть, следующий подход корректно обновил свойство с key1, но не удаляет свойство с key2.

Как правильно обновить динамические свойства, чтобы удалить все свойства с ключами, отсутствующими в новой properties2 HashMap?

ОБНОВЛЕНО

Как предлагается в ответе ниже, я использую следующий код для повторного использования тех же свойств из узла Value:

Map<String, Object> oldProperties = value.getProperties();
Map<String, Object> newProperties = extractProperties(properties);

mergeMaps(newProperties, oldProperties);

protected void mergeMaps(Map<String, Object> sourceMap, Map<String, Object> destinationMap) {
    Iterator<Map.Entry<String, Object>> iterator = destinationMap.entrySet().iterator();
    while (iterator.hasNext()) {
        Map.Entry<String, Object> entry = iterator.next();
        String key = entry.getKey();
        Object value = sourceMap.get(key);
        if (value == null) {
            iterator.remove();
        } else {
            entry.setValue(value);
        }
    }
}

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

1 Ответ

0 голосов
/ 03 мая 2018

Вы можете использовать стандартный метод Map.remove, чтобы удалить запись с карты:

properties.remove("key2");

Кроме того, вы не должны создавать новые Map объекты снова и снова, просто используйте один Map и обновите его.

ОБНОВЛЕНИЕ: Это не сработало. Но вы можете использовать запрос Cypher для удаления свойства:

session.query("MATCH (v:Value) REMOVE v.`property.key2`", Collections.emptyMap());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...