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

弹簧数据Neo4j 5更新动态特性,neo4j,spring-data-neo4j,neo4j-ogm,dynamic-properties,spring-data-neo4j-5,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<>(); proper

我拥有以下实体:

@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);
property.key1 = "one"
property.key2 = "two"
Map<String, Object> properties2 = new HashMap<>();
properties.put("key1", "three");
property.key1 = "three"
property.key2 = "two"
如您所见,以下方法使用
key1
正确更新了属性,但没有使用
key2
删除属性

如何正确地更新动态属性,以便删除新的
属性2
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);
        }
    }
}
Map oldProperties=value.getProperties();
映射新属性=提取属性(属性);
合并地图(新属性、旧属性);
受保护的void合并映射(映射源映射、映射目标映射){
迭代器迭代器=destinationMap.entrySet().Iterator();
while(iterator.hasNext()){
Map.Entry=iterator.next();
String key=entry.getKey();
对象值=sourceMap.get(键);
如果(值==null){
iterator.remove();
}否则{
entry.setValue(值);
}
}
}

但是它仍然不能以与前面相同的结果工作-它仍然不能通过移除的键从Neo4j节点移除属性。我做错了什么?

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

properties.remove("key2");
此外,您不应该一次又一次地创建新的
Map
对象,只需使用一个
Map
并对其进行更新即可

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

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

我用代码更新了我的问题,该代码试图合并现有的值属性,而不是创建一个新的值属性。但结果还是不一样,我也有同样的问题。无论我做什么,我都无法从节点中删除属性。甚至在浏览器中使用密码对我也不起作用:匹配(v:Value)删除v.key2返回v;仍然显示key2属性。我终于能够使用密码查询删除该属性。它需要在属性名称周围加上反勾号:
session.query(“匹配(v:Value)删除v.`property.key2`”,Collections.emptyMap())谢谢!我也在考虑通过额外的密码查询删除这些属性,但仍然想知道这是唯一的方法,还是可以由SDN/OGM和动态属性功能自动管理?从我们的测试中,似乎可以确认OGM不允许您删除属性。可能值得将其作为功能请求/错误报告提交给neo4j。