【问题标题】:Spring Data Neo4j 5 update dynamic propertiesSpring Data Neo4j 5 更新动态属性
【发布时间】:2018-10-13 10:19:15
【问题描述】:

我有以下实体:

@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 节点中删除属性。我做错了什么?

【问题讨论】:

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


    【解决方案1】:

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

    properties.remove("key2");
    

    另外,您不应该一遍又一遍地创建新的 Map 对象,只需使用 Map 并更新它。

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

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

    【讨论】:

    • 我已经用试图合并现有值属性而不是创建新属性的代码更新了我的问题。但它仍然没有相同的结果。
    • 我遇到了同样的问题。无论我做什么,我都无法从节点中删除属性。即使在浏览器中使用 Cypher 也不适合我: MATCH (v:Value) REMOVE v.key2 RETURN v;仍然显示 key2 属性。
    • 我终于能够使用 Cypher 查询删除该属性。它需要在属性名称周围加上反引号:session.query("MATCH (v:Value) REMOVE v.`property.key2`", Collections.emptyMap());
    • 谢谢!我也在考虑通过额外的 Cypher 查询删除这些属性,但仍然想知道这是唯一的方法,还是可以由 SDN/OGM 和开箱即用的动态属性功能自动管理?
    • 从我们的测试来看,似乎可以确认 OGM 不允许您删除属性。可能值得将其作为功能请求/错误报告提交给 neo4j。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多