我通过java使用neo4j,我想知道是否有办法用该节点保存一些元数据。我希望能够让图中的节点包含更多信息,例如让每个节点都有一个与之关联的字典。
编辑 - 字典只是一个例子,我希望能够将类实例关联起来,例如字典中包含一个字段。
答案 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字符串存储在__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属性,则为标签。