获取NoFastSuchElementException,当我在java中使用gremlin查询中的valueMap()时

时间:2017-05-17 19:50:54

标签: java cassandra titan gremlin tinkerpop3

GraphTraversal<Vertex, Map<String, Object>> tsList = traversalSource.V().has("request","id_key",114).valueMap();        
while(tsList.hasNext())
{
System.out.println(tsList.next().get("status")); //prints result
System.out.println(tsList.next().get("tree_id_key")); //prints result
System.out.println(tsList.next().get("username")); //here throws Exception for any vertex.
System.out.println(tsList.next().get("tree_status"));
}

当我运行上面的查询时,我得到任何第一个和第二个propertyKey的值。但在得到两个Keys的答案后,它会为任何propertyKey抛出NoFastSuchElementException ...请帮助我..我可以解决这个问题吗?

但使用以下查询我可以得到答案:

GraphTraversal<Vertex, Map<String, Object>> tsList = traversalSource.V().has("request","id_key",114).values("status","tree_id_key","username","tree_status");       
while(tsList.hasNext())
{
System.out.println(tsList.next());//prints "status" value
System.out.println(tsList.next());//prints "tree_id_key" value
System.out.println(tsList.next());//prints "username" value
System.out.println(tsList.next());//prints "tree_status" value
}

更新

GraphTraversal<Vertex, Map<String, Object>> ts = traversalSource.V().has("request","id_key",113).valueMap();        
while(ts.hasNext())
{
Map<String, Object> tsList=ts.next();
SuiteIdKey=(long)((ArrayList)tsList.get("suiteKey")).get(0);
seqe=(int)((ArrayList)tsList.get("sequence")).get(0);
}

在上面的查询中,ts将返回许多行,对于每一行,我将获得suiteIdkey,seqe ..我能够得到答案。但tsList是Map&lt;&gt;,当我使用像=(long)tsList.get(&#34; suiteKey&#34;),没有ArrayList时,它不会直接返回答案。这是正确的方法吗?请帮助我。

1 个答案:

答案 0 :(得分:2)

在这两次遍历中,你要求两个不同的东西。第一个valueMap()要求将顶点转换为Map,因此您不希望在该循环中继续调用next()。只是做:

Map<String, List<Object>> m = traversalSource.V().has("request", "id_key", 114).
                                                  valueMap().next();        
System.out.println(m.get("status").get(0)); 
System.out.println(m.get("tree_id_key").get(0)); 
System.out.println(m.get("username").get(0)); 
System.out.println(m.get("tree_status").get(0));

请记住,我假设您的遍历总是返回一个顶点...如果不是这样,则说明其他情况。

在你执行values()的第二次遍历中,你要求Gremlin转换抓取该顶点上那些特定属性的值并将它们流出来,因此你需要迭代多次调用next。

请注意,通常不建议返回整个顶点对象。它有点类似于SQL中的SELECT * FROM table。最好只获取你想要获得的字段,然后摆脱Map<String, List<Object>>的丑陋多属性问题:

Map<String, Object> m = traversalSource.V().has("request", "id_key", 114).
                                            project('s`,'tik', 'u', 'ts').
                                              by('status').
                                              by('tree_id_key').
                                              by('username')
                                              by('tree_status').
                                            next();        
System.out.println(m.get("s")); 
System.out.println(m.get("tik")); 
System.out.println(m.get("u")); 
System.out.println(m.get("ts"));