Spring 数据 Neo4j 5 更新动态属性
Spring Data Neo4j 5 update dynamic properties
我有以下实体:
@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
.[=22 的 属性 =]
如何正确更新动态属性以删除所有具有新 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 节点中删除属性。我做错了什么?
您可以使用标准 Map.remove
方法从地图中删除条目:
properties.remove("key2");
此外,您不应该一遍又一遍地创建新的 Map
对象,只需使用 Map
并更新它即可。
更新:那没有用。但是,您可以使用 Cypher 查询来删除 属性:
session.query("MATCH (v:Value) REMOVE v.`property.key2`", Collections.emptyMap());
我有以下实体:
@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
.[=22 的 属性 =]
如何正确更新动态属性以删除所有具有新 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 节点中删除属性。我做错了什么?
您可以使用标准 Map.remove
方法从地图中删除条目:
properties.remove("key2");
此外,您不应该一遍又一遍地创建新的 Map
对象,只需使用 Map
并更新它即可。
更新:那没有用。但是,您可以使用 Cypher 查询来删除 属性:
session.query("MATCH (v:Value) REMOVE v.`property.key2`", Collections.emptyMap());