Spring Data Neo4j 5更新动态属性

时间:2018-05-03 07:31:53

标签: neo4j spring-data-neo4j neo4j-ogm dynamic-properties spring-data-neo4j-5

我有以下实体:

@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 :(得分:1)

您可以使用标准Map.remove方法从地图中删除条目:

properties.remove("key2");

此外,您不应该一遍又一遍地制作新的Map个对象,只需使用Map一个并更新它。

更新:那没有用。但是,您可以使用Cypher查询删除属性:

session.query("MATCH (v:Value) REMOVE v.`property.key2`", Collections.emptyMap());