代码之家  ›  专栏  ›  技术社区  ›  alexanoid

弹簧数据Neo4j 5更新动态特性

  •  1
  • alexanoid  · 技术社区  · 6 年前

    我拥有以下实体:

    @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"
    

    现在,我想更新此的属性 价值 节点。为此,我创建了其他属性:

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

    在数据库级别更新节点后,我具有以下属性:

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

    如您所见,以下方法使用 key1 但不移除具有 key2 .

    如何正确更新动态特性,以删除所有具有新 properties2 HashMap?

    已更新

    正如下面的答案所建议的,我使用以下代码以重用值节点中的相同属性:

    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 回复  |  直到 6 年前
        1
  •  1
  •   cmosher01    6 年前

    您可以使用标准 Map.remove 从映射中删除条目的方法:

    properties.remove("key2");
    

    此外,您不应该制作新的 Map 对象反复出现,只需使用 地图 并更新它。

    更新:这不起作用。但是,您可以使用密码查询删除属性:

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