我正在尝试使用LINKMAP属性。
假设我们有Vertex PokemonMaster如下
PokemonMaster
{
name, (STRING)
age, (INTEGER)
pokemons, (LINKMAP) of Pokemon
}
包含口袋妖怪的LINKMAP
Pokemon
{
name, (STRING)
}
以下代码正在创建一个PokemonMaster,给他一些口袋妖怪:
Map<String, ODocument> pokemons = new HashMap<>();
ODocument pikachu = new ODocument("Pokemon");
pikachu.field("name", "Pikachu");
pikachu.save();
ODocument raichu = new ODocument("Pokemon");
raichu.field("name", "Raichu");
raichu.save();
pokemons.put("pikachu", pikachu);
pokemons.put("raichu", raichu);
graph.addVertex("class:PokemonMaster", "name", "Sacha", "age", "42", "pokemons", pokemons);
现在我们在数据库中得到的是:
{"pikachu":"#15:42","raichu":"#15:43"}
对于萨莎来说,#15:42和#15:43是皮卡丘和拉丘的冲突。
这是我的问题: 我无法将此Map映射到Java HashMap。
我的意思是,我希望能够做到这样的事情:
Vertex v = graph.getVertex(id); // getting the instance of Sacha
Map<String, ODocument> map = v.getProperty("pokemons");
System.out.println(map.get("pikachu").getIdentity());
System.out.println(map.get("raichu").getIdentity());
这是我的第一次尝试,然后我认为将ODocument作为值是没有意义的,因为它是存储在表中的id。 所以我试过了:
Vertex v = graph.getVertex(id); // getting the instance of Sacha
Map<String, String> map = v.getProperty("pokemons");
希望获得值中的id。 但没有任何效果,说出以下错误:
com.tinkerpop.blueprints.impls.orient.OrientElementIterable cannot be cast to java.util.Map
所以我尝试了OrientElementIterable,如下所示:
Vertex v = graph.getVertex(id); // getting the instance of Sacha
OrientElementIterable<Element> test = v.getProperty("pokemons");
for (Element elem : test) {
System.out.println(elem.getProperty("name"));
}
它实际上有效,打印我“Raichu”和“皮卡丘”。但这会将我的Map转换为一个简单的列表,而我正在丢失键/值功能。
我的问题是,有没有办法将LINKMAP属性转换为Java Map?
我知道这与EMBEDDEDMAP一起使用,但我希望它可以与LINKMAP一起使用
编辑:第一个解决方案
我为那些需要
的人找到了第一个解决方案可以将Vertex更改为ODocument,如:
ODocument doc = new ODocument(new ORecordId(v.getId().toString()));
然后我们可以轻松获得地图:
Map<String, ORecordId> map = doc.field("pokemons");
然后键包含口袋妖怪的名称,值代表他的实例的id。