我目前正在玩Neo来创建监控API(目前正在使用1.4.2 Java驱动程序)。部分原因是创建我自己的MonitorNode / MonitorEdge图形(这些是我自己的类),然后将它们与我的Neo实例同步。我的MonitorNode有一个我想要同步的属性的String / Object映射(加上我用作主查找键的vertexId和一个类型)。我可以制作一个MERGE / SET cypher命令,它完全可以完成我需要它做的事情,但是因为我已经有了一个字符串/对象图,所以有一个更简洁的方式来说“这里是我要设置的属性”而没有为每个属性指定一个SET命令?
通过Java驱动程序更新数据的例子相对较少(我发现 - 请随时链接任何资源),我觉得我可能会在这里找不到容易的东西。
private void syncNode(MonitorNode node) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("vertexId", node.getVertexId());
StringBuilder builder = new StringBuilder();
builder.append("MERGE(n:" + node.getType() + " {vertexId: {vertexId}})");
if (node.getProperties() != null) {
for (Entry<String, Object> e : node.getProperties().entrySet()) {
builder.append(" SET n." + e.getKey() + " = {" + e.getKey() + "}");
params.put(e.getKey(), e.getValue());
}
}
Session session = driver.session();
session.run(builder.toString(), params);
}
谢谢,
戴夫
答案 0 :(得分:0)
SET n += map
语法从n
更新map
节点的属性。
这应该有效:
static final Map<String, Object> EMPTY_MAP = new HashMap<String, Object>();
private void syncNode(MonitorNode node) {
Map<String, Object> props = node.getProperties();
Map<String, Object> params = new HashMap<String, Object>();
params.put("vertexId", node.getVertexId());
params.put("props", props == null ? EMPTY_MAP : props);
StringBuilder builder = new StringBuilder();
builder.append("MERGE(n:" + node.getType() + " {vertexId: $vertexId})");
builder.append(" SET n += $props");
Session session = driver.session();
session.run(builder.toString(), params);
}