Neo4J驱动程序节点合并/创建 - 有一种更清晰的方式来处理属性

时间:2017-08-16 15:20:46

标签: neo4j neo4j-java-api

我目前正在玩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);
}

谢谢,

戴夫

1 个答案:

答案 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);
}