Neo4J Driver Node Merge/Creation - 是否有更简洁的方式来处理属性

Neo4J Driver Node Merge/Creation - is there a cleaner way to deal with properties

我目前正在使用 Neo 创建监控 API(目前使用 1.4.2 Java 驱动程序)。其中一部分涉及创建我自己的 MonitorNode/MonitorEdge 图(这些是我自己的 类),然后将它们与我的 Neo 实例同步。我的 MonitorNode 有一个 String/Object 我想同步的属性映射(加上我用作主查找键的 vertexId 和一个类型)。我可以制作一个 MERGE/SET cypher 命令,它几乎完全可以完成我需要它做的事情,但是因为我已经有了一个 string/object 地图,是否有一种更简洁的方式来表达 "here are the properties I want to set" 而不必为每个 属性?

指定一个 SET 命令

通过 Java 驱动程序更新数据的示例相对较少(我发现 - 请随意使用 link 任何资源),我觉得我可能遗漏了一些东西这里很容易。

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

谢谢,

戴夫

SET n += map 语法从 map.

更新 n 节点的属性

这应该有效:

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