在Java HashMap中获取LINKMAP属性的内容

时间:2015-04-08 16:04:42

标签: java orientdb

我正在尝试使用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。

0 个答案:

没有答案