使用java

时间:2015-09-28 08:16:30

标签: java neo4j

我通过java使用neo4j,我想知道是否有办法用该节点保存一些元数据。我希望能够让图中的节点包含更多信息,例如让每个节点都有一个与之关联的字典。

编辑 - 字典只是一个例子,我希望能够将类实例关联起来,例如字典中包含一个字段。

2 个答案:

答案 0 :(得分:0)

不幸的是,Neo4j中没有这样的功能 Neo4j是简单的属性图 但是你可以模仿"通过在您的应用程序中使用约定来实现此类行为。

特殊属性

您可以在应用程序中指定以__开头的所有属性都是元数据。

然后存储元数据是微不足道的:

try (Transaction tx = db.beginTx()) {
    Node node = db.createNode();
    node.setProperty("__version", "1.0.0");
    node.setProperty("__author", "Dmitry");
    tx.success();
}

JSON元数据

其他方式 - 将JSON字符串存储在__metadata属性中,并将所有元数据指定为JSON。

示例:

ObjectMapper mapper = new ObjectMapper(); 

// create node and set metadata
try (Transaction tx = db.beginTx()) {
    Map<String, Object> metadata = new HashMap<>();
    metadata.put("version", "1.0.0");
    metadata.put("author", "Dmitry");

    Node node = db.createNode();
    node.setProperty("__metadata", mapper.writeValueAsString(metadata));

    tx.success();
}

// find node and get metadata
try (Transaction tx = db.beginTx()) {
    Node node = db.findNode(...);

    Map<String, Object> metadata = map = mapper.readValue(
        node.getProperty("__metadata"), HashMap.class);

    tx.success();
}

注意:如果你使用这个选项,那么你应该为Node创建一些包装器/帮助器,以最大限度地减少代码重复。
注2: ObjectMapper每个应用只能创建一次。

答案 1 :(得分:0)

除了另一个答案,您可以轻松创建一个代表您的类并保存类级元信息的单独节点。

使用关系将表示实例的所有节点连接到类节点(如果同时添加大量实例,这可能会导致锁争用)或使用命名约定:

  • 实例节点:(:Person{name:'Danny'})
  • 人的元节点:(:Meta{clazz:'Person', metaProp1: value1, ...})

如果实例节点链接到元节点的clazz属性,则为标签。